mikrocontroller.net

Forum: Compiler & IDEs 2 timer gleichzeitig laufen lassen


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich möchte zwei Timer gleichzeitig laufen lassen. Das sollen lediglich 
vorerst nur LED´s ein- bzw. ausgeschaltet werden.

Geht das überhaupt die Timer gleichzeitig laufen zu lassen???



ISR(TIMER1_COMPB_vect)         // ISR Zählen der Matches
{    
  PORTB &= ~(1<<PB5);             // LED löschen
  _delay_ms(50);                // Warte   
  PORTB |=(1<<PB5);                // LED setzen
  _delay_ms(50);                // Warte
}

ISR(TIMER2_COMPB_vect)
{  
  PORTB &= ~(1<<PB3);             // LED löschen
  _delay_ms(50);                // Warte   
  PORTB |=(1<<PB3);                // LED setzen
  _delay_ms(50);                // Warte
  
}

void main(void)

{ 
  DDRB |= ( 1 << PB3) | (1 << PB5);

  OCR1A=100000;
  TIMSK1 = 0b00000100;      // Timer Interrupts COMPARE MATCH B
  TCCR1A = 0b00010000;      // Mode 4  
  TCCR1B = 0b00001001;      // Teiler 1
  
  OCR2A=10000;
  TIMSK2 = 0b00000100;      // Timer Interrupts COMPARE MATCH B
  TCCR2A = 0b00010010;      // Mode 2
  TCCR2B = 0b00000001;      // Teiler 1
  
  sei();
  while(1){}
  
}  

Vielen Dank.

Autor: Thomas W. (wagneth)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So geht es nicht.
Warten in einer ISR ist ein no-go.

Du könntest die LEDs toggeln wenn eine bestimmte anzahl von ticks
durchgelaufen sind...

Autor: Carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kurz und Knapp: Ja!

Während der Ausführung einer Interruptfunktion sind alle weiteren 
Interrupts automatisch gesperrt.

Wenn während der Abarbeitung einer Interruptroutine eine weiterer 
Interrupt eingeht, wird das entsprechende Bit im Interrupt Flag Register 
gesetzt und die dazugehörige Interruptroutine nach dem Beenden der 
aktuellen Funktion ausgeführt.

Autor: Carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Ja bezieht sich natürlich einzig und allein auf die Frage ob zwei 
Timer parallel laufen können

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Gast (Gast)

>Geht das überhaupt die Timer gleichzeitig laufen zu lassen???

Ja, aber !!!!

>ISR(TIMER1_COMPB_vect)         // ISR Zählen der Matches
>{
>  PORTB &= ~(1<<PB5);             // LED löschen
>  _delay_ms(50);                // Warte
>  PORTB |=(1<<PB5);                // LED setzen
>  _delay_ms(50);                // Warte
>}

PATSCH

Das musste sein. Warten im Interrupt! AUA!!!!
Das macht man GANZ anders.
Siehe Interrupt und Multitasking.

MfG
Falk

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... danke für die vielen Hinweise, Toggeln, delay in der ISR usw. auch 
ein Multitasking solls nicht werden.

Denkt euch einfach mal die Inhalte der ISR´s weg, warum wird nur 
"ISR(TIMER2_COMPB_vect)" ausgeführt?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast schrieb:
> ... danke für die vielen Hinweise, Toggeln, delay in der ISR usw. auch
> ein Multitasking solls nicht werden.
>
> Denkt euch einfach mal die Inhalte der ISR´s weg, warum wird nur
> "ISR(TIMER2_COMPB_vect)" ausgeführt?

Weil wir uns die Inhalte der ISR nicht einfach wegdenken können.
Du wartest in der ISR. In dieser Wartezeit tritt bereits der nächste 
Interrupt für dieselbe ISR auf.

Wie schon gesagt. Warten in einer ISR ist ein absolutes NOGO. Wenn du 
warten willst, gut, mach das. Aber nicht in einer ISR

Autor: Timo S. (kaffeetas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schau Dir Mal die Funktion der OCnX Pins an.
was ist das für ein µC?
grüße
 Timo

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.