Leds gleichzeitig mit verschiedenen Frequenzen steuern

OP #2064027
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);
#2064029
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.
Persönliche Seite #2064748
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.