Tasterabfrage und Blinklicht in C sortieren

OP #3171188
Lesenswert?

Hallo,
ich arbeite zurzeit an meinem ersten größere C projekt.
Ich möchte das ein Taster immer Abgefragt wird und eine LED immer 
blinkt. Wie muss ich dass in meinem Angehängten Projekt einfügen damit 
beides gleichzeitig geht?
1
 
2
bit oldstate;                                    // Old state flag
3

4
void main() 
5
{
6
  DDB3_bit = 0;                          // Set pin as input
7
  DDB0_bit = 1;                          // Set pin as output
8
  DDB1_bit = 1;                          // Set pin as output
9
  DDB2_bit = 1;                          // Set pin as output
10
  DDB4_bit = 1;                          // Set pin as output
11
  
12
  oldstate = 0;
13
  PORTB |= (1<<DDB0);              // Licht einschalten
14
  
15
  do 
16
  {
17

18
    if(Button(&PINB, 3, 1, 0)) {              // Detect logical one
19
       oldstate = 1;                           // Update flag
20
      }
21

22
      if (oldstate && Button(&PINB, 3, 1, 1)) {    // Detect one-to-zero transition
23
         PORTB |= (1<<DDB2);
24
         oldstate = 0;
25
         Delay_ms(1000);
26
         PORTB &= ~(1<<DDB2);
27
        }
28
 
29
 }while(1);
30
}

Dass soll eingefügt werden:
1
PORTB |= (1<<DDB1);            // Blinker setzen
2
Delay_ms(600);
3
PORTB &= ~(1<<DDB1);
4
Delay_ms(600);


Viele Grüße
Jonas
#3171304
Lesenswert?

Du initialisierst einen Timer. Dieser löst nach einer bestimmten Zeit 
einen Interrupt aus, d.h. dein Programm springt regelmäßig in eine 
Interruptroutine in der du dann den Status der LED ändern kannst.
Wie das geht, steht im Artikel verlinkt von Diertich L. und dort schau 
dir
CTC Clear Timer on Compare Match
an.
Du siehst die main-Routine in der der Timer initialisiert wird und 
danach geht der uC in die Haupt-While-Schleife. Unter der main Routine 
befindet sich die Interrupt-Routine in die der uC regelmäßig springt 
(alle 1ms mit den Einstellungen im Beispiel) und dort kannst du den 
Status der LED ändern.

Durchlesen musst du es schon noch selbst, ebenso an dein Problem 
anpassen. Komm wieder wenn du dazu dann spezieller fragen hast. Aber 
fertigen Code wird's hoffentlich nicht geben.
#3171423
Lesenswert?

Der Trick sind Statemachines.
Und daß alle Tasks abweisend warten, d.h. bei nichts tun, zurück zu Main 
gehen.
Für Zeitabhängigkeiten nimmt man dann noch einen Tick, z.B. 10ms, den 
ein Timerinterrupt erzeugt.
1
void blink_led0()
2
{
3
  static uint8_t blink_time;
4

5
  switch( ++blink_time ){
6
    case 50:  LED0 = 1;       // after 500ms: LED0 on
7
              break;                
8
    case 100: LED0 = 0;       // after 1000ms: LED0 off
9
              blink_time = 0;
10
              break;
11
  }
12
}
13

14
int main()
15
{
16
                              // insert init stuff
17
  for(;;){                    // main loop
18
    if{ tick_10ms ){
19
      tick_10ms = 0;
20
      blink_led0();
21
                              // insert further timed tasks
22
    }
23
                              // insert further tasks
24
  }
25
}
#3171720
Lesenswert?

Wenn du die Interrupts und Timer überspringen willst (und länger als je 
eine ms die Taster drückst) würde ich es so machen:

1
void main (void)
2

3
int counter;
4

5
while (1)
6

7
{
8

9
  while (counter < 500)
10
  {
11
    LED = 1;
12
    if (taster)
13
    {
14
    //do something
15
    }
16

17
    _delay_ms(1);
18
    counter++;
19
  }
20

21
  counter = 0;
22

23
  while (counter < 500)
24
  {
25
    LED = 0;
26
    if (taster)
27
    {
28
     //do something
29
    }
30
    
31
    _delay_ms(1);
32
    counter++;
33
  }
34

35
  counter = 0;
36
}
37
}
#3171887
Lesenswert?

verwirrt doch den armen Jonas nicht. Er hat sein "ersten größere C 
projekt" (ein 20-Zeiler) und soll nun 4 Zeilen "einfügen".

Das klingt für mich wie ein armer Schüler, der in der Informatik-AG 
Hausaufgaben bekommen hat und nun lösen soll..

Und da kommt ihr mit Timer und Interrupts und Statemachines? Ich 
vermute, da fehlt einiges an Informatik-BAsiswissen, um derartige 
Begriffe einzusortieren.

Darüber hinaus: Er "Soll" irgendwas nach Vorgabe machen, und kommt dann 
um die Ecke und sagt "Ich hab was ganz tolles anderes gemacht". Löst 
auch de Aufgabenstellung, passt aber nicht (mehr) zur Vorgabe. Da wird 
der Leherr aber eventuell nicht begeistert sein.

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