Forum: Mikrocontroller und Digitale Elektronik atmega8 mit assembler unter linux programmieren


von Randolf B. (inside-man)


Lesenswert?

Hallo, ich moechte gern meinen atmega8 mit assembler programmieren. Am 
liebsten unter linux,ich habe die programme avra tavrasm gavrasm hier 
installiert. Das hexfile wollte ich dann mit avrdude reinschieben. Was 
mir partout nicht gelingen will, ist: den nachfolgenden Text zu 
assemblieren. Es ist ein programm von myavr und soll eine led anschalten 
(ich hoffe das programm ist richtig). unter windows kein problem. Doch 
jeder dieser linux assembler schimpft an einer anderen stelle. Mag sein 
das es da ein paar Unterschiede in der syntax gibt. Doch ich kann 
absolut nicht rausfinden was ich anpassen muss. Kann mir jemand den 
passendsten assembler empfehlen, und kurz ueber die zeilen schauen was 
da nicht stimmt.  Ich hatte auch mal mit kontrollerlab getestet. Aber da 
scheint die Einarbeitung auch nicht ganz ohne zu sein. Ich moechte 
eigentlich erst mal nur so ein kleines Miniprogramm assemblieren, and 
darauf aufbauend weiterforschen.
Gruss Randolf Balasus

;+----------------------------------------------------------------------

.include  "m8def.inc"

;----------------------------------------------------------------------- 
-

;Reset and Interrupt vector             ;VNr.  Beschreibung

  rjmp  main  ;1     POWER ON RESET

  reti    ;2     Int0-Interrupt

  reti    ;3     Int1-Interrupt

  reti    ;4     TC2 Compare Match

  reti    ;5     TC2 Overflow

  reti    ;6     TC1 Capture

  reti    ;7     TC1 Compare Match A

  reti    ;8     TC1 Compare Match B

  reti    ;9     TC1 Overflow

  reti    ;10    TC0 Overflow

  reti    ;11    SPI, STC Serial Transfer Complete

  reti    ;12    UART Rx Complete

  reti    ;13    UART Data Register Empty

  reti    ;14    UART Tx Complete

  reti    ;15    ADC Conversion Complete

  reti    ;16    EEPROM Ready

  reti    ;17    Analog Comparator

  reti    ;18    TWI (I²C) Serial Interface

  reti    ;19    Store Program Memory Ready

;----------------------------------------------------------------------- 
-

;Start, Power ON, Reset

main:  ldi  r16,hi8(RAMEND)

  out  SPH,r16

  ldi  r16,lo8(RAMEND)  ;Stack Initialisierung

  out  SPH,r16  ;Init Stackpointer

  sbi  DDRB,0  ;PORTB0 auf Ausganp

;----------------------------------------------------------------------- 
-

mainloop:  ldi  r16,0b00000001

  out  PORTB,r16

  rjmp  mainloop

;----------------------------------------------------------------------- 
-

von Gerhard (Gast)


Lesenswert?

Wenn du die beiden Zeilen zur Stack Initialisierung in

ldi  r16,high(RAMEND)
ldi  r16,low(RAMEND)  ;Stack Initialisierung

änderst compiliert es gavrasm problemlos mit einer Warnung, dass er die 
Header Datei nicht benutzt sondern eine interne Tabelle benutzt. Die 
kannst du, denke ich, ignorieren.

Gerhard

von Gabriel W. (gagosoft)


Lesenswert?

Eigentlich programmiere ich kaum ASM, doch das programm sieht für mich 
ganz sinnvoll aus. Was da genau mit dem Stackpointer passiert weiss ich 
auf Anhieb nicht, kannst aber (meiner bescheidenen Meinung nach) diese 
initialiserung für ein "low-level-hello-world" weglassen.
Was mir noch echt komisch vorkommt:
jeder Interrupt vektor hat einen Offset von 2, RETI benötigt aber nur 
ein Befehlswort.

von Gerhard (Gast)


Lesenswert?

Wenn du auch noch die Zeile

.include  "m8def.inc"

durch

.DEVICE ATMEGA8

ersetzt unterbleibt auch die Fehlermeldung.

Gerhard

von Düsentrieb (Gast)


Lesenswert?

ich nehm bisher:
avra
+
sp12
als progger; ging auf anhieb besser als avrdude

von daniel (Gast)


Lesenswert?

oder du holst dir dir datei m8def.inc
in der stehen einige definitionen die nützlich sind

in main main musst du aber ersetzen,
da es die macros hi8 lo8 nicht gibt

    ;ldi  r16,hi8(RAMEND)
    ldi  r16, RAMEND>>8

    ;ldi  r16,lo8(RAMEND)  ;Stack Initialisierung
    ldi  r16, RAMEND & 0xF

avra -I /pool/software/avra/AVR main.asm

in verzeichnis AVR habe ich die m8def.inc datei

grüsse, daniel

ps: du könntest auch avr-gcc nutzen als assembler nutzen

von Olaf (Gast)


Lesenswert?

wohl eher:

  ldi r16, (RAMEND & 0xFF)

von David M. (md2k7)


Lesenswert?

Gabriel Wegscheider wrote:
> kannst aber (meiner bescheidenen Meinung nach) diese
> initialiserung für ein "low-level-hello-world" weglassen.

bin auch der Meinung, aber schaden tut's ja nicht.

> Was mir noch echt komisch vorkommt:
> jeder Interrupt vektor hat einen Offset von 2, RETI benötigt aber nur
> ein Befehlswort.

Nein, ist beim Mega8 nicht der Fall, siehe Datenblatt (bei meiner Vers. 
ist das auf Seite 46)...

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.