Switch Case Anweisung

Gast #2751025
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
}
#2751042
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?)
#2751064
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
Gast #2751101
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.
#2751115
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 ***

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