Tasten Problem

Gast #482884
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.
Gast #482913
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

Gast #482937
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...
Gast #482945
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
}

  
#482964
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.

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