Also ich habe im Datenblatt mal gelesen, dass der erste Impuls möglicherweise verfälscht sein kann, wenn man das OCR-Register im "laufenden Betrieb" ändert. Für die meisten PWM-Anwendungen mag der erste Impuls nicht besonders wichtig sein - aber hier wäre das natürlich fatal.
Was hältst Du von folgendem Ansatz:
Code:
Dim Impuls(4) as Word 'Ist ein Array aus 4 Word-Variablen
Dim Index as Byte 'Zum Durchzählen von Impuls(1) bis Impuls(4)
Dim Flag as Bit 'Zeigt Timer1-Interrupt an
Config PORTX.Y = Output 'Ausgangs-Pin
On Timer1 Timer1_ISR
Enable Timer1
Enable Interrupts
Do
...
...
If Flag = 1 then
Flag = 0
If PORTX.Y = 1 then
PORTX.Y = 0
Timer1 = Timer1 + 64429 'Nächster Überlauf in 0,3 ms
Else
PORTX.Y = 1
If Index = 4 then Index = 1 Else Index = Index + 1
Timer1 = Timer1 + Impuls(Index)
End if
End if
...
...
Loop
On Timer1_ISR:
Flag=1
Return
Im Rest der Hauptschleife kannst Du Dich dann darum kümmern, dass die Werte Impuls(1) bis Impuls(4) per RS232 aktualisiert werden. Sie bestimmen, wie lange Timer1 bis zu seinem nächsten Überlauf braucht, und somit die Dauer der High-Impulse. Logischerweise berechnen sie sich so: Impuls = 65535 - (3686400 * Impulslänge in Sekunden).
Diese Idee ist allerdings nicht getestet, noch nicht mal compiliert, weil ich hier gerade kein Bascom habe. Aber vielleicht reicht ja die Idee schon...
Lesezeichen