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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.