Forum: Mikrocontroller und Digitale Elektronik avr-as macro programmierung


von Rainer S. (rsonline)


Lesenswert?

#define    RU1      r18

        poweronreset:           .byte 1

.macro store p0 p1 p2
        ldi     /p1 , /p2
        sts     /p0 , /p1
.endm

        store   poweronreset , RU1 , 13


avr.asm: Assembler messages:
avr.asm:10: Error: bad expression
avr.asm:10: Error: register number above 15 required
avr.asm:10: Error: `,' required
avr.asm:10: Error: garbage at end of line
avr.asm:10: Error: bad expression
avr.asm:10: Error: `,' required
avr.asm:10: Error: constant value required
avr.asm:10: Warning: skipping two-word instruction
avr.asm:10: Error: garbage at end of line

Was muss hier geändert werden, damit es läuft?

von Gelangweilt (Gast)


Lesenswert?

>Was muss hier geändert werden, damit es läuft?

Der Code.

von Amir Troglodym (Gast)


Lesenswert?

Naja. So geht's nicht, ist sehr weit weg...
Ich empfehl mal ein paar AVR ASM Beispiele reinzuziehen und zu 
vergleichen.

von voga2073 (Gast)


Lesenswert?

Backslash statt forward slash

von Rainer S. (rsonline)


Lesenswert?


von Rainer S. (rsonline)


Lesenswert?

voga2073 schrieb:
> Backslash statt forward slash

Ok, super, danke.

Jetzt wird aber beim Register RU1 eine Fehlermeldung ausgeworfen.

Wie werden Register korrekt definiert?

von voga2073 (Gast)


Lesenswert?

Statt

#define    RU1      r18

machste

#define r18 RU1

dann geht das auch.

Volker

von voga2073 (Gast)


Lesenswert?

Nee, warn bisschen blöd.

Das sollte als
RU1 = r18
gehen.

Probiers mal, vllt. auch umgekehrte Reihenfolge.

Volker

von Rainer S. (rsonline)


Lesenswert?

Funktioniet leider nicht.

Als Fehlermeldung kommt immer:

avr.asm:10: Error: register name or number from 0 to 31 required

von Rainer S. (rsonline)


Lesenswert?

... das andere habe ich gerade erst gesehen, werde es ausprobieren und 
dann melden.

von Rainer S. (rsonline)


Lesenswert?

RU1 = r18
r18 = RU1

geht beides nicht. Wieder die gleiche Fehlermeldung.

von voga2073 (Gast)


Lesenswert?

Also, jetzt mal selbst probiert.

Der Code:
1
#define RU1 r18
2
        poweronreset:           .byte 1
3
4
.macro store p0 p1 p2
5
        ldi     \p1 , \p2
6
        sts     \p0 , \p1
7
.endm
8
9
        store   poweronreset , RU1 , 13

wird fehlerfrei übersetzt in:

 8cd:  2d e0         ldi  r18, 0x0D  ; 13
 8cf:  20 93 cc 08   sts  0x0088, r18



Volker

von Rainer S. (rsonline)


Lesenswert?

...hier leider nicht.

Habe festgestellt, dass alles was mit # anfängt ignoriert wird, bzw. als 
Kommentar betrachtet wird.

Auch
.equ  RU1 , r18
geht nicht, gleiche Fehlermeldung.

von Spess53 (Gast)


Lesenswert?

Hi

Um welchen AVR Assembler geht hier?

MfG Spess

von voga2073 (Gast)


Lesenswert?

Der Macro-Syntax nach zu urteilen müsste das der gcc sein.

Ended der Name der Assemblerdatei auf .S? Sonst läuft die u.U. nicht 
durch den Precompiler und dann werden die Defs nicht ausgewertet.

Volker

von Rainer S. (rsonline)


Lesenswert?

Spess53 schrieb:
> Um welchen AVR Assembler geht hier?

Avr-as von binutils auf Linux.

http://ftp.gnu.org/gnu/binutils/

(binutils-2.22.tar.bz2)

http://sourceware.org/binutils/docs/as

Auch ein Umbenennen mit Endung .s oder .S zeigt die gleichen Ausgaben.

von Rainer S. (rsonline)


Lesenswert?

Hat jemand eine Idee?

von Stefan E. (sternst)


Lesenswert?

Rainer S. schrieb:
> Hat jemand eine Idee?

Wie benutzt du denn den Assembler? Ich vermute mal, dass du ihn direkt 
aufrufst. Das ist keine so gute Idee. Benutze den avr-gcc als Frontend, 
dann klappt das auch mit dem Präprozessor.

von Rainer S. (rsonline)


Lesenswert?

Stefan Ernst schrieb:
> Rainer S. schrieb:
>> Hat jemand eine Idee?
>
> Wie benutzt du denn den Assembler? Ich vermute mal, dass du ihn direkt
> aufrufst.

Ja, richtig.

avr-as [file]

> Das ist keine so gute Idee. Benutze den avr-gcc als Frontend,
> dann klappt das auch mit dem Präprozessor.

Ich brauche aber nur den Assembler...
Geht das nicht auch ohne GCC?

von Stefan E. (sternst)


Lesenswert?

Rainer S. schrieb:
> Ich brauche aber nur den Assembler...

Offenbar ja nicht, denn du willst ja auch den Präprozessor haben. Und 
wenn du mit dem vom Assembler produzierten Output irgendetwas anfangen 
willst, dann brauchst du auch noch den Linker hinterher.

Rainer S. schrieb:
> Geht das nicht auch ohne GCC?

Klar, dann musst du eben alles selber aufrufen (Präprozessor vorher, 
Linker hinterher), mit den richtigen Optionen, dazu noch ein 
Linker-Script selber schreiben (obwohl es im einfachsten Fall vielleicht 
auch ohne Linker-Script geht).

