Hallo zusammen, ich versuche gerade meine erste Schritte in der Mikrocontroller Programmierung zu machen. Ich verwende das STK500, ein Atmega8515, avrdude 5.5 und gcc 4.4.5 unter gentoo. Den Assembler-Code und meine Makefile befinden sich im Anhang. Ich hänge gerade am Beispiel bitaccess des AVR-Tutorials. Theoretisch sollte die 4. LED erst leuchten, wenn man den 1.Taster drückt. Und die 6. LED sollte nie leuchten. Leider funktioniert das bei mir nicht. Wenn das Programm übertragen ist, leuchtet sofort die 4. und 6. LED. Es sieht so aus, als ob die Sprungbefehle ignoriert werden. Hat mir jemand ein Tipp, wo der Fehler liegt? Vielen Dank schon mal!
Der Code an sich wird schon richtig sein. Das Tutorial beschränkt sich an dieser, wie an anderen Stellen, aber auf das unmittelbare Thema, was heisst, das andere grundlegende Dinge wie Stackinitialisierung und insbesondere Interruptvektor-Tabelle nicht behandelt sind und auch in den Codebeispielen nicht erscheinen. Letzteres insbesondere deswegen, weil die Interrupt-Tabelle bei jedem AVR-Typ ein wenig anders aufgebaut ist und deswegen kein konkreter Code dafür angegeben werden kann. Zur Info lies mal: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts#Aufbau_der_Interruptvektortabelle Um Dir aber unmittelbar weiter zu helfen, füge vor Deinem Code mal folgendes ein.
1 | rjmp start |
2 | .org 100 |
3 | start: |
Ob das jetzt wirklich ein jump oder ein rjmp sein muss, weiss ich nicht aus dem Kopf. Steht im Datenblatt, aber leider ist der ATMega8515 schon so alt, das auf der Atmel-Webseite keine Datenblätter mehr dafür verfügbar sind. Schau mal auf Deiner CD die mit dem STK500 gekommen ist nach. Ich bin jetzt zu faul dazu.
Und ersetze mal
1 | #include "avr/io.h" |
durch
1 | .include "m8515def.inc" |
.include "m8515def.inc" Erstmal ist das erste eigentlich kein Assembler-Kommando und ausserdem gehört die Datei zu einem Mega8 und nicht zu einem Mega8515. Kleiner Tip noch. Wenn Du Dein Programm mal im Simulator lädst dann siehst Du genau was passiert. Ich habe gerade festgestellt, das die fehlende Interrupt-Tabelle nicht das Problem ist. Aber schön wäre es dennoch.
Mist. Was schreib ich denn da? >Erstmal ist das erste eigentlich kein Assembler-Kommando und ausserdem >gehört die Datei zu einem Mega8 und nicht zu einem Mega8515. Es muss heissen: Das ist eigentlich kein Assembler-Kommando und der Pfad macht in einem Assemblerprogramm keinen Sinn. Sorry
Glaskugel schrieb: > Und ersetze mal >
1 | .include "m8515def.inc" |
> Erstmal ist das erste eigentlich kein Assembler-Kommando und ausserdem > gehört die Datei zu einem Mega8 und nicht zu einem Mega8515. Hm, dann bekomme ich aber ein Haufen Fehlermeldungen:
1 | avr-gcc -mmcu=at90s8515 -Os -Wall -Wextra -c test.S |
2 | /tmp/ccgSoOWI.s: Assembler messages: |
3 | /tmp/ccgSoOWI.s:7: Error: can't open m8515def.inc for reading: No such file or directory |
4 | test.S:7: Error: constant value required |
5 | test.S:9: Error: constant value required |
6 | test.S:12: Error: constant value required |
7 | test.S:14: Error: constant value required |
8 | test.S:16: Error: constant value required |
9 | test.S:18: Error: constant value required |
10 | test.S:19: Error: constant value required |
11 | test.S:21: Error: constant value required |
12 | test.S:22: Error: constant value required |
13 | make: *** [test.o] Fehler 1 |
Was für einen Simulator meinst du denn? Wo kann ich mir die Sourcen für den Simulator herunterladen, damit ich ihn mir compilieren kann?
Das mit dem
1 | #include <avr/io.h> |
könnte in deinem Fall erstmal richtig sein. Das, was du hier versuchst ist eine Funktion in einer Assemblerdatei zu erstellen, die vom C-Hauptprogramm aufgerufen werden kann. Problem: Was soll's wirklich werden? Ein Assembler-Programm? Dann nicht mit GCC, das ist der C-Compiler (wo man allerdings Assembler einbinden kann). Wenn's ein reines Assemblerprogramm werden soll, dann brauchst du einen Assembler! Und in jedem Fall die entsprechende Lektüre. z.B. http://www.mikrocontroller.net/articles/AVR-Tutorial
Ralf schrieb: > Problem: Was soll's wirklich werden? Ein Assembler-Programm? Dann nicht > mit GCC, das ist der C-Compiler (wo man allerdings Assembler _einbinden_ > kann). > Wenn's ein reines Assemblerprogramm werden soll, dann brauchst du einen > Assembler! Und in jedem Fall die entsprechende Lektüre. Es soll ein reines Assemblerprogramm werden. ich hab aber leider nur Linux. Darum will ich das eigentlich mit dem GNU-Assembler machen. Dazu finde ich aber keine Anleitungen, weshalb ich mir das obige Konstrukt gefrickelt habe. Wie mach ich das mit den GNU Assembler?
Hans Dampf schrieb: > Es soll ein reines Assemblerprogramm werden. Dann brauchst du erstmal den entsprechenden Assembler. Am besten AVR-Studio4.x. Da ist alles drin, incl. Simulator.
Ralf schrieb: > Dann brauchst du erstmal den entsprechenden Assembler. Am besten > AVR-Studio4.x. Da ist alles drin, incl. Simulator. Gibts das AVR-Studio nativ für Linux? Ich habe leider kein Windows. Meine obige Methode läuft ja auf dem Board - nur gehen die jumps aus irgendwelchen Gründen nicht ):
So wie es aussieht, haben sich auch andere schon an dem Thema die Zähne ausgebissen: Beitrag "Probleme mit rjmp beim AVR Atmega 8L"
Hans Dampf schrieb: > Gibts das AVR-Studio nativ für Linux? 'AVR Studio Linux' bringt bei Google als erstes diesen Beitrag: Beitrag "AVR Studio unter Linux" Also, das muss es schon geben. Vielleicht gibts ja auch Alternativen?
Ich hab es gelöst (: Vor allem hat mir folgender Beitrag geholfen: Beitrag "Re: avr-tutorial timer, interruptvektor ist nicht definiert" Im Anhang befindet sich jetzt die korrigierten Dateien.
in der test.S hat sich noch ein Fehler eingeschlichen:
1 | out PORTD, r16 |
sollte natürlich
1 | out PORTD, r30 |
sein.
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.