Forum: Mikrocontroller und Digitale Elektronik Tasten Problem


von Richard Brose (Gast)


Lesenswert?

Hallo,

ich habe diese Taster in meiner Schaltung verbaut: TASTER 3301D
Bei Reichelt: 
http://www.reichelt.de/?SID=20Ctu806wQARQAAEeXKgY3321b41fe5c8c98f266acc75369ce10d;ACTION=3;LA=4;GROUP=C223;GROUPID=3278;ARTICLE=27894;START=0;SORT=artnr;OFFSET=1000


Ich habe den Taster gegen GND verbaut und das andere Ende an PD0.

Wenn ich jetzt:
1
DDRD &= ~(1 << PD0); //Input
2
PORTD |= (1 << PD0);  // Pull-Up Widerstand aktivieren
3
4
  if ( !(PIND & (1<<PIND0)) ) {
5
    //Mach was
6
  }

abfrage ... passiert nichts. :-(

Darf ich den Taster nicht ohne ein Widerstand einbauen? Ich dachte es 
reicht der interne Pull-Up Widerstand.

von Falk (Gast)


Lesenswert?

@Richard Brose

>Ich habe den Taster gegen GND verbaut und das andere Ende an PD0.

Soweit so gut.

>Wenn ich jetzt:
>DDRD &= ~(1 << PD0); //Input
>PORTD |= (1 << PD0);  // Pull-Up Widerstand aktivieren

>  if ( !(PIND & (1<<PIND0)) ) {
>    //Mach was
>  }

>abfrage ... passiert nichts. :-(

Ähh, sollte das nicht heissen

 if ( !(PIND & (1<<PD0)) ) {

???

>Darf ich den Taster nicht ohne ein Widerstand einbauen? Ich dachte es
>reicht der interne Pull-Up Widerstand.

Das reicht auch.

MfG
Falk


von johnny.m (Gast)


Lesenswert?

@Falk:
> Ähh, sollte das nicht heissen

> if ( !(PIND & (1<<PD0)) ) {

> ???
Das ist in dem Falle gehopst wie gesprungen. Sowohl PD0 als auch PIND0 
sind durch ein "#define <hier entweder PD0 oder PIND0 einsetzen> 0" 
definiert. Ich vermute mal eher, da fehlt eine Entprellung...

von Richard Brose (Gast)


Lesenswert?

Mit der Entprellung geht es auch nicht, gleiches Verhalten:
1
/* Einfache Funktion zum Entprellen eines Tasters */
2
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
3
{
4
    if ( ! (*port & (1 << pin)) )
5
    {
6
        /* Pin wurde auf Masse gezogen, 100ms warten   */
7
        _delay_ms(100);
8
        if ( *port & (1 << pin) )
9
        {
10
            /* Anwender Zeit zum Loslassen des Tasters geben */
11
            _delay_ms(100);
12
            return 1;
13
        }
14
    }
15
    return 0;
16
}
17
18
int main(void) 
19
{
20
 // port init
21
 DDRB = 0xff;   //output
22
 PORTB = 0x00;    //GND
23
 
24
 DDRD |= (1 << PD3) | (1 << PD4);   //PD3 und PD4 7-SEG Ein/aus
25
 DDRD &= ~(1 << PD0); //Input
26
 DDRD &= ~(1 << PD1); //Input
27
28
 PORTD |= (1 << PD0) | (1 << PD1);  // Pull-Up Widerstand aktivieren
29
30
 //aktive 7-SEG nr. 2
31
 PORTD |= (1 << PD4);
32
  
33
 
34
 uint8_t i=0;
35
 
36
37
 while(1) 
38
 {
39
40
        
41
  if (debounce(&PIND, PD0)) {
42
    PORTB = pgm_read_byte(&c_led[1]);
43
  }
44
    
45
46
 }
47
 return 1;
48
}

  

von Karl H. (kbuchegg)


Lesenswert?

Was sagt denn dein Voltmeter, wenn du es an den µC Pin
hältst und den Taster drückst?

Vielleicht ist ja auch der Taster defekt. Soll schon
vorgekommen sein.

von Karl H. (kbuchegg)


Lesenswert?

> while(1)
> {
>  if (debounce(&PIND, PD0)) {
>    PORTB = pgm_read_byte(&c_led[1]);
>  }
> }

lass doch den ganzen Kram mit 'lesen aus Flash' mal weg.
Testprogramme sollen so einfach wie möglich sein.

while(1)
{
  PORTB = PIND;
}

Was sagen jetzt deine LED am B-Port. Wenn du am Taster
rumdrückst, sollte sich was tun.

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.