Arduino Register abfragen

Gast #4798132
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
Gast #4798350
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.
#4798442
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.
#4798587
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.