Forum: Mikrocontroller und Digitale Elektronik Einfache Schalter>LED-Schaltung: Register brauchen mehrere Sekunden zum Reset


von Michael N. (jeanorwin)


Lesenswert?

Guten Mittag zusammen,
ich bin relativ blutiger Anfänger in der Mikrocontroller-Programmierung. 
Ich bin gerade dabei, eine einfache LED so lange anzuschalten, wie ein 
Schalter gedrückt ist. Das ganze funktioniert auch, allerdings bleibt 
die LED nach dem "Loslassen" des Buttons noch einige Sekunden (~5) 
angeschaltet, bis sie schließlich aus geht. Per Suchmaschine habe ich 
dazu keine wirklich passenden Lösungen gefunden - ich hatte "als erstes 
Projekt" in der Vergangenheit auch eine Siebensegmentanzeige 
angesteuert, damals wurde "sofort" umgeschalten, als ein Schalter nicht 
mehr gedrückt war.
1
#include <avr/io.h>
2
#include <stdlib.h>
3
4
int main(){
5
  DDRB = 0x00;
6
7
  PORTC = 0xFF;
8
  DDRC = 0xFF;
9
10
  while(1)
11
  {
12
    if(PINB & (1<<PINB0) ){
13
      PORTC = 0x00;
14
    }
15
    else{
16
      PORTC = 0xFF;
17
18
    }
19
  }
20
21
  return 1;
22
}

Atmega 328P, als Entwicklungsboard nutze ich einen Arduino Uno (ohne 
Arudino-Laster) mit USBasp-Programmer und Eclipse.

: Bearbeitet durch User
von soft-UART (Gast)


Lesenswert?

Ist der Eingang des µC irgendwie mit einem Widerstand beschaltet, der 
bei offenem Schater einen definierten Pegel vorgibt? Oder ist der 
Eingang einfach offen?

von Michael N. (jeanorwin)


Lesenswert?

Der Eingang ist bei "Button nicht gedrückt" nicht geschaltet, bei 
"Button gedrückt" auf +5V

von mhm (Gast)


Lesenswert?

Michael N. schrieb:
> Der Eingang ist bei "Button nicht gedrückt" nicht geschaltet, bei
> "Button gedrückt" auf +5V

Also ist der Eingang bei "Button nicht gedrückt" in der Luft? Dann mach 
da mal noch an den Eingang einen 10k Widerstand nach Masse, oder schalte 
den Button so, dass er nach Masse schaltet und aktiviere die internen 
Pullups des AVRs (ins PORTx-Register für den Eingang eine 1 schreiben).

von soft-UART (Gast)


Lesenswert?

Da ist der Fehler.

Der Eingang des µC ist hochohmig. Nach dem Loslassen des Tasters ändert 
sich der Pegel am Eingang eher nicht oder eher zufällig.

Mach mal einen Widerstand von 10 kOhm oder 47 kOhm oder ... gegen GND . 
Dann erkennt der Portpin den offenen Taster und gut.

von gatsby (Gast)


Lesenswert?

Hallo Michael,

füge mal nach
  DDRB = 0x00;

die Zeile
  PORTB = 0xFF;

ein und schliesse deinen Taster vom Port B0 nach Ground an.
Mitn der Zeile werden die Pullup Widerstände eingeschaltet und man 
erhält immer definierte Zustaände
Ach ja, das Ein-Ausschalten solltest du natürlich auch vertauschen, da 
jetzt die LED leuchten wenn der Schalter nicht gedrückt wird.

Viel Erfolg
gatsby

von Michael N. (jeanorwin)


Lesenswert?

Das Schalten von GND und die Aktivierung der Pull-Up-Widerstände hat 
geholfen. Vielen Dank an alle! Kommt auf die Best-practice-Liste :-)

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.