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
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
Also einbinden der anderen drei Dateien geht leider nicht aufeinmal - deshalb hier die Links: http://www.abi2002ontour.de/extern/main.asm http://www.abi2002ontour.de/extern/convert_bin-ascii_v1.0.asm http://www.abi2002ontour.de/extern/delay_v1.0.1.asm http://www.abi2002ontour.de/extern/lcd-routines_v2.1.asm
@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
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
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
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
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!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.