-         

Ergebnis 1 bis 9 von 9

Thema: USART Initialization ATmega644 8MHz

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.03.2011
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    6

    USART Initialization ATmega644 8MHz

    Anzeige

    Hallo

    Ich versuche schon seit ner weile meinen AVR zu initialisieren, dass Problem mein AVR Studio das mit dem winavr-gcc arbeitet findet den 'UBRRH0' ausdruck nicht ich vermute das mir eine include Datei fehlt.
    Ich habe mich ganz an das Datenblatt gehalten.

    Code:
    /* 
      UART-Init: 
    Berechnung des Wertes für das Baudratenregister 
    aus Taktrate und gewünschter Baudrate
    */
     
    #ifndef F_CPU
    
    #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
    #define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                             // Ohne ergeben sich unten Fehler in der Berechnung
    #endif
     
    #define BAUD 9600UL      // Baudrate
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
    #endif 
    
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    
    
    
    void USART_Init( unsigned int baud )
    {
    /* Set baud rate */
    UBRRH0 = (unsigned char)(baud>>8);
    UBRRL0 = (unsigned char)baud;
    /* Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 2stop bit */
    UCSR0C = (1<<USBS0)|(3<<UCSZ00);
    }
    
    int main (void) {
    
    USART_Init() ;
    
    
    // bei neueren AVRs steht der Status in UCSRA/UCSR0A/UCSR1A, hier z.&nbsp;B. fuer ATmega16:
        while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
        {
        }
     
        UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
    
     }
    Und das Resultat ist,

    Code:
    Build started 19.3.2011 at 15:34:49
    avr-gcc  -mmcu=atmega644 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT test.o -MF dep/test.o.d  -c  ../test.c
    ../test.c:9:2: warning: #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
    ../test.c: In function 'USART_Init':
    ../test.c:33: error: 'UBRRH0' undeclared (first use in this function)
    ../test.c:33: error: (Each undeclared identifier is reported only once
    ../test.c:33: error: for each function it appears in.)
    ../test.c:34: error: 'UBRRL0' undeclared (first use in this function)
    ../test.c: In function 'main':
    ../test.c:43: error: too few arguments to function 'USART_Init'
    make: *** [test.o] Fehler 1
    Build failed with 5 errors and 1 warnings...
    Ich weis das Es irgendein einfacher Fehler ist nur ich find in nicht.
    Danke.

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Hallo,
    die Register heißen ein bisschen anders:
    Zitat Zitat von Datenblatt
    UBRRnL and UBRRnH – USART Baud Rate Registers
    Du musst also UBRR0L und UBRR0H schreiben, also einfach die Null und den Buchstaben vertauschen.
    Beim Aufruf von USART_Init übergibst du keine Baudrate.
    Code:
    USART_Init( Hier muss eine Zahl stehen);
    Das war's auch schon
    Grüße, Bernhard

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    18.03.2011
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    6
    Ich habe das Programm geändert, wie du es vorgeschlagen hast und ich konnte es kompilieren, warum steht das in dem Datenblatt falsch drin?

    Jetzt hab ich nur das Problem, das mit dem Hyperterm Terminal nichts vom Problem auf den PC übertragen wird, das heißt ich sollte dort ein x lesen können dort erscheint aber nichts mit HTerm das ich auf Terminals Gefunden habe bekomme ich nur solche Zeichen "<\0><\0>" Zumindest bekomme ich was (-;

    Ich möchte nur sicher stellen das mein progam funktioniert und ich es für weitere Experimente einsetzen kann.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Hmm, Du hast im µC 8N2 Data=8, Parity = None Stopbits =2 eingestellt, ist das auch bei Hyperterm genau so eingestellt?

    Üblich ist eher 8N1 und in Hyperterm "Flusskontrolle" auf "Keine" sollte auch eingetragen sein!

    Gruß Richard

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    18.03.2011
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    6
    Danke für die hinweise, ich habe jetzt mein Programm geändert und hab's so eingestellt, wie ihr es empfohlen habt. Hier mein Code

    Code:
    /* 
      UART-Init: 
    Berechnung des Wertes für das Baudratenregister 
    aus Taktrate und gewünschter Baudrate
    */
     
    #ifndef F_CPU
    
    #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 8000000"
    #define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                             // Ohne ergeben sich unten Fehler in der Berechnung
    #endif
     
    #define BAUD 9600UL      // Baudrate
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
     
    #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
      #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
    #endif 
    
    #include <avr/io.h> 
    #include <avr/interrupt.h>
    
    
    
    void USART_Init( unsigned int baud )
    {
    /* Set baud rate */
    UBRR0H = (unsigned char)(baud>>8);
    UBRR0L = (unsigned char)baud;
    /* Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 1stop bit */
    UCSR0C = 3<<UCSZ00;
    }
    
    int main (void) {
    
    USART_Init( BAUD_REAL ) ;
    
    
    
        while (!(UCSR0A & (1<<UDRE0)))  /* warten bis Senden moeglich                   */
        {
        }
     
        UDR0 = 'x';                    /* schreibt das Zeichen x auf die Schnittstelle */
    
     }
    Im Endeffekt hat sich nichts geändert als Hardware verwende ich ein stk500 und ein USB to RS232 Adapter.

    Danke für eure Hilfe
    Geändert von AT90S1200 (20.03.2011 um 14:09 Uhr)

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    26
    Beiträge
    1.192
    Hallo,
    sind GND von Board und PC durchverbunden? Ich gehe zwar schon davon aus, aber du könntest nochmal kurz mit einem Durchgangsprüfer nachmessen.
    Hast du den richtigen Stecker genommen? Das STK500 hat zwei davon!
    Und ich vermute, dass hier
    Code:
    USART_Init( BAUD_REAL ) ;
    wohl eher
    Code:
    USART_Init( BAUD_VAL ) ;
    stehen sollte.
    Du kannst auch ein anderes Terminal ausprobieren. Ich verwende dieses hier: http://www.elektronik-labor.de/RS232/2010Terminal.html , das funktioniert auch über einen USB-Seriell-Wandler.

    Grüße, Bernhard

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.03.2011
    Ort
    Stuttgart
    Alter
    32
    Beiträge
    6
    Zitat Zitat von BMS Beitrag anzeigen
    wohl eher
    Code:
    USART_Init( BAUD_VAL ) ;
    stehen sollte.
    Das ist es, fielen Dank Ja es geht

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    37
    Beiträge
    61
    Hallo zusammen,

    ich sitze gerade vor einem ähnlichen Problem und hab mir den hier geposteten Code angesehen. Wo ist hier "BAUD_VAL" definiert? Bei mir hängt, das ganze Prog, wenn ich die Initialisierung aufrufe.

    Grüße

    Rainer
    Wenns brennt, dann brennts....

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    24.06.2007
    Alter
    37
    Beiträge
    61
    So jetzt hab ichs hinbekommen. Es ist die "UBRR_VAL" die übertragen werden muss.
    Wenns brennt, dann brennts....

Berechtigungen

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