Forum: Mikrocontroller und Digitale Elektronik ret problem


von schorsch (Gast)


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

von Hauke R. (lafkaschar) Benutzerseite


Lesenswert?

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.

von schorsch (Gast)


Angehängte Dateien:

Lesenswert?

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

von johnny.m (Gast)


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!

von Karl heinz B. (kbucheg)


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.

von schorsch (Gast)


Angehängte Dateien:

Lesenswert?

sorry dass der code net vollständig war.

hier alles zusammen nochmal

von schorsch (Gast)


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.

von Karl heinz B. (kbucheg)


Lesenswert?

> man muss über das tastenfeld

Wir haben kein Tastenfeld.
Du musst dir was anderes ausdenken, wie wir das testen können.

von Karl heinz B. (kbucheg)


Lesenswert?

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?

von schorsch (Gast)


Angehängte Dateien:

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)

von schorsch (Gast)


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.

von schorsch (Gast)


Lesenswert?

@ karl heinz:

es ist ein 4x20 LCD

von schorsch (Gast)


Lesenswert?

ok mit push kann ich doch auf den stack legen.
nur beim rcall legt er keine bzw eine falsche(0x0101) auf den stack

von schorsch (Gast)


Lesenswert?

ok geht doch net, hab mich geirrt

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.