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
Dann müssen die Enables auf H gesetzt werden, wenn die Eingänge H führen:Code:PORTD.7 = PIND.1 PORTC.1 = PIND.3 PORTC.4 = PIND.5
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:
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 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
Zu guter Letzt noch die Timer1-ISR: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
Vorausgesetzt dass ich dein Problem richtig verstanden habe, könnte es so klappen. Ich hoffe, es ist nicht allzu verwirrend...Code:Timer1_ISR: Signalbit = 1 Timer1=55535 Return







Zitieren

Lesezeichen