Forum: Mikrocontroller und Digitale Elektronik Switch Case Anweisung


von Anfänger (Gast)


Lesenswert?

Hallo,
möchte eine Switch Case Anwendung verwenden. Das Programm hat nur die 
Funktion das wenn ich Schalter1 drücke LED 1 Leuchtet... Benütze das 
STK500 und einen Atmega 8. Das Problem ist es leuchtet immer irgendeine 
LED (nach reset ist es meistens eine andere) und es ändert sich nichts 
wenn ich einen Schaltern drücke.
1
#include <avr/io.h>
2
#include <util/delay.h>    //Libary für "_delay_ms()"
3
4
int main(void)
5
{
6
  DDRD=0xff;  //DDRD (LED´s) AUSGANG
7
  DDRB=0x00;  //DDRB (Schalter) EINGANG
8
  PORTD=0xff;  //PORTD (LED´s) PULL-UP Widerstand EIN
9
  PORTB=0xff;  //PORTB (Schalter) PULL-UP Widerstand EIN
10
   
11
    while(1)
12
    {
13
       switch (PINB)
14
     {
15
       case (255):
16
       PORTD=0b01010101;
17
       break;
18
       case (254):
19
       PORTD=0b11111110;
20
       break;
21
       case (253):
22
       PORTD=0b11111101;     
23
       break;
24
       case (251):
25
       PORTD=0b11111011;     
26
       break;
27
       case (247):
28
       PORTD=0b11110111;
29
       break;
30
       case (239):
31
       PORTD=0b11101111;
32
       break;
33
       case (223):
34
       PORTD=0b11011111;       
35
       break;
36
       case (191):
37
       PORTD=0b10111111;     
38
       break;
39
       case (127):
40
       PORTD=0b01111111;     
41
       break;
42
     }     
43
    }
44
}

von Anfänger (Gast)


Lesenswert?

case (255) ist soll nur aktiv sein wenn kein Schalter gedrückt wird.

von Ingo (Gast)


Lesenswert?

Mehr Fehlerbeschreibung bzw. Schaltung zeigen...


Ingo

von Karl H. (kbuchegg)


Lesenswert?

Was ist, wenn du ganz einfach mal das PinB Register auf das PORTD 
Register ausgibst
1
int main(void)
2
{
3
  DDRD=0xff;  //DDRD (LED´s) AUSGANG
4
  DDRB=0x00;  //DDRB (Schalter) EINGANG
5
  PORTD=0xff;  //PORTD (LED´s) PULL-UP Widerstand EIN
6
  PORTB=0xff;  //PORTB (Schalter) PULL-UP Widerstand EIN
7
   
8
  while(1)
9
  {
10
    PORTD = PINB;
11
  }
12
}

entsprechen die LED dann deinen Tasterzuständen?
(Hast du die Taster richtig angeschlossen?)

von spess53 (Gast)


Lesenswert?

Hi

> DDRB=0x00;  //DDRB (Schalter) EINGANG

PB6/7 liegen nicht auf dem Portheader PORTB, sondern auf XTAL1/2 von 
PORTE/AUX.

MfG Spess

von Peter D. (peda)


Lesenswert?

Anfänger schrieb:
> möchte eine Switch Case Anwendung verwenden. Das Programm hat nur die
> Funktion das wenn ich Schalter1 drücke LED 1 Leuchtet

Dann ist Switch Case der falsche Ansatz!
Es nimmt den ganzen Port und das willst Du nicht.

Du willst eine Taste, dann nimm auch nur das eine Bit:
1
  if( !(PINB & 1<<0) ){
2
    // mache was wenn Pegel 0 an Pin B0
3
  }
4
  // usw.
5
  if( !(PINB & 1<<7) ){
6
    // mache was wenn Pegel 0 an Pin B7
7
  }


Peter

von Anfänger (Gast)


Lesenswert?

Danke jetzt funktionierts weiss aber gar nicht genau was ich geändert 
habe :-)

Wie macht ihr das wenn ihr einen bestimmten Port z.B. PB4 abfragen wollt 
und den zustand an z.B. PC2 übergeben wollt.

von Karl H. (kbuchegg)


Lesenswert?

Anfänger schrieb:

> Wie macht ihr das wenn ihr einen bestimmten Port z.B. PB4 abfragen wollt
> und den zustand an z.B. PC2 übergeben wollt.


Gneau so, wie du das da hingeschrieben hast.
Wir nehmen erst mal den ganzen Port

     PINB

und setzen dann von diesem Ergebnis gezielt alle Bits ausser dem 
interessierenden auf 0

     PINB & ( 1 << PB4 )

und wenn da etwas anderes als 0 rauskommt, dann wird eben PC2 auf 1 
gesetzt, bzw. wenn 0 rauskommt, dann wird PC2 auf 0 gesetzt

    if( PINB & ( 1 << PB4 ) )
      PORTC |= ( 1 << PC2 );
    else
      PORTC &= ~( 1 << PC2 );


*** Bitmanipulation ***

von Anfänger (Gast)


Lesenswert?

Danke

von Pako (Gast)


Lesenswert?

Anfänger schrieb:
> Das Problem ist es leuchtet immer irgendeine
> LED (nach reset ist es meistens eine andere) und es ändert sich nichts
> wenn ich einen Schaltern drücke.

default-Zweig vergessen?

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.