Forum: Mikrocontroller und Digitale Elektronik invalid op code bei db-Direktive


von S. N. (sp00ky-n1)


Lesenswert?

Hallo,

ich muss für ein µC-Praktikum ein kleines Programm schreiben, das 10 
Zahlen aus dem Programm-Speicher liest und dann addiert. Folgendes mal 
ein Ausschnitt aus dem Programmcode:

;load values in Program-Flash-Memory, starting at adress 100h
.ORG 0x100
.DB 0x12, 0x20, 0xA5, 0xFF, 0xD, 0x4C, 0xD1, 0x5F, 0x40, 0xF2

Die Daten sollen ab Adresse 100h gespeichert sein. Das lege ich ja mit 
.ORG fest. Und die Daten speichere ich dann mit .DB
Wenn ich das Programm dann compiliere, funktioniert das auch fehlerfrei. 
Beim Ausführen springt PC dann am Anfang aber immer zwischen den Werten 
100, 102, 104, 100,... und bringt die Meldung "invalid opcode 0xffff at 
adress 0x00cd", bis er irgendwann einfach mit der Ausführung des 
Programms anfängt. Während dessen werden ständig Werte in die Register 
16 und 29 geschrieben.
Sobald das Programm dann mal richtig läuft, funktioniert die Ausführung 
auch perfekt, ich habe nur keine Ahnung woher der Fehler kommt...

Könnte mir jemand da einen Tipp geben?

Gruß.

PS: Habe gerade noch mal andere Werte benutzt, mit denen funktioniert es 
jetzt ohne Probleme??

von tastendrücker (Gast)


Lesenswert?

Welcher Controller?
Welcher Assembler?
Wie sieht der Rest des Programms aus?

Mit diesem Schnipsel kann keiner so richtig was anfangen.


>Wenn ich das Programm dann compiliere, funktioniert das auch fehlerfrei.

Aha

>Beim Ausführen springt PC dann am Anfang aber immer zwischen den Werten
>100, 102, 104, 100,... und bringt die Meldung "invalid opcode 0xffff at
>adress 0x00cd", bis er irgendwann einfach mit der Ausführung des

Also doch nicht?

PC = Program Counter?

Wer bringt wann diese Meldung? Meinst Du mit "[...] funktioniert das 
auch fehlerfrei", dass das Übersetzen fehlerfrei funktioniert? Aber wer 
bringt dann die Fehlermeldung?

von Sven P. (Gast)


Lesenswert?

>.ORG 0x100
>.DB 0x12, 0x20, 0xA5, 0xFF, 0xD, 0x4C, 0xD1, 0x5F, 0x40, 0xF2

sieht nach AVR aus...so für den engstirnigen Betrachter :-)

Hast du auch einen vernüngtigen Resetvektor eingebaut?

von tastendrücker (Gast)


Lesenswert?

>>.ORG 0x100
>>.DB 0x12, 0x20, 0xA5, 0xFF, 0xD, 0x4C, 0xD1, 0x5F, 0x40, 0xF2

>sieht nach AVR aus...so für den engstirnigen Betrachter :-)

Aus diesem Code auf den µC zu schliessen sieht nach einer 
Luxus-Kristallkugel aus. Man könnte allenfals auf einige Assembler 
tippen... ;-)

von S. N. (sp00ky-n1)


Lesenswert?

Sorry,
ist ein ATMega169 von Atmel, programmiert mit AVR Studio 4.
Was ist ein Resetvektor? Und wo muss der hin?

Gruß.

von tastendrücker (Gast)


Lesenswert?

>Was ist ein Resetvektor? Und wo muss der hin?

Autsch!

Nun Zeig mal dein Programm und ... woher hast du's?

von tastendrücker (Gast)


Lesenswert?

Na dann schau erstnmal in's Datenblatt des µC und siehe nach, an welcher 
stelle (Adresse) der µC nach einem Reset bzw. dem Einschalten mit der 
Arbeit beginnt und dann prüfe mal, wie dein Programm an der Stelle 
aussieht.

