Forum: Mikrocontroller und Digitale Elektronik Schalter und LED


von Peter (Gast)


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

von Martin B. (martin_b97)


Lesenswert?

Hallo,

schon mal dran gedacht ein

while(1)
{
}

um das ganze zu legen?

Sonst wird das nur einmal beim Programmstart ausgeführt.

Grüße,
Martin

von Sebastian R. (sepp1985)


Lesenswert?

Wie sind die led denn angeschlossen? Senk oder quellbetrieb?

Das mit dem while(1); würde ich trotzdem am Ende setzen.
Zur Antwort davor... Es soll nur einmal ausgeführt werden.

von Martin B. (martin_b97)


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

von Sebastian R. (sepp1985)


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

: Bearbeitet durch User
von Mike (Gast)


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?

von Guest (Gast)


Lesenswert?

LED_PORT ist nicht initialisiert

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.