Forum: Mikrocontroller und Digitale Elektronik LED Blinker mit Taster ansteuern.


von finn N. (fin)


Angehängte Dateien:

Lesenswert?

Hallo an alle !

erstmal kurze Vorstellung - bin Finn. Hab mir STK500 zugelegt und 
probiere seit zwei Wochen in µC Welt und C Programmierung mich 
einzuarbeiten.

Habe LED´s schon einzel zum leuchten gebracht und mit Taster 
Ansteuerung.
ABER hier komme ich echt nicht mehr weiter...


Ich möchte gerne 3 Tasterabfragen programmieren. Mit folgenden 
Bedingungen:
Bei erstem drücken des Taster 1 - Blinkt LED 1. und LED 2 geht aus
Bei erstem drücken des Taster 2 - Blinkt LED 2. und LED 1 geht aus

Bei zweitem drücken des Tasters 1 - geht LED 1 aus.
Bei zweitem drücken des Tasters 2 - geht LED 2 aus.

Mit dem 3ten Taster sollen 3 LED´s nach einander geschaltet werden (das 
Klappt soweit)



Habe viel hier im Forum gelesen - und denke mal es muss mit einem 2ten 
Timer irgendwie realesierbar sein.


das Programm was ich zusammengestellt habe(mit Hilfe der 
Beispielprogramme). Bringt die LED1 und 2 zum leuchten.


Für euch ist es sicherlich kein großes Problem mir mit dem Programm zu 
helfen. Wie gesagt - die LED1 und LED2 sollen blinken. Ich komm einfach 
nicht mehr weiter...

Danke schon mal für die Hilfe und jeden Tip !

von Thomas E. (thomase)


Lesenswert?

finn N. schrieb:
> Danke schon mal für die Hilfe und jeden Tip !
Erstmal sieht dein Programm hervorragend aus. Rein optisch. Wie fürs 
Lehrbuch.
Die Timerkonfiguration ist allerdings suboptimal. Ich will jetzt nicht 
Murks sagen. Im Moment ist das auch Jammern auf gehobenem Niveau.
Guck dir im Tutorial mal den CTC-Mode an.

Einen Timer hast du ja schon. In diesem lässt du eine Variable zählen, 
rauf oder runter ist Geschmackssache.
1
#define BLINK_INTERVAL 50
2
volatile uint8_t blink = 0;
3
uint8_t blinkLed0 = 0;
4
uint8_t blinkLed1 = 0;
5
6
ISR(TIMER...)
7
{
8
  static uint8_t count = 0;
9
...
10
  count++;
11
  if(count == BLINK_INTERVAL)
12
  {
13
    count = 0;
14
    blink = 1;
15
  }
16
...
17
}
18
19
int main(void)
20
{
21
...
22
  while(1)
23
  {
24
  ...
25
    if(blink)
26
    {
27
      blink = 0;
28
      if(blinkLed0) LED_PORT ^= (1 << LED0);
29
      if(blinkLed1) LED_PORT ^= (1 << LED1);
30
    }
31
  ...
32
 }
33
...
34
}

Eine Möglichkeit von vielen.
Mit den Tastern setzt du blinkLed0 und blinkLed1 entsprechend auf 0 oder 
1 und die eine oder andere oder beide Leds blinken. Statt die Led direkt 
einzuschalten, setzt du jetzt die entsprechende Blinkvariable.
Beim Um- und Abschalten musst du noch dafür sorgen, daß die Led 
ausgeschaltet wird: LED_PORT &= ~(1 << LEDx);.


mfg.

von Norbert N. (Gast)


Lesenswert?

Hallo Finn,

Habe mir dein Problem mehrmals durchlesen müssen. Kann soweit keinen 
Fehler erkennen.
Müsste eigentlich soweit funktionieren.

Vielleicht wäre es noch sinnvoll, deine IF-Verweisung in eine partielle 
struc-abfrage zu integrieren.

sollte eigentlich relativ leicht sein.

Vielleicht fällt anderen Forumsmitgliedern ja noch ne andere Lösung ein.

