-         

Ergebnis 1 bis 4 von 4

Thema: UART nur beim debuggen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35

    UART nur beim debuggen

    Anzeige

    Hallo,
    ich bin Anfänger in GCC, und nutze AVRStudio 4.12 und GCC.
    Ich habe einen ATmega32 und dort in den Fuses "int. RC Osc. 4Mhz" eingestellt.
    Zum debuggen habe ich ein JTAG interface.

    Nun versuche ich seit Tagen über das UART, Zeichen an den PC zu senden, was mir leider nicht gelingt.

    Es kommen, wenn überhaupt, nur krüptische Zeichen an, aber nicht das was ich abschicke.

    Interessant ist, daß wenn ich den µC mit dem JTAG debugge, und dann den Code mit F11 im Einzelsatz durchgehe und das Zeichen an das UDR Register übergebe, klappt es ! Aber eben nur im Einzelsatz !!!

    Ich kann mir nicht erklären ob und was falsch ist.
    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <avr/iom32.h>
    #include <avr/interrupt.h> 
    #include <avr/signal.h>
    
    
    
    #ifndef F_CPU
    #define F_CPU 4000000           /* Oszillator-Frequenz in Hz */
    #endif
    
    #define UART_BAUD_RATE 9600
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)
    
    
    uint8_t foo;
    
    int main(void)
    {
     
      foo=PINA;   // Eingänge an PortB lesen
    
      DDRB=255;  //Port A  als Ausgang
      PORTB=foo;  // Ausgang setzten
    
      DDRD=(1<<PD5);
    
      TCCR1A=(1<<WGM11)|(1<<WGM10)|(1<<COM1A1);  //  nicht -invertierender 10 Bit PWM 
      TCCR1B=(1<<CS10);  //|(1<<CS12) ;          //  Timer Prescaler
      OCR1A=100;  // Y Ausgabegrösse
    
    
    //Initialization of UART
     UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
     UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
    
    
    
    
     UCSRB |= (1<<TXEN);   // UART TX einschalten
     UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron(8N1)
    
    
    
    
      while (!(UCSRA & (1<<UDRE)));  // werte bis senden möglich
      {
        UDR = 'x';
    
       }
     
    
    
     main();
     return 1;
    }
    Vielleicht hat jemand nen Tipp für mich.....
    Viele Grüsse
    Wer nur das macht was er schon kann, bleibt immer das was er schon ist.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Was mir auffällt:
    • UART_BAUD_RATE ist Argument des Makro und Makro selbst! Keine Ahnung, was das macht... Ausserdem ist F_OSC überflüssig. besser (zumindest klarer) ist
      #define UART_BAUD_CALC(baud) ((F_CPU)/((baud)*16L)-1)
    • Das #ifndef F_CPU würd ich rausnehemen. F_CPU sollte an einer Stelle definiert sein. Bei mehreren Definitionen gibt es dann eine Warnung, und man kann alles so bauen, daß es nur noch _ein_ zentrales Define gibt. Auf unterschiedliche Werte zu definen wäre auch Käse.
    • Der Kommentar zu PortB und die Befehle passen nicht.
    • Ist Port TxD auf OUT?
    • Bein Setzen von UCSRX besser = anstatt |=
    • Beim Setzen von UCSZX aufspalten in UCSZ0 und UCSZ1. So gehst du implizit davon aus, daß die Bits nebeneinander stehen.
    • Nimm die {} hinter dem while weg. Das mutet an, als gehöre der Block zum while (was er nicht tut!)
    • main() wird niemals nicht aufgerufen! Wenn du das tust, initialisierst du den UART neu, während mit Sicherheit eine Sendung im Gange ist. Beim Debuggen ist die Sendung allerdings schon fertig, daher tritt der Fehler dort nicht zu Tage.
    Disclaimer: none. Sue me.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.10.2005
    Ort
    Aalen
    Beiträge
    35
    main() wird niemals nicht aufgerufen! Wenn du das tust, initialisierst du den UART neu, während mit Sicherheit eine Sendung im Gange ist. Beim Debuggen ist die Sendung allerdings schon fertig, daher tritt der Fehler dort nicht zu Tage.
    OK, vielen Dank,
    das erklärt mir einiges.

    wenn ich main() aber nicht nochmal aufrufe, wird es doch nur einmal abgearbeitet,-oder.

    Es soll doch eine Endlosschleife sein, wie wird diese denn dann realisiert?
    Wer nur das macht was er schon kann, bleibt immer das was er schon ist.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    -- du verlässt main und landest in einer Endlosschleife (kommst dann aber nicht mehr raus, in dem Fall müssten Interrupts die Arbeit machen)
    -- Endlosschleifen:
    Code:
    while (1);
    
    while (1)
    {}
    
    for (;;);
    
    for (;;) 
    {}
    
    blah: goto blah;

    [/code]
    Disclaimer: none. Sue me.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •