Hallo, ich habe mich jetzt noch nicht alzu lange mit den Registern des Arduinos beschäftigt und hänge gerade beim abfragen einzelner Pins als Schleife. Dachte mir irgend etwas in diese richtung: for (short i = 0; i <= 3 ; i++){ Schalter_[i] = PIND & (1<<PD[i]); if (i == 4){(i=0);} } nur sollte es eben funktionieren. Irgendwie hab ich ein Brett vorm Kopp Wie bekomm ich das PD.... Variabel? Grüße
ich suche quasie die Kurzform für diesen Ausdruck: Schalter_[1] = PIND & (1<<PD2); Schalter_[2] = PIND & (1<<PD3); Schalter_[3] = PIND & (1<<PD4); Schalter_[4] = PIND & (1<<PD5);
Hans schrieb: > Schalter_[1] = PIND & (1<<PD2); for(byte i=0;i<=3;i++)Schalter_[i+1]=(bool)PIND&(1<<(i+2));
arduino hört sich nach gcc an, wäre da statt Hans schrieb: > short nicht uint8_t oder int8_t besser? short kann mehrdeutig sein erst Recht im übergeordneten Codetausch, andere CPU nennen short 16 bittig. man könnte vermutlich auch ein define nutzen #define Schalter(i) PIND&(1<<(i+2))
:
Bearbeitet durch User
Joachim B. schrieb: > erst Recht im übergeordneten Codetausch Ich verwende hier byte! Entspricht dem uint8_t > arduino hört sich nach gcc an, wäre da > nicht ... uint8_t ... besser? Naja... Es gibt auch viele 32 Bit Arduinos, bzw. über die IDE nutzbare µC. Da kann dann uint8_t oder byte evtl ungünstiger sein. Aber egal. Das ist Mikrooptimierung! Und damit in den seltensten Fällen interessant.
Hans schrieb: > ich suche quasie die Kurzform für diesen Ausdruck: > > Schalter_[1] = PIND & (1<<PD2); > Schalter_[2] = PIND & (1<<PD3); > Schalter_[3] = PIND & (1<<PD4); > Schalter_[4] = PIND & (1<<PD5); Oliver S. schrieb: > Das ist die Kurzform. Stimmt. Arduino F. schrieb: > for(byte i=0;i<=3;i++)Schalter_[i+1]=(bool)PIND&(1<<(i+2)); Wenn es funktionieren würde, wäre es nicht das, was Hans wollte. Es funktioniert aber nicht, weil "((bool)PIND) & (1<<(i+2))" immer 0 ergibt. Gedacht war wohl "(bool)(PIND & (1<<(i+2)))", was aber sehr umständlichen Code generiert. Ich würde das eher so schreiben:
1 | unsigned char v = PIND>>2; |
2 | |
3 | for(unsigned char i = 1; i < 5; i++) { |
4 | Schalter_[i] = v&1; |
5 | v >>= 1; |
6 | }
|
Hätte auch den Vorteil, daß der Port nur einmal angefasst wird. Aber, siehe oben.
Joachim B. schrieb: > andere CPU nennen short 16 bittig. Wieso andere? short ist auch auf AVR "16 bittig".
Leo C. schrieb: > Gedacht war wohl "(bool)(PIND & (1<<(i+2)))", was aber sehr > umständlichen Code generiert. Ja! Woran man sieht: Erstens: Besser keinen ungetesteten Code veröffentlichen Zweitens: Dass ich selber sowas nicht einsetze.
Leo C. schrieb: > Wieso andere? short ist auch auf AVR "16 bittig". ah, hatte ich das falsch übernommen von oben ich habe seit 20 Jahren nichts mehr auf einer x86 in C professionell programmiert und am AVR nie "short" verwendet, von daher wusste ich nicht wie das gcc bei AVR auf short reagiert. Ich lasse mich immer vom Titel blenden 8-bit AVR aber klar, der m1284p hat ja 128KB flash mit 16-bit Adressen -> 128k kann man als alter 6502er durcheinander kommen.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.