von Rainer S. (rsonline)


Lesenswert?

Stefan Ernst schrieb:
> Rainer S. schrieb:
>> Ich brauche aber nur den Assembler...
>
> Offenbar ja nicht, denn du willst ja auch den Präprozessor haben.

Keine Ahnung was jetzt ein Präprozessor ist...
Hatte gedacht, es wäre (relativ) einfach vom Atmel-Assembler auf den 
avr-as umzusteigen.
avr-gcc ist bei den Binutils nicht dabei. Habe ich versucht aufzurufen.

> Und
> wenn du mit dem vom Assembler produzierten Output irgendetwas anfangen
> willst, dann brauchst du auch noch den Linker hinterher.

Aha.

> Rainer S. schrieb:
>> Geht das nicht auch ohne GCC?
>
> Klar, dann musst du eben alles selber aufrufen (Präprozessor vorher,
> Linker hinterher), mit den richtigen Optionen, dazu noch ein
> Linker-Script selber schreiben (obwohl es im einfachsten Fall vielleicht
> auch ohne Linker-Script geht).

Ist das denn relativ einfach möglich, oder soll ich das lieber weiter 
mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Rainer S. schrieb:
> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.

Warum nimmst du nicht den Assembler "avra"? Er ist meistens in den 
Linux-Paketen enthalten.

Soweit ich mich erinnere, ist avra zum Atmel-Assembler kompatibel. Er 
besitzt sogar ein paar nützliche Erweiterungen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Rainer S. schrieb:
> Stefan Ernst schrieb:
>> Rainer S. schrieb:
>>> Ich brauche aber nur den Assembler...
>>
>> Offenbar ja nicht, denn du willst ja auch den Präprozessor haben.
>
> Keine Ahnung was jetzt ein Präprozessor ist...

Das ist das Ding, das #define und Konsorten auflöst.

Wenn du keinen Präprozessor verwenden willst/kannst/darfst, dann 
beschränke dich auf .macro und .altmacro, d.h. die 
Makro-Syntak/-Semantik von gas anstatt der von cpp.

> Hatte gedacht, es wäre (relativ) einfach vom Atmel-Assembler auf den
> avr-as umzusteigen.
> avr-gcc ist bei den Binutils nicht dabei. Habe ich versucht aufzurufen.

Wer installiert denn avr-binutils ohne avr-gcc?

> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.

avr-gcc/avr-as ist nicht kompliziert, aber in der Verwendung eben etwas 
anders als der Atmel-Assembler.  Dafür ist der GNU-Assembler 
leistungsfähiger.

von Rainer S. (rsonline)


Lesenswert?

Markus W. schrieb:
> Rainer S. schrieb:
>> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
>> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.
>
> Warum nimmst du nicht den Assembler "avra"? Er ist meistens in den
> Linux-Paketen enthalten.

Kannte ich bis jetzt nicht. Probiere ich vielleicht mal aus.
Auf der Seite steht, dass er kompatibel zum Atmel Assembler ist.

Johann L. schrieb:
> Wenn du keinen Präprozessor verwenden willst/kannst/darfst, dann
> beschränke dich auf .macro und .altmacro, d.h. die
> Makro-Syntak/-Semantik von gas anstatt der von cpp.

Das hört sich kompliziert an...

>> Hatte gedacht, es wäre (relativ) einfach vom Atmel-Assembler auf den
>> avr-as umzusteigen.
>> avr-gcc ist bei den Binutils nicht dabei. Habe ich versucht aufzurufen.
>
> Wer installiert denn avr-binutils ohne avr-gcc?

In dem binutils Download ist auch arm-as und arm-ld drin, den ich für 
einen Freepascal Crosscompiler benötige.
Da habe ich dann eben auch avr-as probiert.

>> Ist das denn relativ einfach möglich, oder soll ich das lieber weiter
>> mit dem Atmel-Assembler machen. Ich würde gerne unter Linux arbeiten.
>
> avr-gcc/avr-as ist nicht kompliziert, aber in der Verwendung eben etwas
> anders als der Atmel-Assembler.  Dafür ist der GNU-Assembler
> leistungsfähiger.

Warum ist der denn leistungsfähiger?

von MWS (Gast)


Lesenswert?

Versuch's mal in der Richtung:
1
#include "avr/io.h"
2
#include "GLCD_ISR_defs.h"
3
4
.extern scr_ln_nr      ; unsigned char, number 0..19 of screen line
5
.extern text        ; unsigned char [20][40], holds screen text
6
.extern p_text        ; pointer to actual text position
7
.extern  schrift        ; const unsigned char schrift[12][256] PROGMEM, font
8
.global TIMER0_OVF_vect
9
.equ  set_cp,   16    ; register for CP set constant
10
.equ  ch_ln_ctr,   17    ; char scan line ctr
11
.equ  scr_ln_ctr, 18    ; screen line ctr in
12
.equ  clr_cp,   19    ; register for CP clear constant
13
.equ  schrift_lb, 22    ; backup register for address lowbyte of schrift
14
.equ  schrift_hb, 23    ; backup register for address highbyte of schrift
15
.equ  tmp,     24
16
.equ  xl,     26
17
.equ  xh,     27
18
.equ  zl,     30
19
.equ  zh,     31
Da sind auch noch Anweisungen drin um auf in C deklarierte Variablen 
zuzugreifen.

von MWS (Gast)


Lesenswert?

1
  ldi    tmp,      t0_preload        ; load preload const as defined hy GLCD_ISR_defs.h
2
  lds    scr_ln_ctr,    (scr_ln_nr)        ; load actual screen line number
3
  lds    ch_ln_ctr,    (ch_ln_nr)        ; load line nr within char

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.