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
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 ?
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.
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
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)
Ä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!!
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?
Michael P. schrieb: > Änderung rückgängig machen hat leider nix gebracht, Was heißt das? Stimmen die Zeiten dann wieder?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.