Forum: Mikrocontroller und Digitale Elektronik interrupt mit timer


von tobias (Gast)


Lesenswert?

bei meinem programm habe ich einen timer der hochzählt --> ISR alle 
100ms
wärenddessen blinkt eine LED mit _delay_ms(500);

wenn jetzt das delay_ms fertig ist wird ein interrupt des timer 
ausgelöst und zwar 5 mal.
ist es so dass delay_ms und der timer zusammenhängen.
gibt es keine möglichkeit das delay_ms zu unterbrechen und einen 
timerinterrupt auszulösen?

von Peter (Gast)


Lesenswert?

tobias schrieb:
> ist es so dass delay_ms und der timer zusammenhängen.

nein ist es nicht, so wie du es schreibst kann es nicht sein.

von tobias (Gast)


Lesenswert?

naja aber wie kann ich das umgehen damit der timer alle 100ms auslöst 
und nicht erst nach dem delay_ms 5 mal hintereinander?

von Peter (Gast)


Lesenswert?

tobias schrieb:
> naja aber wie kann ich das umgehen damit der timer alle 100ms auslöst
> und nicht erst nach dem delay_ms 5 mal hintereinander?

der Timmer löst immer aus egal wei lange ein dalay läuft, das was du 
schreibt kann nicht sein.

Zeige und etwas von den Quellcode sonst können wir nur raten.

von tobias (Gast)


Lesenswert?

Das starten des timer erfolgt über tastendruck, somit zeitunabhängig --> 
interrupt des taster ist im code aber jetzt nicht dabei.

int main (void)
{
  if((count <= 10) && (count > 0))
  {
  startup = 0;
  while(startup == 0 || ((TCCR0B & 0x03) == 0x03))
  {
      LED_Cells_I();
  }
  }
}

ISR(TIM0_COMPA_vect)  // Timeroverflow alle 100ms
{  count++;
   TCNT0=0;  // Timer zurücksetzen
}

void LED_Cells_I(void)
{
    for (x=0; x < 2; x++)
    {
    PORTB |= (1 << PB3);      // setzt Pin3 in PORTB auf "1"
     _delay_ms(500);     // warten
    PORTB &= ~(1 << PB3);   // löscht Bit 3 in PORTB
    delay_ms(500);   // warten
    }
    _delay_ms(1000);
}

von Hc Z. (mizch)


Lesenswert?

Ein Codeschnipsel, der nicht compiliert, geschweige denn läuft und aus 
dem alles Wichtige gekonnt rausgekürzt wurde, z.B. ob count als volatile 
deklariert wurde.  Damit fängt keiner was an.

von tobias (Gast)


Lesenswert?

natürlich ist count volatile sonst würde es ja nicht laufen
es funktioniert ja alles bis auf das interrupt dass immer auslöst
ich glaube jeder kann damit etwas anfangen so schwer sind while und for 
schleifen ja nicht

von nicht_Helfer (Gast)


Lesenswert?

Läuft, obwohl der Compiler meckert?
Bitte auch richtig einrücken, damit man das auch lesen kann.

Was soll man damit, wenn man die Initialisierung nicht sieht?
Also gesamten Code als Anjang posten.

Und hier den Fehler entfernen:
>
>if((count <= 10) && (count > 0))
>  {
>  startup = 0;
>  while(startup == 0 || ((TCCR0B & 0x03) == 0x03))
>  {
>      LED_Cells_I();
>  }
>  }

von nicht_Helfer (Gast)


Lesenswert?

ok, mei Fehler, da ist ja keiner, sorry.

von Hc Z. (mizch)


Lesenswert?

tobias schrieb:
> natürlich ist count volatile sonst würde es ja nicht laufen

Völliger Quatsch.  Das ist kein Kriterium, um zu beurteilen, ob etwas 
volatile ist.  Und zu Ratespielen habe ich keine Lust.  Du hast die 
nötigen Informationen und lieferst sie nicht.  Erwartest aber 
maßgeschneiderte Antworten.


> es funktioniert ja alles bis auf das interrupt dass immer auslöst
> ich glaube jeder kann damit etwas anfangen so schwer sind while und for
> schleifen ja nicht

Aha.  Ich bin raus.

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.