Lesen eines gesamten Ports mit PIN statement

Hallo zusammen,

ich bin “Oldie” und von anderen Controllern umgestiegen.
Wollte schnell eine 5 Bit Zahl, eingegeben über 5 Pullup Schiebeschalter , einlesen und weiterverarbeiten.
Die Pin´s von PortB (8-13) sind mit Pulldowns mit je 1 K abgeschlossen.
Warum geht dieses einfache Testprogramm nicht?
Ich bekomme nur wirre Zahlen als Antwort.
Vermutlich ein bloody beginner Fehler.
Wenn mir bitte ein junger Spezialist weiterhelfen könnte.
Danke

Hier mein Test-Listing:

void setup() {
Serial.begin(9600);
DDRB=B00000000; //with extenal pulldown resistors

}

void loop() { //print out the Decimal value of the parallel Port input ???
uint8_t wert;
wert = PINB;
Serial.println (wert);
delay (1000);
}

Vermutlich spielen dir die offenen Eingänge einen Streich

void setup() {
  Serial.begin(9600);
  DDRB=B00000000;   //with extenal pulldown resistors
  PORTB=0xff; // Alle Pullups aktivieren

}

Statt 0xFF kannst du auch nur die Pullups der offenen Eingänge aktivieren.

Ich benötige eine positive Logik.

Dann invertiere einfach das Register:

uint8_t wert = PINB ^ 0xFF;

^ ist ein XOR

Ja, ~ würde auch gehen. Wohl auch einfacher zu verstehen

Ok, aber der Fehler liegt irgendwo anders. Hast du die Schalter richtig angeschlossen? Bei Pullups müssen sie gegen Masse schalten. Bei Pulldowns gegen +5V

Also so ein Aufbau funktioniert bei mir ohne Porbleme, egal ob mit internem Pullup oder externem Pulldown.
Nur wenn ich weder noch verwende dann gibt es "floating Inputs" aber das ist ja klar.

Klingt nach einem "Hardwareproblemchen". :slight_smile:

Pins 8 - 13 auf dem atmega328p oder auf dem Arduino-Board?

Sorry, es macht zwar durchaus Sinn was du schreibst, aber wenn du die Pulldown Widerstände richtig angeschlossen hast, und die Schalter die Signale hochsetzen, weiss ich auch nicht weiter.

  • Geht denn normales “Arduino” - C   Serial.print(digitalRead( 8 ));
  • Was passiert bei combies internal Pullup ?
    Das sollte auch mit deinen (dann überflüssigen) Pulldown -Widerständen gehen.
    Schalter offen: ( 1k / 30k * 5V ) < 0.2V = LOW
    Schalter zu = HIGH wie vorher
    Wildes Zappeln weg, aber immer HIGH = Schau dir die Pulldowns nochmal genau an :wink:

Könnten evtl die beiden msb, welche anderweitig verwendet werden

Meinst du mit msb die Bits PB6 / PB7 an denen der Resonator hängt?
Stimmt, die würde ich nicht mit setzen:

void setup() {
  Serial.begin(9600);
  DDRB &=~0x3f;   // Input ( eigentlich egal )
  PORTB |= 0x3f;  // PB0 .. PB5 Pullups aktivieren
}

michael_x:
Meinst du mit msb die Bits PB6 / PB7 an denen der Resonator hängt?
Stimmt, die würde ich nicht mit setzen

Ja, ich hab zuerst auch geglaubt, dass es irgendwelche Effekte gibt wegen PB6 und PB7 und
DDRB=B00000000;und

PORTB=0xff; // Alle Pullups aktivieren

Aber es macht keinen Unterschied (hab es "am Objekt" ausprobiert) :slight_smile:

Hallo,

die Arduino Nummern haben nichts mit den echten µC Pin Nummern zu tun. Sehr hilfreich sind diese Pinouts.
http://www.pighixxx.com/test/portfolio-items/leonardo/?portfolioID=314
Mit den Arduino Befehlen funktioniert ja alles. Wer direkt auf Register und Ports zugreift muß wissen was er tut.

Mit den Arduino Befehlen funktioniert ja alles. Wer direkt auf Register und Ports zugreift muß wissen was er tut.

… und verraten. Default ist (für mich) immer noch atmega328 :wink:

