frage zu programm

Gast #1809695
Lesenswert?

hallo leute, als noch recht unerfahrener STK500 anfänger bin ich gerade 
dabei mir die basics wie tasterentprellung, delays, led- lauflicht.... 
beizubringen.
dazu will ich nun ein programm schreiben, welches bei drücken von 
taster0 ein led- lauflicht von Led0- Led2 durchführt. das lauflicht soll 
so lange laufen, bis ich taster1 drücke. dann soll es abgebrochen werden 
und alle Leds erlöschen.

hier mein programm (die tasterentprellung hab ich aus dem AVR tutorial):

1
#include <avr/io.h>
2
#include <util/delay.h>  
3

4

5
uint8_t Taster0;
6
uint8_t Taster1;
7

8
void long_delay(uint16_t ms)
9
{
10
  for(;ms>0; ms--)
11
  {
12
  _delay_ms(1);
13
  }
14
}
15

16

17

18
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
19
{
20
    if ( ! (*port & (1 << pin)) )
21
    {
22
        /* Pin wurde auf Masse gezogen, 100ms warten   */
23
        _delay_ms(50);  // max. 262.1 ms / F_CPU in MHz
24
        _delay_ms(50); 
25
        if ( *port & (1 << pin) )
26
        {
27
            /* Anwender Zeit zum Loslassen des Tasters geben */
28
            _delay_ms(50);
29
            _delay_ms(50); 
30
            return 1;
31
        }
32
    }
33
    return 0;
34
}
35

36

37
      
38

39

40
  
41
int main(void)
42
{
43
  DDRB = 0b00001111; //PB0 bis PB4 als Ausgang
44
  DDRD = 0b11110000; // PD0 bis PD3 als Eingang
45
  
46
  PORTB = 0xFF;   // Alle Ausgänge auf high => alle LEDs aus    
47

48
  while (1)
49
  {
50

51
 if (debounce(&PIND, PD0))             // Falls Taster0 gedrückt
52
     {  
53
    Taster0 = 1;
54
    Taster1 = 0;
55
   }
56

57

58

59

60

61

62
if(Taster0 ==1 && Taster1 ==0)      //Lauflicht
63
  {
64
  PORTB = 0b11111110;    // LED0 an
65
     long_delay(300);      
66
    PORTB= 0b11111101;      // LED1 an
67
    long_delay(300);      
68
    PORTB= 0b11111011;      // LED2 an
69
    long_delay(300);  
70
  }
71

72
  
73
    if (debounce(&PIND, PD1))        // Falls Taster1 gedrückt
74
    {
75
    Taster0 = 0;
76
    Taster1 = 1;
77

78
    }
79
  
80
    if(Taster1 == 1 && Taster0== 0)
81
    {  
82
    PORTB = 0xFF;           //Alle Ausgänge auf high => Lauflicht aus
83

84
    }
85

86

87
  }
88
  return 0;
89
}

das lauflicht funtioniert aber ich habe noch probleme mit dem abbrechen 
beim drücken von taster2. denn wenn ich taster2 drücke läuft das 
lauflicht einfacht weiter.

kann mir jemand sagen wo mein programmierfehler liegt.

mfg
Gast #1809764
Lesenswert?

Sehe ich richtig, dass du im Programm abfragst ob der Taster gerade 
gedrückt ist?

Falls ja: Dann musst du den Taster genau in dem Moment gedrückt haben, 
wenn dass Programm gerade den Taster abfragt. Dies kann man machen, wenn 
das Programm recht kurz ist und sich dauernd wiederholt, aber du hast da 
Pausen von mehreren hundert Millisekunden drinnen. Drückst du da den 
Taster, merkt das Programm das garnicht.

Interrupts sind da wohl das Schlagwort.
Gast #1810614
Lesenswert?

Im Gegensatz zu Michael hab ich da nichts hineininterpretiert, sondern 
es einfach so gelesen, wie es da steht. Was eigentlich gemeint war, ist 
aber auch ziemlich egal.
Es gilt jedenfalls: Der externe Interrupt-Eingang ist zum Einlesen der 
Taster keine gute Idee. Aber man kann per Timer-Interrupt den Taster 
"schnell genug" aufragen, unabhängig davon, wie schnell die 
Hauptschleife läuft.

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