Forum: Mikrocontroller und Digitale Elektronik Taster schaltet nicht richtig


von Benjamin (Gast)


Lesenswert?

Servus Leute,

Hardware: Arduino Uno, Atmega328P
Sprache: C


ich bin neu auf den Gebiet der Microkontrollerprgrammierung und bin an 
die erste Hürde gestoßen.


zum Problem:
Ich möchte mithilfe eines Tasters eine LED einschalten und bei erneuten 
drücken wieder auschalten.
Ich habe bereits im Forum einige ähnliche Probleme gefunden, konnte es 
aber trotzdem nicht lösen.


Mein Taster hängt an Vcc mit 5 Volt. Beim Drücken des Tasters, wird der 
Strom weiter an PIND1 geschaltet. Am Ausgang des Tasters liegt ein 
Pulldown Wiederstand mit 10K Ohm an Masse an.
Jetzt wo PIND1 Strom bekommt, wird PIND2 geschaltet und die LED mit 
Strom versorgt.
Wenn ich jetzt wieder den Taster drücke sollte die Spannung an der LED 
abfallen und die LED zu leuchten aufhören. Dies passiert aber nicht 
gewollt sondern eher zufällig nach dem 3-4 mal drücken des Tasters.
1
#define F_CRPU 16000000UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include "../../home/ben/Programmierung/stifte.h"
6
7
int main(void)
8
{
9
10
  DDRD = (0 << DDD1) | (1 << DDD2); // Stift 1 als Eingang, Stift 2 als Ausgang
11
  
12
  PORTD &= ~((1 << SD1) | (1 << SD2));   //Beide Stifte auf 0 schalten
13
  
14
  uint8_t taster_gedrueckt = 1;
15
  
16
  while(true)
17
  {
18
    
19
    if (PIND & (1 << SD1)) //Wenn an Stift1 eine Spannung anliegt, Stift 2 schalten
20
    {
21
      if (taster_gedrueckt == 1)
22
      {
23
        PORTD |= (1 << SD2);
24
        taster_gedrueckt--;
25
      }
26
      else
27
      {
28
        PORTD &= ~(1 << SD2);
29
        taster_gedrueckt ++;
30
      }
31
    }
32
 
33
  }
34
  return 0;
35
}

Ich benutze einen Pulldown Wiederstand, weil der sich für mich logisch 
erschließt und ich den Pullup Wiederstand auch nach vielen Websiten und 
googlen nicht verstehe.
Ich habe etwas von Entprellen gelesen, ist das die Lösung meines 
Problems.
Wenn ja, kann man das auch mit einen Pulldown Wiederstand machen, denn 
ich habe es immer nur im Zusammenhang mit Pullup gefunden.


Ich hoffe ich habe jetzt nich zu viel geschrieben und hoffe auf 
Unterstüzung.

Mfg ;-)

von Nico (nico123)


Lesenswert?


von Nikolai.H. (Gast)


Lesenswert?

100nF Kondensator parallel zum Taster zum Entprellen oder entprellen per 
Software

von Harald W. (wilhelms)


Lesenswert?

Benjamin schrieb:

> Wenn ich jetzt wieder den Taster drücke sollte die Spannung an der LED
> abfallen und die LED zu leuchten aufhören. Dies passiert aber nicht
> gewollt sondern eher zufällig nach dem 3-4 mal drücken des Tasters.

> Ich habe etwas von Entprellen gelesen, ist das die Lösung meines
> Problems.

Dann lies mal hier im Tutorial nach, was da über Entprellen steht.
Die sog. Entprellung kann man sowohl hard- als auch softwaremäßig
machen.

von Harald W. (wilhelms)


Lesenswert?

Nikolai.H. schrieb:

> 100nF Kondensator parallel zum Taster zum Entprellen

Aua!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Benjamin schrieb:
> Mein Taster hängt an Vcc mit 5 Volt. ... Am Ausgang des Tasters liegt
> ein Pulldown Wiederstand mit 10K Ohm an Masse an.
Dieser Aufbau ist schlecht, denn wenn du dir mal das Datenblatt des uC 
ansiehst, dann erkennst du, dass du einen Pullup "geschenkt" bekommst 
(oder besser: du hast ihn eh' bezahlt, dann kannst du ihn auch 
verwenden). Du musst ihn nur einschalten...

> Wiederstand
BTW: schreib in Zukunft bitte wie üblich "Widerstand".

von Peter D. (peda)


Lesenswert?

Benjamin schrieb:
> Ich möchte mithilfe eines Tasters eine LED einschalten und bei erneuten
> drücken wieder auschalten.

Das kann so niemals gehen, Du hast ja keine Flankenerkennung drin.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Flankenerkennung
So etwa:
1
 :
2
 :
3
 uint8_t SD1neu, SD1alt;
4
 SD1alt = PIND & (1 << SD1);   
5
6
  while(true)
7
  {
8
    SD1neu = PIND & (1 << SD1); // neuen Pegel abholen
9
10
    if (SD1neu != SD1alt)       // Bei Änderung ausführen
11
    {
12
      taster_gedrueckt++;       // unterstes Bit toggelt
13
14
      if (taster_gedrueckt&&1)  // unterstes Bit abfragen
15
        PORTD |= (1 << SD2);
16
      else
17
        PORTD &= ~(1 << SD2);
18
19
      SD1alt = SD1neu;          // für nächsten Durchlauf merken
20
    }
21
  }
22
  :
23
  :

: Bearbeitet durch Moderator
von m.n. (Gast)


Lesenswert?

Benjamin schrieb:
> Ich möchte mithilfe eines Tasters eine LED einschalten und bei erneuten
> drücken wieder auschalten.

Das geht aber auch mit softer Hardware ;-)
Beitrag "EIN-AUS mit Taster per Interrupt, ATtiny25 o.ä."

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

Bei der Software Lösung schaust Du programmtechnisch ob der Taster 
gedrückt ist, nach ca. 20 - 40 ms schaust Du ob er immer noch gedrückt 
ist, ist das der Fall registrierst Du den Tastendruck und "toggelst" das 
Bit des Ausgangs. Wie Du das mit dem "zweimal checken" nach ein paar ms 
erledigst ist egal. Interrupt ist elegant und sauber, es geht aber auch 
anders. Was nicht geht sind "delay funktionen"!

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.