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);
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.