Hallo alle,
ich probiere gerade einen Code von C in BASCOM zu übersetzen. Der Code
ist fürs Charlieplexing. Originalquelle hier:
http://www.dgoersch.info/codesammlung/avr-gcc/50-charlieplexing
Mein Problem ist nun die einzelne Steps. Wie übersetze ich das in
BASCOM. Mein bisheriger Code sieht so aus:
Bitmanipulation> if (lights & 0x00001) tmp |= (1<<1);
IF lights AND &H1 THEN tmp = tmp OR &B10
eventuell auch
IF lights AND &H1 THEN tmp = tmp OR BITS(1)
Textersetzung reicht
C BASCOM
0x00001 &H1
0x00004 &H4
0x00010 &H10
0x00040 &H40
1<<0 &B1
1<<1 &B10
1<<2 &B100
1<<3 &B1000
^ achte mal auf die Zahl der Nullen
Bzw. ist es noch einfacher, wenn BITS() benutzt werden kann
Du kannst jetzt jeden einzelnen Befehl nach Bascom übersetzen. Z.B.
If lights.0 = 1 Then Tmp.1 = 1
entspricht deiner Abfrage.
Allerdings wird das ziemlich ineffizient. Und Charlieplexing riecht per
se zunächst mal zeitkritisch.
Daher wäre es besser, den Sinn zu verstehen und dann in Bascom neu zu
schreiben.
lights ist ein Long Typ in Bascom (uint32_t in C). Wenn du da jedesmal
Operationen auf Long machst, nur um ein Bit abzufragen, dauert das sehr
lange.
Alternativ kannst du 4 Byte Variable per Overlay drüberlegen und diese
dann manipulieren. Geht wesentlich schneller.
-.- schrieb:> ich probiere gerade einen Code von C in BASCOM zu übersetzen. Der Code> ist fürs Charlieplexing. Originalquelle hier:> http://www.dgoersch.info/codesammlung/avr-gcc/50-c...
Ist Dir eigentlich bei dem verlinkten "Programmwerk" aufgefallen, daß
die Verwendung des Output Compare Int völlig sinnfrei ist ? Wär' genauso
ein Ovfl Int gegangen.
Zur Übersetzung, der Code kommt mit <= 240 Takten aus, ginge also auch
noch bei Prescale = 1. Allerdings scheint mir die Charlyplexingfrequenz
bei 8MHz Takt unnötig hoch, da könnte man also einen Prescale von 8 oder
16 nehmen und es wär' immer noch ok.
Na klar habe ich Ideen, nur wenn weder Danke für das Fetzerl Code noch
sonstwas kommt, vergess' ich die alle. Außerdem reagier' ich nicht auf
jmd., niemand, keiner usw.
Geb' Dir aber trotzdem 'nen Tip: Nimm den wissenschaftlichen Windows
Taschenrechner, schalt' auf Hex-Eingabe, gibt die Konstante hinter
If (lights &
ein und konvertier's in Binär.
Mal schauen, ob's dann heller wird...
Die Variable.Zahl Schreibweise ist wohl eine nützliche Spracherweiterung
in BASCOM (Beitrag "Bascom Bit und Byte")
Die Doku dazu finde ich in dem BASCOM Manual auf die Schnelle nicht. Mal
selber suchen.
Auf die Zahlen kommt man einfach, wenn man das Binärsystem und das
Hexadezimalsystem für die Zahlendarstellung kennt. Beides müsste in
wikipedia ausführlich erklärt sein, deshalb hier kurz:
>>> if (lights & 0x00001) tmp |= (1<<1);>> tmp.1 = lights.0
Hexadezimal 0x00001 ist Binär 0b01, d.h. 0. Bit gesetzt. lights.0 ist
das 0. Bit von lights.
(1<<1) ist 1 (Binär: 0b01) um eine Stelle nach links geshiftet also
0b010, d.h. 1. Bit gesetzt. tmp.1 ist das 1. Bit von tmp.
MWS benutzt jetzt einen "Trick": statt bei der Zuweisung in tmp den Wert
(1<<1) zu benutzen, verwendet er den bekannten Wert aus lights.
Damit spart er sich die if Abfrage für lights und kann die
Bitmanipulation schön elegant in dem case Fall unterbringen.
Gut, dann bedank ich mich erstmal für den Code. Funktioniert alles, bis
auf das, dass die anderen Zahlen fehlen.
Zu dem Tipp:
Komisch, wenn ich den ersten Step in Dezimal umrechne, dann komme ich
auf 1,4,16,64. Du hast jedoch in deinem Code 0,2,4,6. Wie kommst du da
drauf. Hab ich irgenwas falsch gemacht. Oder muss ich da die Anzahl der
Nullen in Binär hinschreiben?
> Oder muss ich da die Anzahl der Nullen in Binär hinschreiben?
Das wird dir helfen. Dann siehst du an welcher Position die einzelne 1
steht. Und das ist dann genau die .Zahl
Beim abzählen der Position beachten, dass von rechts nach links
beginnend mit 0 gezählt wird. 00100000 ist Bitposition 5