Forum: Compiler & IDEs hi8 und lo8 bei gcc-asm


von sep (Gast)


Lesenswert?

Hey,

Irgendwie bin ich gerade ein bisschen verwirrt.
Ich habe zwei assembler Befehle mit hi8 und lo8 und bekomme dort jeweils 
eine Fehlermeldung. Folgender Code:
1
    ldi r18, hi8( F_CPU / 100 / 3 )
2
    ldi r19, lo8( F_CPU / 100 / 3 ) - 1
 Nun kommt dazu folgende Fehlermeldung.
1
Error: `)' required
2
Error: garbage at end of line
3
Error: `)' required
4
Error: garbage at end of line
Wenn ich jedoch ein hi8( 0x3000 ) angebe, dann kompiliert er alles 
richtig. F_CPU wird richtig mit übergeben mit 368600UL. Ich habe nun 
schon wie verrückt gegoogelt. Konnte jedoch nichts finden. Also, 
entweder ist bei mir gerade der Wurm drin, oder es ist schon zu spät. 
Wer weiß.
Bei AVR-Studio habe ich es wie folgendermaßen gemacht.
1
.equ F_CPU = 3686400
2
.equ CYCLE_HIGH = HIGH( F_CPU / 100 / 3 )
3
.equ CYCLE_LOW = LOW( F_CPU / 100 / 3 ) - 1
Nun wollte ich es halt nur auf avr-as portieren. Aber irgendwie mag der 
nicht.

Wenn ihr dazu eine Lösung habt, wäre ich euch sehr dankbar!

mfg
sep

von sep (Gast)


Lesenswert?

sep schrieb:
> F_CPU wird richtig mit übergeben mit 368600UL
Sry, sind 3686400 macht aber auch keinen großen unterschied.
Was ich mich wundere ist, normalerweise wird das doch durch den 
Präprozessor schon ersetzt. Das sollte es zumindest. Sonst ist es 
sinnlos.

von Andreas B. (Gast)


Lesenswert?

Das -1 muss dann noch in die Klammer mit rein. So funktioniert es auf 
jeden Fall bei mir:
1
#define F_CPU 3686400
2
3
    ldi r18, hi8( F_CPU / 100 / 3 )
4
    ldi r19, lo8( F_CPU / 100 / 3 - 1)
1
test.o:     file format elf32-avr
2
3
4
Disassembly of section .text:
5
6
00000000 <.text>:
7
   0:  20 e3         ldi  r18, 0x30  ; 48
8
   2:  3f ef         ldi  r19, 0xFF  ; 255

von sep (Gast)


Lesenswert?

Andreas B. schrieb:
> Das -1 muss dann noch in die Klammer mit rein.


Dann geht das auch bei mir.
Was ich auch noch geändert habe ist, das F_CPU nun nich mehr das Suffix 
UL bei mir hat. Dann klappte das auch.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

sep schrieb:
> Was ich auch noch geändert habe ist, das F_CPU nun nich mehr das Suffix
> UL bei mir hat.

Ja, der Assembler kennt keine Datentypen und daher auch keine Suffixe,
die ja in C nur einen bestimmten Datentypen für die Konstante
erzwingen sollen.

von Rolle (Gast)


Lesenswert?

Hallo,

ich weiss ja nicht was du mit dem Wert anstellen willst, aber bedenke 
dass die Zerteilung in ein Low-Byte und ein High-Byte in der ersten 
Zeile ohne die -1 und in der zweiten Zeile mit der -1 zu einem ganz 
anderen Gesamt-Wert führt ( siehe Listing von Andreas 0x30,0xff !!!???)

von Rolle (Gast)


Lesenswert?

und zur Übergabe an einen Baudrate-Generater oder 16Bit Timer ungeeignet

Sorry, hab versehentlich absenden gedrückt !!!

von sep (Gast)


Lesenswert?

Sry, ich hab das Thema nun fast vergessen gehabt. Ich wollte eigentlich 
nur eine kleine delay Funktion schreiben. Die ich auch recht exakt in 
asm und C einsetzen kann. Da ich damit nun schon einige Zeit fertig bin, 
poste ich die gerne. Zum einen ist dort die kleinste Einheit eine 
hundertstel Sekunde. Zum nächsten ist die nicht ganz takt-genau aber gut 
ausreichend.
1
.section .text
2
.global kdelay_cs
3
4
kdelay_cs:
5
                ldi r18, hi8( F_CPU / 100 / 3 )
6
        loop1:
7
                ldi r19, lo8( ( F_CPU / 100 / 3 ) - 1 )
8
        loop2:
9
                dec r19
10
                brne loop2
11
12
                dec r18
13
                brne loop1
14
15
        dec r24
16
        brne kdelay_cs
17
18
        ret

Jörg Wunsch schrieb:
> Ja, der Assembler kennt keine Datentypen und daher auch keine Suffixe,
> die ja in C nur einen bestimmten Datentypen für die Konstante
> erzwingen sollen.

Aus diesem Grund übergebe ich F_CPU nochmals bei gas. Dann klappt das 
auch. Also, vielen Dank euch.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du dir mal ansiehst, wie die delay loops in <util/delay_basic.h>
implementiert sind, dann geht das auch alles via inline asm direkt in
C.  Der Vorteil ist, dass man dann den C-Compiler dazu missbrauchen
kann, selbst Gleitkommaausdrücke zur Compilezeit aufzulösen, wie das
in <util/delay.h> gemacht wird.

Noch genauer wird es in den aktuellen (gepatchten) Compilerversionen
durch Benutzung von __builtin_avr_delay_cycles().  Der Compiler kann
dann seinen Overhead selbst mit einplanen.

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.