Forum: Mikrocontroller und Digitale Elektronik Flankenerkennung in der ISR, Timer 0


von sasa (Gast)


Lesenswert?

Hallo,
ich benutze den Timer0 als Rechteckgenerator am Pin PB3.
Wie kann ich in der ISR von Timer0 überprüfen, ob die Flanke jetzt oben 
oder unten ist? So wie ich verstanden habe wird die ISR bei steigender 
und bei fallender Flanke aufgerufen. Könnte man vielleicht dafür eine 
Variable Flanke unten/oben jedes mal umschalten, wenn man weiss welche 
zuerst
kommt? Ich habe leider kein Oszi zur Hand, bit_is_set(PINB, PB3) 
funktioniert nicht.



void timer_0_ini( void )
{
  TCNT0=0x00;
  TIMSK|=(1<<OCIE0);
  TCCR0= (1<<WGM01) | (1<<COM00) | (1<<CS01) | (1<<CS00);
  OCR0 =0;
}

ISR(TIMER2_OVF_vect)
{
   Flanke oben/unten?
}

von (prx) A. K. (prx)


Lesenswert?

Zustand von Pin abfragen und hoffen, dass er nicht schon wieder zurück 
gewechselt hat.

von Falk B. (falk)


Lesenswert?

@  sasa (Gast)

>Wie kann ich in der ISR von Timer0 überprüfen, ob die Flanke jetzt oben
>oder unten ist?

Einfach das PIN auslesen?

von (prx) A. K. (prx)


Lesenswert?

Ähm... Du kannst in einem Timer-Interrupt keine Flanke abfragen. 
Höchstens feststellen, ob der Zustand nun anders ist als vorher. Also 
den aktuellen Zustand mit dem vorherigen vergleichen.

von MWS (Gast)


Lesenswert?

>> Wie kann ich in der ISR von Timer0

>> ISR(TIMER2_OVF_vect)

Geposteter Text und Code passen auch nicht so recht zueinander...

von sasa (Gast)


Lesenswert?

Danke,
es soll heisen:


ISR(TIMER0_COMP_vect)
{
...


Pin auslesen geht nicht!? In dem Datenblatt steht, wenn COM01 oder COM00 
gesetzt, normale Funktion wird überschrieben, wahrscheinlich deswegen 
funktioniert Pin auslesen nicht.

Welche Flanke wird zuerst in der ISR abgefangen?

von sasa (Gast)


Lesenswert?

Nicht die Flanke, sondern welcher  Zustand wird zuerst abgefangen

von holger (Gast)


Lesenswert?

>ISR(TIMER0_COMP_vect)
>{
>...
>
>Pin auslesen geht nicht!? In dem Datenblatt steht, wenn COM01 oder COM00
>gesetzt, normale Funktion wird überschrieben, wahrscheinlich deswegen
>funktioniert Pin auslesen nicht.

>bit_is_set(PINB, PB3)

Was hat PB3 bei welchem AVR mit Timer0 zu tun?

von holger (Gast)


Lesenswert?

>Was hat PB3 bei welchem AVR mit Timer0 zu tun?

Tschuldigung, selbst gerade gefunden. ATMega32 z.B.
PINB3 sollte aber trotzdem jederzeit lesbar sein.

von MWS (Gast)


Lesenswert?

Per HW toggeln macht wenig Sinn, wenn in der zugehörigen ISR mit 
gleicher Aufruffrequenz der Status abgefragt wird.

Da wäre es sinnvoller den Portpin gleich in der ISR per SW zu toggeln, 
dann kennt man auch den Zustand des Pins.

Nur stehen für die ISR < 64 Takte zur Verfügung.

von Gast (Gast)


Lesenswert?

Hallo,

lege dich doch einfach mal in der main loop auf die Lauer und frage den 
PIN auf Änderungen ab.

Laut Timer/Counter Blockdiagramm geht der Ausgang am PIN vorbei

MfG

von sasa (Gast)


Lesenswert?

Danke!
ich werde dann die Lösung mit Toggeln per SW in der ISR testen

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.