Forum: Mikrocontroller und Digitale Elektronik frage zu programm


von Stk 500 anfänger (Gast)


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

von Stk 500 anfänger (Gast)


Lesenswert?

.........

von Spezi (Gast)


Lesenswert?

Wenn ich das STK500 richtig in Erinnerung habe, sind die Tasten 
masse-schaltend. Also AVR-Eingang High (1), wenn nicht gedrückt, und Low 
(0), wenn gedrückt.
In deinem Programm ist es anders herum.

von Michael H. (michael_h45)


Lesenswert?

nö, siehe debounce-makro.

von Schmatze (Gast)


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.

von Michael H. (michael_h45)


Lesenswert?

Schmatze schrieb:
> Interrupts sind da wohl das Schlagwort.

völlig daneben!
Glaub das bitte nicht und vergiss es gaaaanz ganz schnell wieder.

von Rolf Magnus (Gast)


Lesenswert?

Ich wüßte nicht, wie man ohne den Timer-Interrupt den Taster sinnvoll 
schneller abfragen könnte.

von Michael H. (michael_h45)


Lesenswert?

Lies den Text von Schmatze nochmal... er meint die externen oder 
Pin-Change Interrupts.

von Schmatze (Gast)


Lesenswert?

Ich bin immer wieder erstaunt, wie man Sätze interpretieren kann.

von Schmatze (Gast)


Lesenswert?

Ja, ich allerdings auch.

von Rolf Magnus (Gast)


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.

von Michael H. (michael_h45)


Lesenswert?

Rolf Magnus schrieb:
> Im Gegensatz zu Michael hab ich da nichts hineininterpretiert, sondern
So? Du hast "Interrupts" als Timer-Interrupt interpretiert, ich als 
externe Interrupts.

von Rolf Magnus (Gast)


Lesenswert?

Na wenn du meinst...
Ich hab keine Lust, darüber weiter zu diskutieren.

von Peter (Gast)


Lesenswert?

>kann mir jemand sagen wo mein programmierfehler liegt.

Du hast nicht programmiert, was passieren soll wenn, der zweite Taster 
gedrückt wird!

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.