Assembler mit avr-gcc

Gast #648625
Lesenswert?

hi, ich wollte mal bischen mit Assembler rumspielen und mich 
einarbeiten. Zwei Artikel hab ich schon durch und bischen was verstanden 
hab ich wohl auch und jetzt wollte ich mein ersten Programm zum laufen 
bekommen aber irgendwas tut nicht. Mein Code sieht so aus ( die Vorlage 
habe ich aus einem Beispiel ):
1
#include <avr/io.h>                ; das gibt den Controllertyp an
2

3
.text                              ; was nun folgt, gehört in den FLASH-Speicher
4

5
.global main                       ; main ist auch in anderen Modulen bekannt
6

7
main:                              ; zu 'main' wird nach Reset hingesprungen
8
        ;....   eigene befehle
9
        
10
        rjmp Hauptschleife
11
        
12
Hauptschleife:                     ; ein Sprunglabel
13
        ;....   eigene befehle
14
        
15
        LDI R24, 0xFF
16
        OUT DDRD, R24
17
        
18
        LDI R24, 0x00
19
        OUT PORTD, R24
20
        
21
        LDI R24, 0xFF
22
        OUT DDRB, R24
23
        
24
        LDI R24, 0xFF
25
        OUT PORTB, R24
26
        
27
        rjmp Hauptschleife         ; immer wiederholen

Assemblieren tu ich mit dieser anweisung:
1
avr-gcc -o beispiel.elf -mmcu=atmega8 test.S && avr-objcopy -O ihex -j .text -j .data beispiel.elf beispiel.hex

kann mir jemand sagen was genau ich falsch mache?

P.S: Warnung bekomme ich folgende geliefert
1
test.S:1:36: warning: extra tokens at end of #include directive

mfg blan
Moderator Persönliche Seite #648645
Lesenswert?

Ja, um die Warnung zu verstehen, musst du ein wenig von C und dessen
Compiler verstehen. ;-)  Das hängt damit zusammen, dass du für die
Einbindung von <avr/io.h> ein Stück des C-Compilers benutzt, den
sogenannten Präprozessor.  Allerdings versuchst du, dieses Stück
C mit Assemblerkommentaren zu mischen:
1
#include <avr/io.h>                ; das gibt den Controllertyp an

Das versteht der C-Compiler nicht.  Also entweder so:
1
; das gibt den Controllertyp an
2
#include <avr/io.h>

oder so:
1
#include <avr/io.h>                /* das gibt den Controllertyp an */

Aber das ist wohl nicht dein Hauptproblem.  <avr/io.h> ist so
aufgebaut, dass man normalerweise über einen Makro auf die IO-Register
zugreifen soll.  Du musst also schreiben:
1
        LDI R24, 0xFF
2
        OUT _SFR_IO_ADDR(DDRD), R24
3
        
4
        LDI R24, 0x00
5
        OUT _SFR_IO_ADDR(PORTD), R24
6
        
7
        LDI R24, 0xFF
8
        OUT _SFR_IO_ADDR(DDRB), R24
9
        
10
        LDI R24, 0xFF
11
        OUT _SFR_IO_ADDR(PORTB), R24

Siehe auch hier:

http://www.nongnu.org/avr-libc/user-manual/assembler.html

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren