ret problem

Gast #454011
Lesenswert?

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
Gast #454027
Lesenswert?

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!
#454058
Lesenswert?

> 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.
Gast #454086
Lesenswert?

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.
Gast #454299
Lesenswert?

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)
Angehängte Dateien:
Gast #454304
Lesenswert?


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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren