mikrocontroller.net

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


Autor: Gad Zinkler (gad)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gad Zinkler (gad)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon Budig (nomis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gad Zinkler (gad)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Gad Zinkler (gad)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: fcb nur 2-2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gad Zinkler (gad)
Datum:

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

Autor: fcb nur 3-3 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gern geschehen!
Kommt ja in den besten Familien vor!

Autor: Rudolf Schmidt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

MfG Spess

Autor: pito (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.