Forum: Mikrocontroller und Digitale Elektronik Arduino Register abfragen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hans (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Das ist die Kurzform.

Oliver

von Arduino Fanboy D. (ufuf)


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

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

: Bearbeitet durch User
von Joachim B. (jar)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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.

: Bearbeitet durch User
von Leo C. (rapid)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Joachim B. schrieb:
> andere CPU nennen short 16 bittig.

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

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.