Okay - so langsam nimmt´s Formen an.
Sicherlich gibt´s viele Wege die nach Rom führen. Ich würde mir als Kernstück einen Timer so einstellen, dass er z.B. alle 10ms überläuft und ein Signalbit setzt. Also z.B. Timer 1 mit einem Prescaler von 16, d.h. einer Zählfrequenz von 1MHz, vorgeladen mit einem Wert von 55535.
Neben dem Signalbit wirst Du 3 Zeit-Variablen brauchen, die die vergangene Zeit seit dem letzten H-L-Wechsel zählen. Nennen wir sie ZeitX, ZeitY und ZeitZ, jeweils als Byte dimensioniert.
Die Hauptschleife würde ich immer damit beginnen, die Ausgänge gleich den Eingängen zu setzen, also
Code:
PORTD.7 = PIND.1
PORTC.1 = PIND.3
PORTC.4 = PIND.5
Dann müssen die Enables auf H gesetzt werden, wenn die Eingänge H führen:
Code:
If PIND.1 = 1 then
PORTB.0 = 1
End if
If PIND.3 = 1 then
PORTC.2 = 1
End if
If PIND.5 = 1 then
PORTC.5 = 1
End if
Alle 10ms, wird gecheckt, ob einer der drei Takte schon abgelaufen ist, der Enable-Ausgang aber noch H ist. In diesem Fall wird die dazugehörende Zeitzähl-Variable alle 10ms um 1 erhöht:
Code:
If Signalbit = 1 then
Signalbit = 0
If PIND.1 = 0 AND PORTB.0 = 1 then 'Takt ist vorbei, aber enable noch H
ZeitX = ZeitX + 1 'ZeitX erhöht sich alle 10ms um 1
End if
If PIND.3 = 0 AND PORTC.2 = 1 then
ZeitY = ZeitY + 1
End if
If PIND.5 = 0 AND PORTC.5 = 1 then
ZeitZ = ZeitZ + 1
End if
End if
Am Schluss der Hauptschleife checkst Du dann, ob eine der drei Zeitzähl-Variablen 20 erreicht hat (für 200ms, ansonsten entsprechend höhere Werte). Ist dies der fall, wird der Enable-Ausgang auf L gesetzt und die Zeitzähl-Variable auf 0 zurückgesetzt:
Code:
If ZeitX = 20 then
PORTB.0=0 'Enable-Ausgang auf L
ZeitX=0 'Zeitzähl-Variable rücksetzen
End if
If ZeitY = 20 then
PORTC.2 = 0
ZeitY = 0
End if
If ZeitZ = 20 then
PORTC.5 = 0
ZeitZ = 0
End if
Zu guter Letzt noch die Timer1-ISR:
Code:
Timer1_ISR:
Signalbit = 1
Timer1=55535
Return
Vorausgesetzt dass ich dein Problem richtig verstanden habe, könnte es so klappen. Ich hoffe, es ist nicht allzu verwirrend...
Lesezeichen