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