Forum: Compiler & IDEs Leds gleichzeitig mit verschiedenen Frequenzen steuern


von Paul S. (skrino)


Lesenswert?

Hallo,

Ich bin ehe ein Anfänger in dem Umgang mit µC. Ich möchte Leds mit 
verschiedenen Frequenzen steuern. Z.B eine mit 20Hz und andere zu 
gleicher Zeit mit 10Hz. Wie kann ich das mit GCC machen? Sobald ich 
zweite Led ansteure verändert sich die Blink-Frequenz der ersten Led, 
weil sie auf die erste warten muss. Wie kann ich das trennen?
Z.B
  PORTB &= ~_BV(PB0); _delay_ms(50);
  PORTB |= _BV(PB0); _delay_ms(50);

  PORTB &= ~_BV(PB2); _delay_ms(100);
  PORTB |= _BV(PB2); _delay_ms(100);

von Uwe .. (uwegw)


Lesenswert?

Zum Beispiel in der Schleife nur ein delay von 10ms benutzen. Bei jedem 
fünften Durchlauf LED1 toggeln, bei jedem zehnten Durchlauf LED2. Und 
wenn nebenbei sonst noch was laufen soll, dann verschiebt man die Aktion 
in einen Timer-Interrupt, der regelmäßig aufgerufen wird.

von Werner B. (werner-b)


Lesenswert?

... plus Timer verwenden statt delay.

AVR-GCC-Tutorial/Die Timer und Zähler des AVR

von Paul S. (skrino)


Lesenswert?

Danke Uwe
Ich versuch das so zu machen.

von Falk B. (falk)


Lesenswert?

Siehe Multitasking

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Solche grob gerasterten Zählarbeit mache ich gerne mit einem 
Countdown-Zähler:
1
int main (void)
2
{
3
    // Hardware initialisieren, inclusive Timer2
4
    ioinit (); 
5
6
    // Interrupts (IRQs) global erlauben
7
    sei();
8
    
9
    // Zeit vertrödeln bis sich die Spannung stabilisiert hat.
10
    // In die Hauptschleife gehört 'wait' oder 'delay' nicht rein!
11
    wait_10ms (1);
12
    
13
    // Blockierfreie Hauptschleife
14
    // Weil die LEDs zu Anfang aus sind und die die Countdowns
15
    // nach der Initialisierung auf 0 stehen, beginnen die LEDs
16
    // sofort mit einem ON-Zyklus.
17
    while (1)
18
    {
19
        // Falls Countdown für LED1 abgelaufen ist, 
20
        // neu aufziehen auf 1 Sekunde (100ms)
21
        // und toggle LED1
22
        if (0 == count.ms10.led1)
23
        {
24
            PIN_LED1 |= (1 << PAD_LED1);
25
            count.ms10.led1 = 100;
26
        }
27
        
28
        // Falls Countdown für LED2 abgelaufen ist, 
29
        // neu aufziehen auf 1.1 Sekunde (110ms)
30
        // und toggle LED2
31
        if (0 == count.ms10.led2)
32
        {
33
            PIN_LED2 |= (1 << PAD_LED2);
34
            count.ms10.led2 = 110;
35
        }
36
    } // Hauptschleife
37
    
38
    // Hier kommen wir nie hin
39
}

In den Anwendungen hab ich eh einen 10ms-Interrupt aktiv für Taster 
entprellen, DCF77, etc.

Für konkrete Implementierung und Für und Wider siehe

Beitrag "Warten und Verzögern ohne zu Blockieren (avr/delay.h)"

Von den Quellen muss nur countdown.h angepasst werden: dort werden 
benötigte countdown-Zähler eingetragen. Es gibt einträge für 
Countdown-Zähler im 10ms-, im 1 Sekunden- und im 1 Minuten-Raster

countdown.c muss nicht angepasst werden.

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.