Forum: Mikrocontroller und Digitale Elektronik Was macht ein µC mit unbekannten Befehlen


von Martin (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

Das Flash kann nichtg leer sein. Da steht immer was drinnen.
In diesem speziellen Fall 0xFF.
So jetzt such dir mal aus den Datenblättern bei Atmel
raus, welcher Befehl den Hex-Code 0xFF hat.

von Karl heinz B. (kbucheg)


Lesenswert?

Um genau zu sein, brauchst du einen 16 Bit Opcode
also 0xFFFF (alle 16 Bit auf 1)

von Martin (Gast)


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

von johnny.m (Gast)


Lesenswert?

Das Ding heißt 'Instruction Set Manual'. Sollte man haben...

von Martin (Gast)


Lesenswert?

Genau, wenn ich mich nicht täusche, ist das Flash der AVRs 16-Bit
organisiert.

von johnny.m (Gast)


Lesenswert?


von Jan M. (mueschel)


Lesenswert?

@Martin: gut geraten, aber knapp daneben...
NOP hat den Opcode 0x0000.
0xFFFF ist, wenn ich nichts übersehen habe, nicht belegt. Der Befehl
mit dem höchsten Opcode müsste SBRS 31,7 sein: 0xFFF7

von Karl heinz B. (kbucheg)


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?

von Martin (Gast)


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

von johnny.m (Gast)


Lesenswert?

Kannste Dir sparen. FFFF gibts net...

von Michael U. (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

Schon.
Aber irgendwas muss die CPU ja machen.

Sowas gabs früher auch schon. Auf der Z80 gabs auch einige
offiziell nicht belegte OpCodes, die trotzdem was
sinnvolles machten.

von TravelRec. (Gast)


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.

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.