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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren