Hallo, habe völlig unerklärliche Fehlfunktionen auf einem Atmega1284P. Das Programm funktioniert im Simulator und auch im Atmega funktioniert es "meistens". Aus irgendwelchen Gründen schmeißt der Atmega1284 Registerwerte weg oder liest bzw. schreibt falsche Wert vom/zum Ram. Hier ein Beispiel. Ich habe einen Encoder. Nach der Falneknerkennung wird zum Zählen der absoluten Position gesprungen. Das ist ne einfach Subtraktion eines Doppelwortes. Nun das Unerklärliche. Die obere Version errechnet wild springende Werte, die untere zählt ganz exakt. Beide Codes werden direkt nacheinander in der ISR abgearbeitet. Das gleiche ist auch bei der Addition der Fall. Und damit das noch nicht genug ist, wenn ich die Adressen tausche, dann funktionieren beide Varianten. FEHLERHAFTE DEKLARATION .equ SrvAbsolutePos = 0x0508 ;4-Byte Incremental Encoder Position .equ SrvAbsolutePos1 = 0x050C ;4-Byte Incremental Encoder Position FEHLERFREIE DEKLARATION .equ SrvAbsolutePos = 0x050C ;4-Byte Incremental Encoder Position .equ SrvAbsolutePos1 = 0x0508 ;4-Byte Incremental Encoder Position DIESER CODE FUNKTIONIERT NICHT! ldi r16, 1 ldi r17, 0 lds XL, SrvAbsolutePos+0 lds XH, SrvAbsolutePos+1 lds YL, SrvAbsolutePos+3 lds YH, SrvAbsolutePos+4 sub XL, r17 sbc XH, r17 sbc YL, r17 sbc YH, r17 sts SrvAbsolutePos+0, XL sts SrvAbsolutePos+1, XH sts SrvAbsolutePos+2, YL sts SrvAbsolutePos+3, YH DIESER CODE FUNKTIONIERT! ldi r17, 1 lds r16, SrvAbsolutePos1+0 sub r16, r17 sts SrvAbsolutePos1+0, r16 ldi r17, 0 lds r16, SrvAbsolutePos1+1 sbc r16, r17 sts SrvAbsolutePos1+1, r16 ldi r17, 0 lds r16, SrvAbsolutePos1+2 sbc r16, r17 sts SrvAbsolutePos1+2, r16 ldi r17, 0 lds r16, SrvAbsolutePos1+3 sbc r16, r17 sts SrvAbsolutePos1+3, r16 Irendjemand ne Idee was da los ist? Vielleicht Fuse Bits? Wäre für jede Anregung dankbar.
Hi >ldi r17, 0 ... > sub XL, r17 <- > sbc XH, r17 > sbc YL, r17 > sbc YH, r17 Was soll da passieren? Soll bestimmt 'sub XL, r16' heißen. MfG Spess
Ja hast Recht, das soll R16 heißen. Allerdings hatte ich den Tippfehler im Programm schon korregiert, aber das ändert am Problem nichts. Ich glaube immernoch das es mit den Fuses wegen dem externen 20Mhz Resonator zu tun hat. Zumindest reagiert der Controller auf Fuse Änderungen, wenn auch nicht mit einem besseren Resultat sondern meist einem noch schlechteren Ergebnis. Hoffe jemand hat noch ne Idee...
Hi >Ich glaube immernoch das es mit den Fuses wegen dem externen 20Mhz >Resonator zu tun hat. Aber nicht bei der Rechnerei. Der Fehler liegt mit Sicherheit an anderer Stelle. MfG Spess
Gad Zinkler schrieb: > Ich glaube immernoch das es mit den Fuses wegen dem externen 20Mhz > Resonator zu tun hat. Zumindest reagiert der Controller auf Fuse > Änderungen, wenn auch nicht mit einem besseren Resultat sondern meist > einem noch schlechteren Ergebnis. Mhm. Betreibst Du den Mega128p auch innerhalb der Spezifikation? Beobachte doch mal die Spannung der Stromversorgung mit einem Oszi. Bei 20MHz kann alles < 4.5V zu einem Problem werden... Viele Grüße, Simon
Gad Zinkler schrieb: > Hoffe jemand hat noch ne Idee... Poste einen kompletten testbaren Code als Anhang. Und vor allem einen, den Du wirklich getestet hast! Peter
Ich betreibe ihn bei 5V. Würde zuerst auch mal nach solchen Ursachen suchen. ABER: 1. Es sind 2 Atmega auf der Platine drauf und der andere funktioniert einwandfrei. 2. Vorher war an dieser Stelle ein Atmega644 drauf und es ging auch alles. Erst als ich auf den Atmega1284P gewechselt habe, gingen diese mysteriösen Probleme los. Das fing gleich damit an, das mein TWI-Modul nicht mehr funktioniert hat, welches aber erfolgreich im anderen Controller läuft und auch auf diesem Controllerplatz funktioniert hat, solange der Atmega644 drin war. Deshalb schließe ich vorerst Hardware aus, zumindest was die Hardware außerhalb des ATmega1284 angeht. Vielleicht ist ja der Atmega1284 defekt. Hatte diesbezüglich auch schon an Atmel Support geschrieben, aber leider ohne jegliche Reaktion. Im Anhang ist der Code für meinen Inkremental Encoder. Eigentlich ganz simpe was da passiert. Oben wird initialisiert. Das wird nur einmal vom Reset aus aufgerufen. Dann kommt ein Timer Interrupt, welcher die Pulszeiten des Encoders mißt. Unten dann die Zählroutine zur Richtungs - und Positionsermittlung. Diese wird vom Kanal A im INT0 aufgerufen. Der Aufruf selber funktioniert immer aver die Werte springen bei der Zählerei. Es wird ja immer nur 1 addiert oder subtraiert. Aber das Ergebnis springt im Tausender Bereich. Das heißt, eines der höheren Bytes wird fälschlicherweise verändert. Im Anhang ist noch ein Screenshot vom Ergebnis. Man sieht das der untere (richtige) Wert sich gerade um 1° verändert hat. Der obere Wert müsste eigentlich den gleichen Wert haben...
PS: Im Anhang ist nur die ISR drin, nicht die Initialisierung und der Timer. Aber die sind ja auch kein Problem, da der Controller auf die Signale reagiert, nur eben falsch rechnet.
lds XL, SrvAbsolutePos+0 lds XH, SrvAbsolutePos+1 lds YL, SrvAbsolutePos+3 lds YH, SrvAbsolutePos+4 also srvabsolutepos+2 wird nie geladen und +4 wird wohl immer null sein, ich sehe nicht, dass es jemals beschrieben wird grüße stronzo
Oh mein Gott, wie konnte ich das übersehen. Anscheinend habe ich den Wald vor lauter Bäumen nicht gesehen. DANKE!!! Es funktioniert jetzt :-)
Ich bin zwar spät mit meienr Antwort, aber der ATmega1284P geht nicht mit 20MHz!! Siehe: http://www.seanet.com/~karllunt/1284pmemprob.html Der ATmega1284 sollte gehen, ist aber nicht lieferbar, schade.
Hi >Ich bin zwar spät mit meienr Antwort, aber der ATmega1284P geht nicht >mit 20MHz!! Dann sollte die Antwort wenigstens richtig sein: http://www.atmel.com/dyn/resources/prod_documents/doc8272.pdf MfG Spess
>Ich bin zwar spät mit meienr Antwort, aber der ATmega1284P geht nicht >mit 20MHz!! My 1284P runs 25MHZ rock stable. Having an external clock source (xtals>25MHz are 3rd overtone mostly) it would go even higher, I am sure. Pito
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.