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
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.
Um genau zu sein, brauchst du einen 16 Bit Opcode also 0xFFFF (alle 16 Bit auf 1)
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
Das Ding heißt 'Instruction Set Manual'. Sollte man haben...
@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
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?
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.