Forum: Mikrocontroller und Digitale Elektronik Plötzliches USART-Problem ATMega2560


von Michael P. (mpernpei)


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

von Uwe (Gast)


Lesenswert?

Was benutzt du denn für ein Entwicklungstool ? Ich nehme mal an es ist 
ein Softwareproblem und nicht die Hardware. Oder progst du in Assembler 
und berechnest die Baudrate manuel ?

von Hubert G. (hubertg)


Lesenswert?

Ohne das du deine Code herzeigst und sagst was du geändert hast, wird 
dir niemand sagen können was der Fehler ist.
Es sei denn du kannst mit dem Hinweis das der Fehler in Zeile 42 ist, 
etwas anfangen.

von Michael P. (mpernpei)


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

von Karl H. (kbuchegg)


Lesenswert?

Dann würde ich vorschlagen du machst die Änderung mal rückgängig und 
siehst nach obs dann wieder geht.
Wenns dann immer noch nicht geht, dann hast du noch irgendwas anderes 
verändert, was dir entfallen ist. (nicht lachen: sowas kommt vor)

von Michael P. (mpernpei)


Lesenswert?

Änderung rückgängig machen hat leider nix gebracht, hab ich schon 
versucht....

Ich bin auch schon ab Grübeln, was ich eventuell "mal schnell so" 
geändert haben könnte....mir fällt aber nix ein...

Zum Lachen ist mir grad gar nicht....

Bin weiterhin für alles dankbar!!

von Frank W. (Firma: DB1FW) (frankw) Benutzerseite


Lesenswert?

Vielleicht ein bisschen off topic - aber solche Sachen sind für mich ein 
Grund in meinen Projekte in ein SVN zu verwenden. da kann man schön 
sehen was man 'aus versehen' kaput gemacht hat.

Anderer Ansatz.
Wenn man an Stelle A was ändert und plötzlich B nicht mehr geht - Stack 
oder RAM überlauf?

von Karl H. (kbuchegg)


Lesenswert?

Michael P. schrieb:
> Änderung rückgängig machen hat leider nix gebracht,

Was heißt das?
Stimmen die Zeiten dann wieder?

von Michael P. (mpernpei)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.