mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ret problem


Autor: schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schorsch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schorsch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
sorry dass der code net vollständig war.

hier alles zusammen nochmal

Autor: schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> man muss über das tastenfeld

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: schorsch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)

Autor: schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ karl heinz:

es ist ein 4x20 LCD

Autor: schorsch (Gast)
Datum:

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

Autor: schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok geht doch net, hab mich geirrt

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.