Plötzliches USART-Problem ATMega2560

OP #2663207
Lesenswert?
• ▲
▼
Hallo,

ich weiß, das Thema USART ist schon in hundert anderen Threads 
besprochen worden, allerdings hab ich mein Problem nirgends gefunden.

Ich nutze einen ATMega2560 (seit ungefähr 6 Monaten) an einem 16MHz 
Quartz. Die 16MHz liegen auch noch am Controller an. Die erste Aktion 
mit dem Controller war die Kommunikation einzurichten, damit man auch 
Ergebnisse sieht. Bis heute lief die Kommunikation einwandfrei...

Heute hab ich etwas am Programm (fernab vom USART und auch keine 
Optimierung) geändert und plötzlich funktionierte meine Kommunikation 
nicht mehr. Ich hab dann das Oszilloskop an die Schnittstelle gehangen 
und siehe da, anstatt der 104µs pro Bit benötigt der Controller jetzt 
1,4ms?? Nach Stunden sinnlosen spielens hab ich dann die definierte 
USART_BAUDRATE von 9600 auf 2400 runtergestellt, aus reiner 
Verzweiflung...
Das komische ist, hier benötige ich für ein Bit wiederrum die erwartete 
Zeit (417 µs). Also habe ich ein bisschen rumgespielt und festgestellt, 
dass alles was bis USART_BAUDRATE 3800 geht funktioniert und bei allem 
was drüber ist benötigt ein Bit 1,4 ms.

Ich bin echt am verzweifeln!! Hat irgendjemand schon einen ähnlichen 
Fall gehabt? Könnte ich irgendwas verstellt haben?? Die Fuses sind 
gleich, das war meine erste Vermutung....

Danke schonmal im Voraus!!

Gruß
Michael
OP #2663242
Lesenswert?
• ▲
▼
Sorry, ich benutze AVR Studio 5 (Version: 5.0.1163)

Die Baudrate berechne ich wie folgt:
1
#define F_CPU 16000000UL
2
#define USART_BAUDRATE 9600
3
#define BAUD_PRESCALE ((16000000UL / (USART_BAUDRATE * 16UL)) -1)

Mein Code ist leider nicht nur 30 Zeilen sonder erstreckt sich über 
mehrere .c und .h Files. Ich Poste mal die Auszüge mit 
USART-Einstellungen:
1
//******** UART1 init (PD2 -> RXD1, PD3 -> TXD1)
2
  UCSR1C |= (1<<UCSZ10) | (1<<UCSZ11); 
3
  UBRR1H = (BAUD_PRESCALE >> 8);
4
  UBRR1L = BAUD_PRESCALE;
5
  UCSR1B |= (1<<RXEN1) | (1<<TXEN1); 
6
  
7
// ******** UART2 init (PH0 ->RXD2, PH1 -> TXD2)            
8
  UCSR2C |= (1<<UCSZ20) | (1<<UCSZ21); 
9
  UBRR2H = (BAUD_PRESCALE >> 8);    
10
  UBRR2L = BAUD_PRESCALE;  
11
  UCSR2B |= (1<<RXEN2) | (1<<TXEN2);   
12
  UCSR2B |= (1<<RXCIE2);


Die Änderungen die ich eingefügt habe, betrafen eine Pinabfrage:
1
if (PING &(1 << PING0))
2
    {
3
      uf_pump.mono = 1;
4
      uf_pump.mono_count = 0;
5
    }    
6
  else if (uf_pump.controll != 0)  
7
    uf_pump.mono_count++;  
8
  else
9
    {
10
      uf_pump.mono_count = 0;
11
      uf_pump.mono = 0;  
12
    }
13
    
14
  if (uf_pump.controll == 0)
15
  {
16
    uf_pump.mono = 0;
17
  }

...und diese sollte nichts an den USART Einstellungen geändert haben.

Gruß
Michael
OP #2663537
Lesenswert?
• ▲
▼
Als ich die Änderung rückgängig gemacht habe funktionierte der USART 
trotzdem nicht...

Überlauf ist ein guter Punkt, aber wär es dann nicht egal ob ich für die 
Baudrate 9600 oder 2400 benutze?

Ich muss mal schauen, wenn ich mich nicht täusche müsste ich irgendwo 
auf einem Stick eine nicht allzu alte Version hab. Dann kann ich mal 
vergleichen wo der Unterschied ist.

Danke nochmal für die Ideen!

Gruß
Michael

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.