Forum: Mikrocontroller und Digitale Elektronik Arduino Register abfragen


von Hans (Gast)


Lesenswert?

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

von Hans (Gast)


Lesenswert?

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

von Oliver S. (oliverso)


Lesenswert?

Das ist die Kurzform.

Oliver

von Einer K. (Gast)


Lesenswert?

Hans schrieb:
> Schalter_[1] = PIND & (1<<PD2);

for(byte i=0;i<=3;i++)Schalter_[i+1]=(bool)PIND&(1<<(i+2));

von Joachim B. (jar)


Lesenswert?

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
von Einer K. (Gast)


Lesenswert?

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.

von Leo C. (rapid)


Lesenswert?

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.

von Leo C. (rapid)


Lesenswert?

Joachim B. schrieb:
> andere CPU nennen short 16 bittig.

Wieso andere? short ist auch auf AVR "16 bittig".

von Einer K. (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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
Noch kein Account? Hier anmelden.