Forum: Mikrocontroller und Digitale Elektronik Atmega 1284P unerklärliche Fehlfunktionen


von Gad Z. (gad)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Gad Z. (gad)


Lesenswert?

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...

von spess53 (Gast)


Lesenswert?

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

von Simon B. (nomis)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Gad Z. (gad)


Angehängte Dateien:

Lesenswert?

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...

von Gad Z. (gad)


Lesenswert?

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.

von fcb nur 2-2 (Gast)


Lesenswert?

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

von Gad Z. (gad)


Lesenswert?

Oh mein Gott, wie konnte ich das übersehen.
Anscheinend habe ich den Wald vor lauter Bäumen nicht gesehen.
DANKE!!! Es funktioniert jetzt :-)

von fcb nur 3-3 (Gast)


Lesenswert?

Gern geschehen!
Kommt ja in den besten Familien vor!

von Rudolf Schmidt (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von pito (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.