von Peter D. (peda)


Lesenswert?

finn N. schrieb:
> Wie gesagt - die LED1 und LED2 sollen blinken. Ich komm einfach
> nicht mehr weiter...

Nun da gibt es viele Möglichkeiten.
Z.B. Du erzeugst Dir erstmal einen Takt:
1
volatile uint8_t tick_10ms;
2
3
ISR( TIMER0_OVF_vect )                            // every 10ms
4
{
5
  static uint8_t ct0, ct1, rpt;
6
  uint8_t i;
7
  
8
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms
9
  tick_10ms = 1;
10
// ..

Und dann brauchst Du noch 2 Flags, um das Blinken einzuschalten:
1
  uint8_t blink_on0, blink_on1;

Dann die Blinkroutinen:
1
void blink0()
2
{
3
  static uint8_t tick = 0;
4
 
5
  switch( tick++ ){
6
     case 50:  LED_PORT |= 1<<LED0;  // after 500ms
7
               break;
8
     case 100: LED_PORT &= ~(1<<LED0);
9
               tick = 0;
10
  }
11
}

Und dann nur noch im Main aufrufen:
1
// ..
2
  while(1){
3
    if( tick_10ms ){
4
      tick_10ms = 0;
5
      if( blink_on0 )
6
        blink0();                // blink
7
      else
8
        LED_PORT &= ~(1<<LED0);  // off
9
// ..
10
    }
11
    // und die Tasten auswerten:
12
    if( get_key_press( 1<<KEY0 )){
13
      blink_on0 = !blink_on0;
14
      blink_on1 = 0;
15
    }
16
// ..
17
  }

von finn N. (fin)


Lesenswert?

UAU das ging ja flot ! ! !
1A ! Vielen Vielen Dank !)
Habe jetzt das Programm verbessert ! Funktioniert soweit wie es soll !

Zur Verbesserung des Ganzen:
- beim Taster 1 drücken soll nur die LED1 blinken
- beim Taster 2 drücken soll nur die LED2 blinken
im Moment ist es so das ich die unabhängig von einander Blinken lassen 
kann.


Nochmal zur Verdeutlichung - was ich vor habe
Taster 1 betätigt -->LED1 Blinkt, LED2 Aus ->danach Taster 2 
betätigt-->LED1 Aus, LED2 Blinkt -> nochmal Taster 2 --> LED1 Aus, LED2 
Aus     (und umgekehrt)

ich vermute das es nur eine Zeile im jeweiligen "Blinkprogramm" ist -> 
das das andere "Blinkprogramm" ausschaltet...

aber wie genau das funktioniert..... das suche ich seit gestern Nacht...

Dankbar für weitere Vorschläge...

void blink0()
{
  static uint8_t tick = 0;

  switch( tick++ ){
    case 10:  LED_PORT &= ~(1<<LED0); //an  // after 100ms
    break;
    case 20: LED_PORT |= 1<<LED0; //aus
    tick = 0;
  }
}

void blink1()
{
  static uint8_t tick = 0;

  switch( tick++ ){
    case 10:  LED_PORT &= ~(1<<LED1); //an  // after 100ms
    break;
    case 20: LED_PORT |= 1<<LED1; //aus
    tick = 0;
  }
}




oder das komplette Programm rein stellen?

von Peter D. (peda)


Lesenswert?

finn N. schrieb:
> oder das komplette Programm rein stellen?

Was denkst Du?
Dann aber als Anhang.

Ist Dir klar, was blink0, blink1 machen?
Werten sie die Tasten aus?
Nein.
Sie sollen nur das Blinken ohne Blockierung der Mainloop machen.

Die Bedienlogik muß also in die get_key_press Bearbeitung hinein und nur 
dort.

von finn N. (fin)


Lesenswert?

Peter Dannegger schrieb:
> Die Bedienlogik muß also in die get_key_press Bearbeitung hinein und nur
> dort.

Hast recht !

Jetzt läuf´s !

Danke !!! :)

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.