Forum: Mikrocontroller und Digitale Elektronik Variable, Timer und ISR


von xray1981 (Gast)


Lesenswert?

Hallo !
Kann mir jemand sagen, ob es möglich ist, einen generierten 
1-Sekunden-Takt in einer Variablen zu speichern, die man dann in einer 
Wartefunktion weiterverarbeiten kann ?
Was ich nämlich nicht verstehe ist, dass mit dem Programmbeispiel die 
LED blinkt, aber sobald ich in der ISR nur takt--; stehen habe, und den 
Rest in der Hauptschleife oder einer weiteren Funktion bearbeiten will, 
klappt es nicht mehr. Als würde der Zustand von "takt" aussehalb der ISR 
nicht erhalten bleiben.
Auch eine Abfrage auf den PORT funktioniert nicht...

1
static int takt=1000;
2
3
4
//------------------- ISR für Timer0 1ms ---------------------------
5
6
ISR(TIMER0_COMP_vect) 
7
{  
8
    takt--;
9
    if(takt==0)
10
    {
11
    PORTC^=(1<<PC3); takt=1000;
12
    }
13
}

von J.-u. G. (juwe)


Lesenswert?

xray1981 schrieb:
> static int takt=1000;

Variable takt "volatile" deklarieren, nicht "static".

von xray1981 (Gast)


Lesenswert?

Schon probiert...nüscht !

von J.-u. G. (juwe)


Lesenswert?

xray1981 schrieb:
> Schon probiert...nüscht !

Dann ist wahrscheinlich noch ein anderer Fehler in Deinem Code.

von xray1981 (Gast)


Lesenswert?

Aber da ist doch nichts großes dran. Außer, dass es dann halt so 
ausschaut:

[c]

volatile int takt=1000;

//------------------- ISR für Timer0 1ms ---------------------------

ISR(TIMER0_COMP_vect)
{
    takt--;
}


{while (true)               // Mainloop-Begin

  {if(takt==0)
    {
    PORTC^=(1<<PC3); takt=1000;
    }
        }
}

von xray1981 (Gast)


Lesenswert?

Das hier ist die Timerkonfig:
1
// --------------------INIT TIMER 0 (Wartezeiten / Laufzeitüberwachung) --------
2
3
  TCCR0 = (1<<WGM01) | (1<<CS01) | (1<<CS00);            // Prescaler 64
4
5
  OCR0  = 56;                         // 1ms
6
7
  TIMSK |= (1<<OCIE0);

von Karl H. (kbuchegg)


Lesenswert?

xray1981 schrieb:
> Aber da ist doch nichts großes dran. Außer, dass es dann halt so
> ausschaut:

Poste trotzdem bitte alles.

> ISR(TIMER0_COMP_vect)
> {
>     takt--;
> }

Mach hier wenigstens eine Sicherung rein

{
  if( takt > 0 )
    takt--;
}


... damit sicher gestellt ist, dass du hier .....

>   {if(takt==0)

die Variable auch wirklich bei 0 erwischt und nicht bei +1 und das 
nächste mal dann schon bei -1


(das ist zb eine Möglichkeit, je nach Timereinstellung, was dir 
passieren kann. Gibt noch mehr: Daher ... kompletten Code! Wenn er so 
kurz ist, wie du siggerierst, dann ist da ja nichts dabei, einfach das 
File als ganzes anzuhängen)

von xray1981 (Gast)


Lesenswert?

Danke, hab das Problem aber wahrscheinlich gelöst. Stichwort: Atomarer 
Datenzugriff. Sperre ich die Interrupts für die Abfrage in der Mainloop, 
dann läuft das ganze

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.