mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem: RESET wenn AVR bis 203 gezählt hat???


Autor: Andy Koch (sokar)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, zusammen. Ich bin am verzweifeln und hoffe von euch kann mir wer 
helfen. Also ich habe heute und gestern ein Programm geschrieben das mir 
von einem "Lochscheiben-Encoder" die Schritte ausließt - per Interrupts. 
Diese werden dann auf einem Display ausgegeben. Hat anfangs auch alles 
wunderbar funktioniert. Bis ich irgendwann festgestellt habe der 
Controller zählt immer bis 203 und dann gibts einen RESET.

Nunja bisher habe ich versucht das Programm einzugrenzen um den Fehler 
zu finden. Interrupts sind jetzt völlig raus. Der Controller zählt nur 
in einem Register, wandelt diesen Wert dann in ASCII um und gibt ihn auf 
dem LCD aus.

...das Problem ist immernoch das selbe der kann nur bis 203 zählen 
heul. Und weils noch lustiger wird. Er kann auch höher zählen! Also 
von 100 bis 303 oder auch von 200 bis 403. Aber leider immer nur 203.

Ich hänge jetzt mal den Code an. Durch die LCD Routinen und ASCII 
Umwandlung sinds einige Dateien. Ich hab die Hoffnung jemand findet den 
Fehler und kann mir helfen.

Danke euch schonmal

Autor: (geloescht) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Dieser Beitrag wurde geloescht)

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andy,

irgendwie verstehe ich nicht ganz:

1. wo hier der Encoder eingebunden ist.....

;Init
   ldi shortL, 100
   clr shortH
   ;sei

2. worauf Du hier vergleichst (beim ersten mal 100, dann 255)

   inc shortL

3.warum "inc" und nicht "dec"

   brne sprung5000

3. weshalb "shortL" dann hier nicht auf "100" gesetzt wird

   inc shortH
   sprung5000:

Gruss Otto


Autor: Andy Koch (sokar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Andy Koch (sokar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Otto zu deinen Fragen:
1.    rcall Bin2ToAsc5 - damit wird später die Binär ASCII Umwandlung 
auf gerufen
2. ich erhöhe die zahl einfach bei jeden durchlauf um 1 von 100 
angefangen wenn der controller bei 303 angekommen ist gibts einen reset 
- das seh ich am display durch die darstellung vom 'X' welches ja nur in 
der initalisierung also vor der main schleife vorkommt --> reset 
"passiert"
3.naja shortL ist ja schon auf 100 und soll von dort hochzählen shortH 
setz ich auch 0 und wird um eins erhöht wenn shortL=0 ist (wenn das zero 
flag geschrieben wird)

hoff ich konnte mich ein bißchen erklären

Autor: Andy Koch (sokar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
watchdog sollte eigentlich aus sein. außerdem passieren die resets 
völlig zeitunabhängig. als ich ihn noch mit interrupts und der 
lochscheibe betrieben habe, habe ich ihn auch mal bei 202 paar minuten 
stehen lassen und dann bei weiterdrehen -- RESET

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andy,

die Logik erschliesst sich mir nicht:

wenn shortL mit 100 initialisiert wird,
weahalb erhöhst Du dann shortL

und fragst auf "156" ab
( 100+156 = 256 brne nicht mehr erfüllt)

Gruss Otto

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
   rcall Bin2ToAsc5
   ldi temp2,5
   rcall lcd_clear
   LCD_Ausgabe:
   ld temp, Z+
   rcall lcd_data
   dec temp2
   brne LCD_Ausgabe

Du erhöhst den Pointer Z kontinuierlich.
In der Routine Bin2ToAsc5 wird auf den RAM-Bereich, auf den Z zeigt, 
geschrieben. Da Z in main immer um 1 inkrementiert wird (und nie 
zurückgesetzt), wird in Bin2ToAsc5 irgendwann der Stack überschrieben.

Das ist übrigens ein typischer Assembler-Fehler. Globale Variablen zur 
Parameter-Übergabe und am Ende ein Stackproblem. Dein Code ist ein gutes 
Beispiel dafür, warum man in C schneller und sicherer ist ;-)

Viele Grüße, Stefan

Autor: Andy Koch (sokar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo geil


SUPER SACHE!!! Vielen Dank Stefan

Eigentlich völlig logisch, aber daran hab ich überhaupt nicht gedacht!!! 
Ja das mag sein C ist schneller und sicherer. Aber ich habe vor zwei 
Wochen mit Assembler angefangen und ich finds eigentlich echt cool. Weil 
man sehr nahe am Chip arbeitet und auch mehr vom Chip-Innenleben wissen 
muss - das gefällt mir eigentlich!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt nicht komplett durchgesteppt (die Warteschleifen
nerven in der Simulation), aber ich denke ich hab deinen Fehler.

Dein Z Pointer wird immer grösser. In Bin2ToAsc5 hast du
brav darauf geachtet den Z Pointer zum Schluss wieder
zurückzusetzen.
Allerdings hast du in der LCD_Ausgabe Schleife darauf vergessen.
Der Z-Pointer wird immer größer, die Bin2ToAsc5 schreibt sich
dadurch schön langsam durch den Speicher und irgendwann
hat der Z Pointer dann den Stack erreicht.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ooops.
Diesmal hat mich Stefan aber kräftig abgehängt.

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.