-
        

Ergebnis 1 bis 5 von 5

Thema: Atmega 644P Uart0 StopBit Problem

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265

    Atmega 644P Uart0 StopBit Problem

    Anzeige

    Wenn ich das Datenblatt des Atmega 644P richtig verstanden habe sollte folgender Code doch bewirken, dass der UART0 mit 8 Datenbits und 1 Stoppbit arbeitet

    UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
    Code:
    Jetzt habe ich allerdings durch ausprobieren herausgefunden, dass der UART0 immer noch mit 2 Stoppbits arbeitet obwohl USBS0 nicht gesetzt wird. 
    Hat jemand schon mal das Problem gehabt bzw. weis wie man es lösen kann ?

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Mahlzeit!

    UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
    Sagt ihm 8 Datenbits, da gehört aber noch UCSZ02 im UCSR0B dazu.
    Evtl. setzt du den ja auch und das 9. Datenbit sieht aus wie ein Stopbit?
    Oder schreibst im UCSR0C ja doch noch irgendwo anders rum?

    Das hier reichte für mich immer für GPS empfangen und in einen FT232 schreiben (asynchron mit 8N1):

    Code:
    	// --- baud rate 4800 bps (bei 14,746MHz)
    	unsigned int baud = 191;
    	UBRR0H = (unsigned char) (baud>>8);
    	UBRR0L = (unsigned char) baud;
    
    	// --- UCSRB/C
    	UCSR0B = (1 << RXEN0) | (1 << RXCIE0) | (1 << TXEN0);
    	UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Also ich habe 2 Init Funktionen, einmal für Usart0 und einmal für Usart1
    Code:
    void Init_Usart0()
    {    
    
    	UBRR0H = ((F_CPU +BAUD*8 )/ (BAUD * 16L) - 1) >>8;
    	UBRR0L = ((F_CPU +BAUD*8 )/ (BAUD * 16L) - 1) & 0xFF;
    
    	UCSR0B = (1<<TXEN0) | (1<<RXEN0) | (1<<RXCIE0);
        UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
    
    }
    void Init_Usart1()
    {
    	UBRR1H = ((F_CPU +BAUD1*8 )/ (BAUD1 * 16L) - 1) >>8;
    	UBRR1L = ((F_CPU +BAUD1*8 )/ (BAUD1 * 16L) - 1) & 0xFF;
    	
    	UCSR1B = (1<<RXEN1)|(1<<TXEN1) | (1<<RXCIE1);
    	UCSR1C = (1<<UCSZ10) | (1<<UCSZ11) ;
    }
    Wenn ich jetzt die Kommunikation über Usart1 mache, muss ich auf PC seite einstellen 8 Datenbits und 1 Stopbit damit die Daten sauer ankommen
    Wenn ich die kommunikation über Usart0 mache, muss ich am Pc 8 Datenbits und 2 Stopbits einstellen damit die Daten sauber ankommen

    Sollte ja eig nicht sein, da ich beide Usarts gleich konfiguriert habe

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Hast du mal nen anderen Controller versucht?
    Ansonsten kann ich mir wirklich nur vorstellen, dass du irgendwo anders im code in einem config register rumschreibst. Ein aus dem Ruder gelaufener Pointer oder sowas.

    Hab noch mal nachgesehen, in einem anderen Projekt sende ich mit dieser Initialisierung an nem 644p über uasrt0 was an nen PC, 8N1.

    Viel Glück

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.265
    Ich hab meinen Code grad extra nach mal durchgeschaut...ich setz das Register wirklich nur in der Init Funktion. Dann liegts wohl am Controller. Leider hab ich grad keinen ersatz Controller da.

    Trotzdem vielen Dank

Berechtigungen

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