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


von Andy K. (sokar)


Angehängte Dateien:

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

von (geloescht) (Gast)


Lesenswert?

(Dieser Beitrag wurde geloescht)

von Otto (Gast)


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


von Andy K. (sokar)


Lesenswert?


von Andy K. (sokar)


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

von Andy K. (sokar)


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

von Otto (Gast)


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

von Stefan K. (_sk_)


Lesenswert?

1
   rcall Bin2ToAsc5
2
   ldi temp2,5
3
   rcall lcd_clear
4
   LCD_Ausgabe:
5
   ld temp, Z+
6
   rcall lcd_data
7
   dec temp2
8
   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

von Andy K. (sokar)


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!

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


Lesenswert?

Ooops.
Diesmal hat mich Stefan aber kräftig abgehängt.

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.