bitWrite() ziemlich langsam?

Hallo,

ich habe den Eindruck, dass bitWrite() recht langsam ist! Ich führe es alle 50ms 384 mal in Kombination mit bitRead() aus und muss feststellen, dass das merklich Zeit benötigt. Woran liegt das?

Ersetze ich bitWrite() mit bitClear und bitSet dauert es ebenso recht lange.

Es fiel mir auf, weil ich einige LEDs im loop() immer wieder beschicke. Das sieht man natürlich nicht, aber da ich alle 50ms den Zustand einiger LEDs ändere (eben per bitWrite()) flakert es nun.

Gibt es alternativen? Bzw was würdet ihr tun?

Gruß Metti

Ja, das ist so. Das gleiche gilt für digitalWrite(pin, ststus); Du kannst es beschleunigen indem Du direkt auf die Ausgangsports zugreifst: http://www.arduino.cc/en/Reference/PortManipulation oder direkt die Bits in der Variable setzt.

Grüße Uwe

Jaaah, DDR, PORT und PIN kommen mir bekannt vor^^

Aber wie kann ich die Bits einer Variable einzeln setzen?

Funktioniert nur bei Variablen vom Typ Byte. Setzen indem Du mit dem bit das zu setzen ist mit 1 oder verknüpfst. byte = byte | B00000001 // setzt das bit 0 Löschen indem Du mit 0 und verknüpfst byte =byte & B11111110 /// löscht bit 0 http://arduino.cc/en/Reference/BitwiseAnd

Bist Du sicher, daß Du das über Variablen machen willst und nicht direkt die Ports auch als Speicher verwenden kannst/willst.

Grüße Uwe

Danke für die Erklärungen!

Im Grunde müsste es doch auch mit größeren Datentypen gehen oder?

Jedenfalls wollte ich es dann so machen, wie du vorgeschlagen hast.
Der Einfachheit halber wollte ich mir eine Funktion schreiben, die mir das dann erledigt…

Dann hab ich mal in die Definitionen reingeschaut:

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
#define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
#define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))

Also genau das, was ich schreiben wollte…
Keine Ahnung, wie ich das noch beschleunigen soll…

Shifting Operationen über den 8 Bit des Prozessors müssen halt manuell erledigt werden... Das kann schonmal dauern...