Ja, der Leonardo ist "etwas eigen"...
Deshalb ist es auch immer recht wichtig zu sagen mit welchem Board man arbeitet. Und wenn nichts dabei steht, gehen wohl die meisten hier von einem UNO (atmega328) aus.

Der Leonardo ist "anders gemappt" als der UNO. Du hast beim Leonardo-Board Zugang zu PB1 bis PB7.
PB1 bis PB3 sind aber nur über den ICSP-Stecker zugänglich.

      Arudino   Arduino
        UNO     Leonardo
------------------------------------
PB0     D8       --
PB1     D9       ICSP SCLK
PB2     D10      ICSP MOSI
PB3     D11      ICSP MISO
PB4     D12      D8
PB5     D13      D9
PB6     --       D10
PB7     --       D11

du kannst ja mal das versuchen

uint8_t wert;

void setup() {
   Serial.begin(9600);
   DDRB =0b0000000;   
   PORTB=0b1111111;   // Pullups aktivieren
}

void loop() {
   wert = PINB;
   Serial.println(wert,BIN);
   delay (1000);
}

durch "Serial.println(wert,BIN);" sieht man sehr schön, welches Bit gerade Null ist.

Allerdings gibt es "komisches Verhalten" bei PB6 (D10), wenn ich das auf meinem Leonardo durchteste.

Aber wie gesagt - der Leonardo ist "irgendwie komisch" :slight_smile:

Das mit den schönen Code und quote Fenstern muss ich noch lernen

Kannst du gerne auch nachträglich bei deinen eigenen Beiträgen üben. Statt QuickEdit More-Modify wählen, und alle Schaltflächen sind da.

Ja, PD5 ist nicht “herausgeführt”.

         Pin am 
         Leonardo Board
-------------------------
 PD0      3 
 PD1      2
 PD2      0
 PD3      1
 PD4      4
 PD5     --
 PD6     12
 PD7      6

Die berühmt-berüchtigten Code Tags:
Code_Tags.jpg

Die berühmt-berüchtigten Code Tags:

Perfekt!
1000 Gummipunkte.

Code-Tags.jpg

Sehr schön, aber millau scheint doch nicht blöd zu sein.
Immerhin kriegt er trotz unserer Tips einen Leonardo per Register-Programmierung in den Griff.

Nachdem sonst alles so gut dokumentiert war, habe ich nicht gedacht, mir die Pinzuordnung selbst aus dem Platinenlayout des Leonardos ableiten zu müssen.

Musst du nicht. Die Pin Mappings gibt es fertig. Google Image Search nach "Leonardo Pin Mapping" oder "Leonardo Pinout" hilft auch

Das ist auch nicht Leonardo spezifisch. Jeder Prozessor hat eine andere Pin Belegung. Das zu vereinheitlichen ist eine Sache die die Arduino Software so attraktiv macht

Hallo,

ich stelle fest, dass kaum noch jemand ordentlich liest. Alle schreiben nur noch wild durcheinander.
Das ärgert mich immer und immer wieder.

Pin Mapping gibts hier und schon in Beitrag #10.
https://www.arduino.cc/en/Main/ArduinoBoardLeonardo

Und man sollte schon stutzig werden wenn die Arduino Nummern durchnummeriert sind aber die Port-Register immer nur von 0 bis 7 nummeriert sind.

Und ein Leonardo hat immer ein ATmega32u4 drauf. Keinen 328er.
Aber das wird erst in Beitrag #9 so nebenbei erwähnt. Von daher gibts dafür keinen Vorwurf.

Millau:
Danke für die Blumen Faraday,

Und irgendwann blickst du auch noch dieses Forum :slight_smile: :slight_smile:

Warum wurden hier alle Beiträge von Millau gelöscht???

Das war ich,
es schien mir zu viel Aufwand wegen des kleine Problems,
Es tut ja nun und ich hänge wie Du siehst beim nächsten durch das ich mich durchbeißen muss
Grüße

Und nun hat man einen Sinnfreien Thread den keiner mehr versteht.

Und erst Recht nichts mehr woraus ein dritter mit Suchfunktion Nutzen ziehen kann.

Sowas macht man eigentlich nicht, auch wenn es wie hier geht.