4433 bleibt bei rcall stehen

Gast #88016
Tagchen zusammen,

ich beschäftige mich schon einige Zeit mit Assembler auf den
Controllern 1200, 8535 und Mega16 von Atmel. In der Regel klappt auch
das meiste, was ich so anstelle. Nun möchte ich einen 4433, der noch
hier rumliegt, unter anderem als Betriebsstundenzähler mit
gemultiplextem LED-Display einsetzen. Ich habe zwei Probleme, die im
Umgang mit anderen Controllern bisher nicht aufgetaucht sind:
bei meinem kurzen Testprogramm können keine Unterprogramme aufgerufen
werden, sondern es bleibt beim Befehl rcall stehen.
Im AVR-STUDIO 3.5 bleibt das Programm im Einzelstepmodus auch dort
hängen im Multistep läuft es jedoch korrekt.

und zweitens
wenn ich die Unterprogrammaufrufe weglasse oder durch entsprechenden
Code ersetze, läuft das Programm. Lasse ich am Ende des Programmes den
rjmp start-Befehl weg, dann läuft das Programm trotzdem in einer
Endlosschleife. Rausgefunden habe ich schon, dass es dann am Ende über
die Reset-Adresse wieder einspringt. Aber warum ? Was sind meine
Denkfehler ?

Ich weiss nicht mehr weiter und stehe kurz vor dem Entsorgen/Zerstören
des Controllers.
Mit einem Mega 8 wäre das sicher nicht passiert.

Stefan Kneller
Angehängte Dateien:
Gast
Die nicht funktionierenden Calls klingen nach einem falsch
initialisierten Stack.

Was soll das Programm denn am Ende machen?  Die CPU kann ja nicht
einfach ,,anhalten'', sondern sie führt stur einen Befehl nach dem
anderen aus.  Den Zustand ,,es gibt keinen Befehl mehr'' gibt's ja
nicht: irgendwas steht immer im ROM.  Der gelöschte ROM enthält das
Bitmuster 0xffff, das (undokumentierterweise) wie NOP behandelt wird.
Damit wird der ungelöschte ROM praktisch stillschweigend vom
Befehlszähler durchlaufen, bis Du wieder von vorn beginnst.

> Ich weiss nicht mehr weiter und stehe kurz vor dem
> Entsorgen/Zerstören des Controllers.

Vielleicht solltest Du lieber über einen Compiler nachdenken, der Dir
die Trivialfehler dieser Art vermeidet. ;-)
Gast
OK, dass der Controller nicht einfach an dem Punkt anhält, ab dem keine
weiteren befehle stehen und den gesamten FLASH-Speicherbereich
abarbeitet, leuchtet ein.
Aber warum springt er nicht in die Unterprogramme. Ich bin der festen
Meinung, den SP richtig initialisiert zu haben.

;***** Include if used on device with RAM

  ldi  temp,low(RAMEND)
  out  SP,temp

Für den Kleinen 4433 gibt es doch nur eine 8bit-Adresse, oder ?

Stefan K.
Gast
Die Initialisierung des Stacks wird durch das 'rjmp reset' einfach
übersprungen, Du mußt das Label 'Reset:' zwei Befehle höher setzen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.