Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage und Blinklicht in C sortieren


von Jonas W. (mf-fahrer)


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

von Stefan E. (sternst)


Lesenswert?

Jonas W. schrieb:
> Wie muss ich dass in meinem Angehängten Projekt einfügen damit
> beides gleichzeitig geht?

Mit einem "einfach ein kleines Stückchen Code irgendwo einfügen" ist es 
nicht getan. Genau jetzt ist für dich der Zeitpunkt gekommen, sich mit 
"Timer" und "Interrupt" zu beschäftigen.

von Peter II (Gast)


Lesenswert?

Jonas W. schrieb:
> Dass soll eingefügt werden:
> PORTB |= (1<<DDB1);            // Blinker setzen
> Delay_ms(600);
> PORTB &= ~(1<<DDB1);
> Delay_ms(600);

und genau das geht nicht. Wenn man ein Delay macht kann der µC nichts 
anders machen.

Lassen das Blinken von einem Timer machen.

von Jonas W. (mf-fahrer)


Lesenswert?

Und wie verwende ich einen Timer?

von Dietrich L. (dietrichl)


Lesenswert?


von Peter II (Gast)


Lesenswert?

Jonas W. schrieb:
> Und wie verwende ich einen Timer?

steht alles im Datenblatt oder in den Artikel auf dieser Seite.

von Jonas W. (mf-fahrer)


Lesenswert?

Das ganze Programm soll auf einem ATtiny13 laufen.
Und die LED soll an PortB Pin1 immer blinken.
Ich finde einfach nichts passendes und ich habe noch nie mit Timern 
programmiert. Hat einer ein Besispiel wie es in meinem Fall 
funktionieren kann?


Viele Grüße
Jonas

von Peter II (Gast)


Lesenswert?

Jonas W. schrieb:
> Ich finde einfach nichts passendes und ich habe noch nie mit Timern
> programmiert. Hat einer ein Besispiel wie es in meinem Fall
> funktionieren kann?

dann lies die links von oben noch einmal in ruhe durch, das steht 
eigentlich alles drin.

von Frank M. (frank_m35)


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.

von Peter D. (peda)


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
}

von Falk B. (falk)


Lesenswert?

Siehe Multitasking

von Dave C. (dave_chappelle)


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
}

von Wegstaben V. (wegstabenverbuchsler)


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.

von Peter D. (peda)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Da wird
> der Leherr aber eventuell nicht begeistert sein.

Lehrer müssen nicht automatisch auch blöd sein.

Ein Programm, was Delay_ms(1000); enthält, wird in den seltensten Fällen 
zufriedenstellend arbeiten. Egal, ob man Lehrer ist oder nicht.

von Jonas W. (mf-fahrer)


Lesenswert?

Nur so als Hinweiß, es ist kein Schulprojekt sondern für meine Private 
Modellbahnanlage. In der Schule habe ich gar kein Informatik.

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.