von S. N. (sp00ky-n1)


Lesenswert?

Nunja, das sollte eigentlich im Bootloader stehen, oder liege ich da 
falsch. Und an dem sollen wir tunlichst nichts ändern...
PS: Sämtliche Power-Saving Optionen sind nicht verfügbar, nur Reset. Und 
da wird direkt der Bootloader ausgeführt. Der fängt dann bei Adresse 
0x30 an.
Heißt das dann, dass ich direkt nach dem Laden der Werte in den 
Programmspeicher an Adresse 0x30 fortsetzen muss?

von tastendrücker (Gast)


Lesenswert?

Ahhh, es gibt einen Bootloader... hast du aber bisher nichts von gesagt.

Na dann übergebe ich mal an die AVR-(Bootloader)-Fraktion....


(Ein PICer)

von Sebastian (Gast)


Lesenswert?

Setz mal das:
1
;load values in Program-Flash-Memory, starting at adress 100h
2
.ORG 0x100
3
.db 0x12, 0x20, 0xA5, 0xFF, 0xD, 0x4C, 0xD1, 0x5F, 0x40, 0xF2

hinter das hier
1
;stop the program
2
STOP:
3
rjmp stop
dann könnte es funktionieren.

Und bitte bitte bitte versuch zu verstehen, warum es nicht funktioniert 
hat. Das ist elementar und hilft ungemein, wenn du später nochmal was 
programmieren willst/musst.

Sebastian

von S. N. (sp00ky-n1)


Lesenswert?

Hm, bringt leider auch nix. Hab jetzt mal noch direkt am Anfang von MAIN 
ein .ORG 0x30 eingebaut, damit sind die komischen Sprünge im PC weg. 
Übrig bleibt nur noch ein Fehler "invalid opcode 0xffff at adress 
0x000000". Und der kommt glaube ich daher, dass das AVR Studio den 
Bootloader nicht kennt...

von S. N. (sp00ky-n1)


Lesenswert?

Hab ganz an den Anfang mal noch folgendes geschrieben:

.ORG 0x0
rjmp MAIN

.ORG 0x1
rjmp MAIN

Und dann kommt der analoge Fehler, nur an Stelle 0,000002. Vermutlich 
soll die Ausführung des Programms an Stelle 0x000000 des 
Programmspeichers begonnen werden. Ich denke aber, dass das bei meinem 
µC nicht der Fall sein wird, da - wie ja schon gesagt - bereits ein 
Bootloader vorhanden ist, der die Startadresse soweit ich das verstanden 
hab auch 0x000030 festsetzt.

Kann das sein?

von Stefan E. (sternst)


Lesenswert?

Wenn du das ganze simulierst, startet es natürlich mit dem Resetvektor, 
denn der Simulator weiß ja nichts von dem Bootloader (wie du schon 
erkannt hast). In Real startet aber der Bootloader und springt dann an 
Adresse 0x30.

Außerdem steht im Datenblatt:
"The instruction placed at the Reset Vector must be a JMP
– Absolute Jump – instruction to the reset handling routine."

Ich würde es also mal damit probieren:

; nur für den Simulator
.ORG 0x0
jmp MAIN

; eigentlicher Programmstart
.ORG 0x30
MAIN:

von S. N. (sp00ky-n1)


Lesenswert?

OK, das hats gelöst (Ein relative jump, rjmp funktiniert übrigens 
auch...) Und das Problem habe ich damit auch verstanden. Vielen Dank 
euch. Von einem Resetvektor hat uns in der Einführung leider niemand was 
erzählt...

Gruß,
Sebastian.

von tastendrücker (Gast)


Lesenswert?

>Von einem Resetvektor hat uns in der Einführung leider niemand was
>erzählt...

Und dadurch hast du etwas gelernt, das du nicht so schnell vergisst! 
Besser kann's dir kein Lehrer beibringen.

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.