www.mikrocontroller.net

Forum: Compiler & IDEs Leds gleichzeitig mit verschiedenen Frequenzen steuern


Autor: Paul S. (skrino)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (werner-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... plus Timer verwenden statt delay.

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

Autor: Paul S. (skrino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Uwe
Ich versuch das so zu machen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Multitasking

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Solche grob gerasterten Zählarbeit mache ich gerne mit einem 
Countdown-Zähler:
int main (void)
{
    // Hardware initialisieren, inclusive Timer2
    ioinit (); 

    // Interrupts (IRQs) global erlauben
    sei();
    
    // Zeit vertrödeln bis sich die Spannung stabilisiert hat.
    // In die Hauptschleife gehört 'wait' oder 'delay' nicht rein!
    wait_10ms (1);
    
    // Blockierfreie Hauptschleife
    // Weil die LEDs zu Anfang aus sind und die die Countdowns
    // nach der Initialisierung auf 0 stehen, beginnen die LEDs
    // sofort mit einem ON-Zyklus.
    while (1)
    {
        // Falls Countdown für LED1 abgelaufen ist, 
        // neu aufziehen auf 1 Sekunde (100ms)
        // und toggle LED1
        if (0 == count.ms10.led1)
        {
            PIN_LED1 |= (1 << PAD_LED1);
            count.ms10.led1 = 100;
        }
        
        // Falls Countdown für LED2 abgelaufen ist, 
        // neu aufziehen auf 1.1 Sekunde (110ms)
        // und toggle LED2
        if (0 == count.ms10.led2)
        {
            PIN_LED2 |= (1 << PAD_LED2);
            count.ms10.led2 = 110;
        }
    } // Hauptschleife
    
    // Hier kommen wir nie hin
}

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.