Schalter und LED

Gast #3544676
Lesenswert?

Ich stehe gerade absolut auf dem Schlauch! :(

Ziel: BUTTON1-4 beim starte auslesen und die zugehörige Led anmachen.
Aufbau: 4 Schalter (keine Taster!) + 4 Leds mit Vorwiderstand
Problem: Alle Leds leuchten obwohl nicht alle Schalter an sind. d.h. 
b1-4 wird auf 1 gesetzt obwohl es nicht sein dürfte.
Frage: Sieht jemand den Fehler?

1
#include <avr/io.h>
2
#include <stdlib.h>
3
#include <util/delay.h> 
4

5
#define LED_DDR DDRB
6
#define LED_PORT PORTB
7
#define LED1 PB3
8
#define LED2 PB4
9
#define LED3 PB5
10
#define LED4 PB6
11

12
#define BUTTON_DDR DDRA
13
#define BUTTON_PORT PORTA
14
#define BUTTON_PIN PINA
15
#define BUTTON1 PINA1
16
#define BUTTON2 PINA2
17
#define BUTTON3 PINA3
18
#define BUTTON4 PINA4
19
#define BUTTON1_p PA1
20
#define BUTTON2_p PA2
21
#define BUTTON3_p PA3
22
#define BUTTON4_p PA4
23

24
void init(void);
25

26

27
int main (void)
28
{
29

30
init();
31

32
uint8_t b1,b2,b3,b4;
33
b1 = 0; b2 = 0; b3 = 0; b4 = 0;
34

35
if ( BUTTON_PIN & (1<<BUTTON1) ) {  b1 = 1;}
36
if ( BUTTON_PIN & (1<<BUTTON2) ) {  b2 = 1;}
37
if ( BUTTON_PIN & (1<<BUTTON3) ) {  b3 = 1;}
38
if ( BUTTON_PIN & (1<<BUTTON4) ) {  b4 = 1;}
39

40
if (b1 == 1) { LED_PORT |= (1<<LED1); }
41
if (b2 == 1) { LED_PORT |= (1<<LED2); }
42
if (b3 == 1) { LED_PORT |= (1<<LED3); }
43
if (b4 == 1) { LED_PORT |= (1<<LED4); }
44

45
}
46

47
void init(void)
48
{
49
  LED_DDR |= (1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4);
50
  
51
  BUTTON_DDR &= ~((1<<BUTTON1_p) | (1<<BUTTON2_p) | (1<<BUTTON3_p) | (1<<BUTTON4_p));
52
  BUTTON_PORT |= (1<<BUTTON1_p) | (1<<BUTTON2_p) | (1<<BUTTON3_p) | (1<<BUTTON4_p);
53
}

mfg Peter
#3544819
Lesenswert?

@ Sebastian R.

ich stimme dir ja zu, daß meine Lösung nicht der gewünschten Funktion 
des Programms entspricht. Zum Debuggen wäre es jedoch einfacher direkt 
zu sehen, was passiert.

Mit der While-Schleife könnte der TO halt direkt sehen was passiert wenn 
er einen Schalter umlegt und daraus erkennen was evtl. falsch ist.

Die LEDs könnten natürlich auch noch verpolt sein.

Grüsse,
Martin
#3545130
Lesenswert?

Martin B. schrieb:
> @ Sebastian R.
>
> ich stimme dir ja zu, daß meine Lösung nicht der gewünschten Funktion
> des Programms entspricht. Zum Debuggen wäre es jedoch einfacher direkt
> zu sehen, was passiert.
>
> Mit der While-Schleife könnte der TO halt direkt sehen was passiert wenn
> er einen Schalter umlegt und daraus erkennen was evtl. falsch ist.
>
> Die LEDs könnten natürlich auch noch verpolt sein.
>
> Grüsse,
> Martin

Joah dafür wäre es net schlecht. Sollte ja kein Vorwurf sein.

Ich persönlich mag diese ganzen definie aus den Bibliotheken net.
Mit den PB1 etc. Ich definiere mir da lieber selber was.

Macht man eigentlich beim Init. auch den Port vorstellen auf nen Wert? 
Also das ich da die Ausgänge passend Stelle und nicht drauf gehe, das 
sie Null sind.

Was für ne Programmiersoftware nutzt du eigentlich?

Die Schalter arbeiten ja im Senkbetrieb oder? Also laut Programm wäre 
das so.

MfG
Sebastian
Gast #3545145
Lesenswert?

Sebastian R. schrieb:
> Ich persönlich mag diese ganzen definie aus den Bibliotheken net.
> Mit den PB1 etc. Ich definiere mir da lieber selber was.

Das kannst du gerne machen.
Und wie machst du das ohne die defines aus den Bibliotheken, wenn du mit 
deinem Code auf einen anderen Prozessor ziehst und nicht das Rad neu 
erfinden möchtest?

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