switch-Anweisung,3taster,3leds

Gast #2974494
Lesenswert?

Hallo

Ich habe ein Stk500-Board und möchte gerne eine Programm schreiben
welches beim betätigen des Schalter 0 die LED 0 leuchten lässt und
bei Schalter 1 halt die LED 1 usw.

Eine einfache Lösung habe ich schon durch rumspielen gefunden
PORTD=PINB aber ich möchte es trotzdem zur Übung mit der 
switch-Anweisung machen kann mal einer drüberschauen? (Meine LEDS sind 
LOW Aktiv!)

Es funktioniert nur der case 0xFC nicht

#include <avr/io.h>



int main(void)
{



  DDRD= 0xFF;
  PORTD= 0xFF;
  PORTB =0xFF;

  while(1){

    switch(PINB){


      case 0xFE:
      PORTD&= ~((1<<PD0));
      break;

      case 0xFD:
      PORTD&= ~((1<<PD1));
      break;

      case 0xFC:

      PORTD&= ~((1<<PD2));
      break;

      default:

      PORTD = 0xFF;
      break;

          }
}  }
Gast #2974538
Lesenswert?

Grundsätzlich geht auch switch
Nur ist der Wert für den 3ten Eingang falsch

Schreibs mal binär, dann wirds klar:

11111110   0xFE
11111101   0xFD
11111011   0xFB

Und damit bist du auch schon beim nächsten Problem:
Was passiert wenn mehr als 1 Taste gedückt wird?
Nichts!

Dazu mußt du die Eingänge maskieren.

Dazu ist IF() dann natürlich besser geeignet
#2974543
Lesenswert?

Azubi schrieb:
> @Karl Heinz Buchegger
>
> Darf ich fragen wieso mal nie den ganzen Port abfragen sollte?

Weil du dann immer ALLE Möglichkeiten berücksichtigen müsstest. Egal was 
sonst noch so an diesem Port hängt.
Dich interessiert aber nur der eine Taster. Also fragst du auch nur den 
ab.
Die restlichen Portpins können machen was sie wollen, 0 oder 1 sein 
soviel sie wollen - du willst an dieser Stelle im Programm nur wissen, 
ob dieser EINE Pin 0 oder 1 ist - weil da der Taster drann hängt. Und 
nur dieser EINE Pin regelt, was die LED tun soll. Und für die nächste 
Kombination LED-Taster ist es dann eben ein anders Bit vom Port. Aber 
auch wieder nur EINES - alle anderen sind bei dieser konkreten 
Fragestellung nach dieser EINEN Led uninteressant. Um die willst du dich 
gar nicht kümmern müssen.
#2974553
Lesenswert?

Azubi schrieb:
> Darf ich fragen wieso mal nie den ganzen Port abfragen sollte?

Weil Dich in diesem Fall nur das eine Bit interessiert. Das enthält die 
Information, ob der Schalter gedrückt ist oder nicht. Über die anderen 
Bits darfst Du keine Annahmen machen.

Solange Du das Programm auf dem STK500 laufen lässt und an dem Port nur 
die Schalter hast von denen nur einer gleichzeitig gedrückt wird, 
funktioniert das Programm, weil die anderen Bits "zufällig" immer auf 1 
stehen, so wie Du es erwartest.

Vielleicht schließt Du aber später noch etwas anderes an den Port an und 
erweiterst das Programm. Dann ist eines der anderen Bits plötzlich nicht 
mehr ständig 1 sondern auch mal 0. Und dann geht die Abfrage des 
Schalters schief, obwohl das andere Bit überhaupt nichts mit dem 
Schalter zu tun hat.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren