Forum: Mikrocontroller und Digitale Elektronik switch-Anweisung,3taster,3leds


von Azubi (Gast)


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;

          }
}  }

von Peter II (Gast)


Lesenswert?

Azubi schrieb:
> Es funktioniert nur der case 0xFC nicht

kann ja auch nicht gehen. Switch ist hier die falsche weg. Warum nicht 
IF verwenden?


if (Taster1) {
   LED1 = 1;
} else {
   LED1 = 0;
}

von Karl H. (kbuchegg)


Lesenswert?

Azubi schrieb:

> Es funktioniert nur der case 0xFC nicht

Gewöhn dir das gleich wieder ab.

Man fragt nie den kompletten Port ab, sondern holt sich das eine Bit 
raus, an dem der Taster hängt. Alles andere ist Murks.

   if( ! ( PINB & ( 1<<PB0) ) )      // Taster an PB0


   if( ! ( PINB & ( 1<<PB1) ) )      // Taster an PB1


Bitmanipulation

von Azubi (Gast)


Lesenswert?

@Karl Heinz Buchegger

Darf ich fragen wieso mal nie den ganzen Port abfragen sollte?
(nicht böse gemeint sondern aus interess)

von hans_f83 (Gast)


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

von Karl H. (kbuchegg)


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.

von Fabian O. (xfr)


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.

von Azubi (Gast)


Lesenswert?

@  hans_f83 (Gast)

stimmt

von Peter D. (peda)


Lesenswert?

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

Wenn Dich ein Pin von einem Byte interessiert, hast Du 128 Case mit Pin 
= 0 und 128 Case mit Pin = 1.

Ich würde daher sagen, ein If/else ist einfacher zu schreiben, als 256 
Case. Gehen tut prinzipiell aber beides.


Peter

von Azubi (Gast)


Lesenswert?

danke das ihr mir geholfen habt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.