Okay - 2 Kanäle, handelsübliche Impulslängen von 0,8 - 2,0 ms, 16 MHz Taktfrequenz.
Wenn Du mit Timer1 ohne Prescaler arbeitest, zählt er während eines kurzen Impulses (0,8ms) um 12.800 weiter, während eines langen Impulses (2ms) um 32.000 - stimmt´s?
Der Code liefert Dir erstmal die beiden Impulsdauern in dieser Form, d.h. als Word-Variablen zwischen 12.800 und 23.000. Wie Du sie dann in %-Angaben oder sonstwas verwurstest, bleibt Dir überlassen 
Die Idee ist die, den Timer einfach durchlaufen zu lassen. Außerdem konfigurierst Du zwei Interrupt-Eingänge auf "Change", für jeden Kanal einen.
In der ISR fragst Du den Level des auslösenden Pins ab. Ist er 1 (d.h. Impuls hat gerade begonnen), weist Du einer Variablen "Start" den aktuellen Timerwert zu. Ist der Pin 0 (d.h. der Impuls ist zu Ende), weist Du einer Variablen "Stop" wiederum den aktuellen Timerwert zu - und setzt ein Flag.
In der Hauptschleife fragst Du das Flag ab. Ist es 1, subtrahiertst Du einfach "Stop" - "Start". Dadurch, dass man auch über den Wert 0 hinweg subtrahieren kann, ist es egal, wenn der Timer während des Impulses überläuft. Die Differenz entspricht der Impulslänge und liegt zwischen 12.800 und 32.000.
Konkret also etwa so:
Code:
...
...
Config Timer1 = timer
Start timer1
Dim Start1 as word
Dim Stop1 as word
Dim Impuls1 as word
Dim Flag1 as bit
Dim Start2 as word
Dim Stop2 as word
Dim Impuls2 as word
Dim Flag2 as bit
Config Int0=Change
On Int0 Impuls1
Enable Int0
Config Int1=Change
On Int1 Impuls2
Enable Int1
Enable Interrupts
Do
If Flag1 = 1 then
Flag1 = 0
Impuls1 = Stop1 - Start1
Locate 1,1
Lcd Impuls1
End if
If Flag2 = 1 then
Flag2 = 0
Impuls2 = Stop2 - Start2
Locate 2,1
LCD Impuls2
End if
Loop
Impuls1:
If Pind.2=1 then
Start1 = Timer1
Else
Stop1 = Timer1
Flag1 = 1
End if
Return
Impuls2:
If Pind3 = 1 then
Start2 = Timer1
Else
Stop2 = Timer1
Flag2 = 1
End if
Return
Ist ungeprüft, weil ich 1. gerade nicht @home bin und 2. noch nie sowas wie einen Mega32 in den Händen hatte
Müsste aber funktionieren...
Gruß,
Daniel
Lesezeichen