Forum: Compiler & IDEs Atmega8515 Assembler Programmierung


von ogelpre (Gast)


Angehängte Dateien:

Lesenswert?

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!

von Glaskugel (Gast)


Lesenswert?

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.

von Glaskugel (Gast)


Lesenswert?

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.

von Glaskugel (Gast)


Lesenswert?

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

von Hans D. (ogelpre)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

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

von Hans D. (ogelpre)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

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.

von Hans D. (ogelpre)


Lesenswert?

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 ):

von Hans D. (ogelpre)


Lesenswert?

So wie es aussieht, haben sich auch andere schon an dem Thema die Zähne 
ausgebissen: Beitrag "Probleme mit rjmp beim AVR Atmega 8L"

von Ralf (Gast)


Lesenswert?

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?

von Hans D. (ogelpre)


Angehängte Dateien:

Lesenswert?

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.

von Hans D. (ogelpre)


Lesenswert?

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
Noch kein Account? Hier anmelden.