Drehschalter auslesen

Gast #2824244
Lesenswert?
• ▲
▼
Hallo zusammen,
ich habe ein kleines Problem und sehe den Fehler dabei nicht.
ich habe einen Hex-Drehschalter mit 4 Ausgängen an einen Attiny2313 
angeschlsosen(Bitwertigkeit 1 an PD2,...,Bitwertigkeit 8 an PD5) und 
möchte je nach Schalterstellung einen anderen Programmteil bearbeiten. 
Allerdings funktioniert das Auslesen im Controller nicht richtig. Es 
werden alle Pins als high-Zustand obwohl KEIN Pull-up aktiviert ist.

Hier mein Quellcode:

int main(void)
{
   uint8_t temp;
   DDRD &= ~((1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5));
   PORTD &= ~((1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5));
   for(;;)
   {
     temp = PIND;

     if(temp && PD2)
     {
     mache dein Zeug
     }
     ...usw
   }

}
#2824273
Lesenswert?
• ▲
▼
Mark schrieb:
> Also kann ich ohne externen Pull-Up bzw. Pull-Down das Problem nicht
> lösen?

Kommt drauf an, wie du deinen Drehschalter verkabelt hast.
Wenn der einfach einen Pin von den 4-en nach Masse durchschaltet und die 
internen Pullup aktiviert sind, dann geht das wunderbar.

Du baust deinen Schalter so ein, wie du 4 Taster einbauen würdest. Nur 
dass die alle eben bereits im Drehsschalter selber auf einen gemeinsamen 
Pin zusammengeführt sind, der dann an Masse verkabelt wird.


(Und geh von dem unbedingten "Ich will die eine Auswahl unbedingt als 1 
Bit sehen" weg. Das ist eine 'Anforderung' die kein Mensch braucht, die 
sich in Software ganz leicht auch anders rum berücksichtigen lässt und 
die die Dinge nur kompliziert macht. Alle sind 1, nur der eine 
ausgewählte ist 0. So wie man das bei Tastern auch macht.)
#2824481
Lesenswert?
• ▲
▼
Hallo Mark,

hier ist noch eine weiter Hilfe,
mit
1
PORTD &= ~((1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5));

schaltet man die internen Pullup aus.

Demzufolge mit
1
PORTD |= (1 << PD2) | (1 << PD3) | (1 << PD4) | (1 << PD5);

ein.

Das würde ich auch noch auf negative Logic (low aktiv) ändern:
1
   for(;;)
2
   {
3
     temp = ~PIND;
4

5
     if( temp & (1<<PD2) )
6
     {
7
     mache dein Zeug
8
     }
9
     ...usw
10
   }

Super jetzt geht es.
#2824633
Lesenswert?
• ▲
▼
Der Fehler liegt hier:
1
if(temp && PD2)
Der 8-Bit Wert temp wird mit dem 1-Bit-Wert PD2 verundet. Dabei kommt 
seltsames raus. In C ist nämlich bei einer logischen Verknüpfung alles 
TRUE, was nicht 0 ist. Also wird bei irgend einem gesetzten Pin an Port 
D der temp-Teil immer als TRUE interpretiert.

tschuessle
Bernhard

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.