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??
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?
>.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?
>>.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... ;-)
Sorry, ist ein ATMega169 von Atmel, programmiert mit AVR Studio 4. Was ist ein Resetvektor? Und wo muss der hin? Gruß.
>Was ist ein Resetvektor? Und wo muss der hin?
Autsch!
Nun Zeig mal dein Programm und ... woher hast du's?
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.
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?
Ahhh, es gibt einen Bootloader... hast du aber bisher nichts von gesagt. Na dann übergebe ich mal an die AVR-(Bootloader)-Fraktion.... (Ein PICer)
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
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...
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?
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:
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 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.