Hallo,
zunächst mal recht vielen Dank für den Tipp mit dem LED-Toggle in der Timer-ISR.
Es stimmte ... der Timer-INT wird definitv bei einem PRESCALER-WERT von 1024 ca. alle 0,16s ausgelöst, was zu einem Blinken der LED von ~3Hz führt.
Ich habe noch eine Frage bzg. der Timer-Wertes - wo kann ich den Wert abgreifen (z.B. um ihn zu vergleichen) in TIMER0 oder in TCNT0 ? Kann es sein, dass die mathem. Operationen wie "<" oder ">" mit dem Tiny15 nicht verwendbar sind? Am Fernsteuer-Empfänger soll das PWM-Signal (ein max und ein min-Wert) detektiert werden. Das PWM-Signal hat einen H-Pegel, der zw. ~1ms und 2,5ms lang ist.
Die Idee ist, mit dem Signal einen INT0 (PortB.2) jeweils an der steigenden Flanke und bei der fallenden Flanke auszulösen (nochamls Danke für den Tipp bzgl: "CHANGE". Der TIMER0 soll bei der steigenden Flange bei Null gestartet werden und bei der fallenden Flanke auswertet werden. Bei einem Takt des TIMER0 von 1.6MHz ergeben sich bei einem PRESCALER-Wert von 64 entspr. TIMER-Werte von ~25 (bei 1ms) und 63 (bei 2.5ms)
Der Code sieht jetzt so aus ... funktioniert aber leider immer noch nicht ... hat noch jemand eine Idee ?
Vielen Dank,
Ulf
Code:' Auswertung eines PWM-Servosignals (ein Kanal) ' PWM-Signal H-Pegel zwischen ~1ms und 2.5ms ' INT bei wechselnder Flanke $regfile = "ATtiny15.DAT" ' MC-Definitionen laden ' Quarzfrequenz (interal Clock 1.6 Mhz) Config Portb.4 = Output ' Status-LED am Port B.4 (Pin2) grün Config Portb.3 = Output ' Status-LED am Port B.3 (Pin3) gelb Config Portb.2 = Input Config Timer0 = Timer , Prescale = 64 ' Config Timer0 auf 160 Mikrosekunden pro Takt, Enable Timer0 ' Start Timer0 ' bei 1.6MHz: 1/(1.600.000/64) = ein TimerIncrement ' alle 40 Mikrosek ' zu erwartender Zählerbereich von ~25 bei 1ms PWM ' und ~63 bei 2.5ms PWM Config Int0 = Change ' Konfiguration Int0 (PortB.2) wechselnde Flanke ' Einschalten der Interrupts Enable Int0 ' Einschalten Von Interrupt Int0 On Int0 Servowert ' Definition Sprungmarke INT0 Enable Interrupts Portb.4 = 0 ' beide Ports aus (LED aus) Portb.3 = 0 Do ' Hauptschleife Loop End Servowert: ' Interrupt-Routine (INT0) If Portb.2 = 1 Then ' steigende Flanke testen Tcnt0 = 0 ' Timer zurücksetzen Start Timer0 ' Timer0 starten Return End If If Tcnt0 < 40 Then ' Schwellwert des Zählers gemittelt zwischen ' den maximalen Werten: 25 und 63 Portb.3 = 1 Return End If Portb.3 = 0 Return





Zitieren

Lesezeichen