www.mikrocontroller.net

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


Autor: S. N. (sp00ky-n1)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: S. N. (sp00ky-n1)
Datum:

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

Gruß.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was ist ein Resetvektor? Und wo muss der hin?

Autsch!

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: S. N. (sp00ky-n1)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

hinter das hier
;stop the program
STOP:
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

Autor: S. N. (sp00ky-n1)
Datum:

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

Autor: S. N. (sp00ky-n1)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: S. N. (sp00ky-n1)
Datum:

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

Autor: tastendrücker (Gast)
Datum:

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

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.