Forum: Mikrocontroller und Digitale Elektronik Bascom zu C: loadadr


von Peter K. (peterka2000)


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?

von g457 (Gast)


Lesenswert?

> Wie kann ich das portieren?

Doku [0] lesen und interpretieren, dann den Code reverse-engineeren und 
rauspfriemeln was die damit ∗eigentlich∗ erreichen wollen, dann den Code 
adäquat in C hinschreiben.

HTH

[0] http://avrhelp.mcselec.com/loadadr.htm [1]
[1] die Frames scheinen gelegentlich zu saugen, Seite nochmals laden 
hülft bei leerer Anzeige

von Peter K. (peterka2000)


Lesenswert?

Achso: Was ich vergessen hab: Ich kann Zero Assembler

von g457 (Gast)


Lesenswert?

> Ich kann Zero Assembler

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

von Peter K. (peterka2000)


Lesenswert?

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

von g457 (Gast)


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

von Spess53 (Gast)


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

von Peter K. (peterka2000)


Lesenswert?

Ich glaube ihr habt mich etwas falsch verstanden. Ich möchte nicht ohne 
Bascom und ohne Assembler auskommen. Ich möchte nur ohne Bascom 
auskommen. Meine Frage war jetzt: Wie schreibe ich Loadadr Last_channel, 
X in reinen Assembler.

von g457 (Gast)


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.

von g457 (Gast)


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 :-)

von Spess53 (Gast)


Lesenswert?

Hi

>Meine Frage war jetzt: Wie schreibe ich Loadadr Last_channel,
>X in reinen Assembler.

Im AVR-Assembler (Nicht den von C) sieht das so
1
 ldi XL, Low(Last_channel)
2
 ldi XH,High(Last_channel)

aus.

MfG Spess

von Peter K. (peterka2000)


Angehängte Dateien:

Lesenswert?

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.

von Spess53 (Gast)


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

von Peter K. (peterka2000)


Lesenswert?

Ich hab jetzt eine Library dafür gefunden. Die läuft auch. Das werde ich 
später noch mal probieren.

von Volker Block (Gast)


Lesenswert?

probier mal:

  // Loadadr Zeit , X          ersetzen

  "ldi r26,lo8(zeit)       \n\t"
  "ldi r27,hi8(zeit)       \n\t"

von Volker Block (Gast)


Lesenswert?

g457: deine Antworten sind leider kein Hilfe, ich hatte das gleiche 
Problem

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.