Bascom zu C: loadadr

OP #3239012
Lesenswert?

Von einem Ebay Händler habe ich ein Paar RGB-Leds mit integrierten 
WS2812 Controller gekauft. Ich versuche gerade, den mitgelieferten 
Bascom-Code 
(http://kt-elektronic.de/wawi11/artikeldaten/led-ws2812-rita/ws2811_v1_bascom.pdf) 
auf C zu portieren. Nun klemmt es aber bei Sub Send_frame_800 bei 
Loadadr. Das ist keine konforme Asm-Anweisung, also ich kann nicht
1
__asm__("Loadadr Last_channel, X");
 schreiben. Die wurde nur von Bascom hinzugemodelt. Wie kann ich das 
portieren?
Gast #3239054
Lesenswert?

> Aber mit Aussagen wie "load address into R26 and R27" kann ich
> nichts anfangen.

Dann kuck mal intensiver in die Doku, weil es tut ebendies - es lädt die 
Adresse (der Variable) in die Register R26 und R27.

Warum er das tut? -> Reverse-engineering des Codes mit anschließendem 
rauspfriemeln, was er ∗eigentlich∗ erreichen will. Wie man das in C 
hinschreibt? -> Das weisst Du, wenn Du der Statements Gesamtsemantik 
ermittelt hast.

HF
Gast #3239057
Lesenswert?

Hi

>Schön für Dich. Aber bringt der was wenn Du C auf AVR programmieren
>willst?

Die zeitkritischen Routinen des Programms sind in Assembler geschrieben. 
Die lassen sich nicht einfach in C übersetzen ohne das Timing zu 
versauen.

>Nein. Ich brauch kein Assembler. Aber mit Aussagen wie "load address
>into R26 and R27" kann ich nichts anfangen.

R26 und R27 bilden zusammen Doppelregister X. Das kann als Pointer auf 
Daten im Ram verwendet werden. Mit 'Loadadr Last_channel, X' wird also 
die Adresse von Last_Channel in X geladen.

Ohne Assembler wird das wohl nichts.

MfG Spess
Gast #3239079
Lesenswert?

> Die zeitkritischen Routinen des Programms sind in Assembler geschrieben.

..weil Bascom regelmäßig brontal aufgeblähten Code produziert.

> Die lassen sich nicht einfach in C übersetzen ohne das Timing zu
> versauen.

Das ist prinzipiell korrekt, wird hier allerdings wenig relevant sein - 
die tun da nix aussergewöhnliches, das bekommt der Optimierer hin. 
Einfach(tm) in C hinschreiben, Optimierer einschalten und klücklich sein 
dass es so einfach(tm) geht.
Gast #3239095
Lesenswert?

Korrektur: Habe eben nochmals ins Datenplatt geschaut: Timing ist hier 
hinreichend relevant, also einfach(tm) den betroffenen Codeteil (nachdem 
er verstanden worden ist) in (inline) Assembler hinschreiben :-)
Gast #3239165
Lesenswert?

Hi

>Jetzt zeigt der mir irgendeinen Error an. Ich arbeite mit Atmel Studio
>6. Im Anhang ist noch mal der komplette Code und ein Screenshot von den
>Errors.

wird denn dein s-File erzeugt und wenn ja, was steht drin?

> __asm__("ldi XL, Low(Last_channel)");
> __asm__("ldi XH, High(Last_channel)");

Ich habe geschrieben, das das der normale Assembler ist. Bist du sicher, 
das es Low und High im Assembler des GCC gibt? Bin mir nicht sicher, 
aber unter C wird meinesachtens lo/hi oder lo8/hi8 verwendet.

MfG Spess

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