hi, programmiere in assembler einen atmega 16 mit avr studio als isp verwende ich ein jtagice mkII. nun hab ich das problem, dass mein programm bei einem aufruf eines unterprogramms bis zum return befehl durchläuft und dann zu einer falschen stelle zurückspringt. mein uc ist in einem gerät eingebaut, dass eine spannung steuert. wenn ich nun eine spannung eingebe, die eine 5 nach dem komma hat, springt dass unterprogramm falsch. bei allen anderen zahlen springt er richtig. wie kann das sein? weil eigentlich rufe ich dass up nach meiner eingabe auf. dann wird ja die rücksprungadresse auf den stack gelegt und beim return wird wieder die rücksprungadress vom stack geholt. wenn der uc falsch springt, springt er nach PC D4D. wie kann ich in avr studio die sprünge genau nachvollziehen? ich komm nur in den disassembler aber da seh ich ja eigentlich nicht bevor der uc zurückgesprungen ist, wohin er als nächstes geht? hoffe mir kann jemand helfen bin schon langsam am verzweifeln :-( gruß schorsch
Code wäre hilfreich. Was mir jetzt so einfällt wäre nur, dass du vielleicht daten die du per push auf den stack gelegt hast nicht wieder mit pop runterholst.
in up1 steht das programm, wo er bei ,50 falsch zurückspringt. bei anderen zahlen gehts. in tastenfeld.asm ist die routine, die die tasten abfrägt
Was mir auf Anhieb auffällt, ist, dass Du die Interrupts global freigibst, bevor Du den Stack-Pointer initialisierst. Das "sei" ist aber auch generell unsinnig, weil Du überhaupt keine Interrupt-Vektoren initialisiert hast. Deshalb: Lass es einfach weg!
> dann wird ja die rücksprungadresse auf den stack gelegt und beim return > wird wieder die rücksprungadress vom stack geholt. > wenn der uc falsch springt, springt er nach PC D4D. > wie kann ich in avr studio die sprünge genau nachvollziehen Beobachte im Simuator im I/O View den Stack. Über den simulierten prozessorspezifischen Dingen, gibt es in diesem Baum einen Abschnitt: Processor. Dort gibt es den Eintrag Stack Pointer und den Abschnitt Stack Monitor Dein Code ist hiernicht nachvollziehbar, da er nicht vollständig ist. Falls du dich entschliessen kannst den kompletten Code zu posten, dann gib auch Instruktionen mit, wie man das Teil bedienen muss, damit man auf den Fehler aufläuft.
aso noch was vergessen: man muss über das tastenfeld folgendes zb eingeben: 1,50E also die zahlen 1 dann komma dann 5 und 0 und zum bestätigen enter. ich weiß der code ist glaub ich net wirklich übersichtlich. aber das projekt hatte ich vor längerer zeit mal angefangen wo ich mit programmieren noch net so viel am hut hatte und halt alles querbeet gemacht hatte. (aber zum großteil funzt es freu) und jetzt wollt ich des halt mal fertig machen.
> man muss über das tastenfeld
Wir haben kein Tastenfeld.
Du musst dir was anderes ausdenken, wie wir das testen können.
Was ist das für ein LCD? Angeschlossen hab ichs im Hapsim mal richtig. Krieg auch eine Ausgabe. (PORTB: Daten, Rest an PORTC). Wieviele Zeilen/Spalten? Dein Keypad: Ist das ein Standard 4*4 Keypad, wie es zb. Hapsim kennt? Wie muss es angeschlossen werden?
also das tastenfeld ist ein 3spalten 4 zeilen tastenfeld. im anhang ein kleines bild wies angeschlossen ist. es hängt am port A, über die leitungen 0-3 werden abwechselnd auf high gelget und abgefragt wird über leitung 4-7 ob da auch ein high-signal an liegt oder nicht (wenn ja ist die taste gedrückt)
also hab jetzt rausgefunden, dass wenn ich die eingabe gemacht habe und in die routine sendebefehl springe, kann ich nichts mehr auf den stack legen. habe probiert die rücksprungadresse mit push auf den stack zu legen, aber bei überprüfung hab ich gesehen, dass er di adresse 0x0101 als rücksprungadresse hat und sich dies weder durch psuh noch durch einen rcall befehl überschreiben lässt. was könnte ich falsch machen? kann es vllt sein dass ich irgendwie den stack mit einem speichervorgang überschreibe? dürfte aber eigentlich nicht sein, da der stack ja vom ram ende nach vorne wächst und ich mit dem speichern ja bei der adresse 0x60 anfange. und push'en und pop'en tu ich eigentlich nicht.
ok mit push kann ich doch auf den stack legen. nur beim rcall legt er keine bzw eine falsche(0x0101) auf den stack
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.