Was macht ein µC mit unbekannten Befehlen

Gast #344722
Lesenswert?

Hallo Leute!

Ich habe mal eine Frage:
Wenn man einen µC mit internem Flash verwendet, dann ist dieses Flash
am Anfang leer und in jeder Zelle steht der Hexadezimalwert 0xFF.

Wenn man nun in diesem leeren Zustand Spannung anlegt, läuft dann der
Kontroller (Z.B. 8-Bit-AVR) mit seinem Programmcounter, Flashzelle für
Flashzelle weiter oder bleibt er schon auf Adresse 0 stehen?
Also mit anderen Worten, was passiert im Kontroller, wenn das Flash
leer ist und Spannung angelegt wird?
Dies würde mich einfach interessieren.

Danke für eure Antworten.

Gruß, Martin
Gast #344725
Lesenswert?

Wenn es den Befehl wirklich gibt würde ich von der Logik her sagen
"NOP". Ich hoffe ich schreibe jetzt hier keinen Blösinn.

Ich habe jetzt hier ein ATMEGA128-Datenblatt.
Es werden zwar am Schluss die einzelnen Befehle beschrieben, aber deren
HEX-Code ist nicht angegeben.

Gibt es hierfür ein spezielles Datenblatt?

Gruß, Martin
#344730
Lesenswert?

Ist eber eine interesannte Frage.

Es gibt nämlich keinen Opcode 0xFFFF
(zumindest hab ich im Instruction set manual nichts
gefunden.

Das beste war noch:

SBRS - Skip if Bit in Register is Set

OpCode
   1111 111r rrrr 0bbb

Der 0-er da vor der Bitnummer passt nicht. ansonsten
wäre es ein
   SBRS 31, 7

Die Frage ist dann allerdings: was macht die CPU
wirklich?
Gast #344731
Lesenswert?

Danke Johnny.m!

Habs schon gefunden.
Der NOP-Befehl schlägt mit: 0000 0000 0000 0000 zu Buche.
Ich kann leider keinen Befehl mit 1111 1111 1111 1111 finden.

Ich schau mir die Befehle nochmals durch.

Gruß, Martin
Gast #344733
Lesenswert?

Hallo,

alle nicht definierten Op-Codes sind "illegale" OP-Codes (Z80- und
6510-Programmierer werden sich erinnern... ;-)).
Was genau passiert, hängt von Befehlsdekoder ab, es passiert
normalerweise durchaus etwas wiederholbares, das Ergebnis ist oft
einfach nutzlos.

Einfach mal $FFFF als OP-Code Programmieren, mit einem IRQ-Trick dafür
sorgen, daß genau dieser eine Befehl abgearbeitet wird und in der
IRQ-Routine alle Registerwerte ausgeben lassen und sehen, was
passiert...
Könnte durchaus z.B. ein IN r0,PORTB + zusätzlichem Jump (Z)
rauskommen, aber nur wenn Z = 0 und C =1 ist oder so.

Gruß aus Berlin
Michael
Gast #344735
Lesenswert?

Der AVR läuft mit seinem Programmcounter einfach weiter, wenn er auf
$FFFF trifft. Das haben wir hier ausprobiert, indem wir das
Anwender-Flash komplett mit $FF beschrieben (also gelöscht) haben und
den Bootloader auf Adresse $0000 springen ließen. Der Prozessor fand
sich im Bootloader wieder, ohne das ein RESET-Flag im MCUSCR gesetzt
war - er muß also einfach durchgelaufen sein, bis er wieder auf den
Bootloader und somit gültigen Code getroffen war. Dieser Vorgang ist
100% reproduzierbar.

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