Forum: Mikrocontroller und Digitale Elektronik Assembler in C-Code integrieren


von markus (Gast)


Lesenswert?

Hallo

Ich benütze einen Tiny13 mit 1k Flash und muss dazu sehr sparsam 
programmieren.

An Stelle von
PORTB |= (1 << 3);
versuche ich Assembler folgendermassen in C-Code zu integrieren:
asm volatile ("sbi PORTB, 3");

Doch leider erscheinen dabei die 2 Fehlermeldungen:
C:\Users\me\AppData\Local\Temp/ccd2aXXf.s: Assembler messages:
C:\Users\me\AppData\Local\Temp/ccd2aXXf.s:141: Error: constant value 
required

Was bedeutet das? Wie kann ich den Assembler-Code korrekt einbauen?
Bin um eure Hilfe sehr dankbar!!!

von Peter D. (peda)


Lesenswert?

markus schrieb:
> An Stelle von
> PORTB |= (1 << 3);
> versuche ich Assembler folgendermassen in C-Code zu integrieren:
> asm volatile ("sbi PORTB, 3");

Schau mal ins Listing, der Compiler macht genau das (Optimierung -Os).
Assembler ist hier völlig unnötig.


Peter

von Christopher G. (cbg)


Lesenswert?

markus schrieb:
> An Stelle von
> PORTB |= (1 << 3);
> versuche ich Assembler folgendermassen in C-Code zu integrieren:
> asm volatile ("sbi PORTB, 3");

Macht das der Compiler nicht automatisch? Der gcc optimiert einzelne 
Bits setzen  löschen zu sbi  cbi.
Du kannst nicht einfach PORTB usw hinschreiben, das ist etwas 
komplizierter.
Hier das Inline-ASM Manual 
http://www.nongnu.org/avr-libc/user-manual/inline_asm.html

von Reinhard Kern (Gast)


Lesenswert?

markus schrieb:
> C:\Users\me\AppData\Local\Temp/ccd2aXXf.s:141: Error: constant value
> required
> Was bedeutet das? Wie kann ich den Assembler-Code korrekt einbauen?

Genau das was da steht: die Ports des µC müssen Konstanten sein. Ein 
angeschlossenes Ventil liegt ja schliesslich nicht mal auf diesem und 
dann auf einem anderen Port.

Gruss Reinhard

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.