mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Martin (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ding heißt 'Instruction Set Manual'. Sollte man haben...

Autor: Martin (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jan M. (mueschel)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Martin (Gast)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannste Dir sparen. FFFF gibts net...

Autor: Michael U. (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: TravelRec. (Gast)
Datum:

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

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.