M@ciej, masz tam kilka wpadek w tym programie, ale nie będę ich teraz pokazywał. Przerobiłem nieco Twój kod do postaci:
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 8000000
Config Pind.0 = Output 'Konfiguracja 4 pinów wyjściowych PWM
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Reset Portd.0
Reset Portd.1
Set Portd.2 'ustawiamy druga pare jako zanegowana
Set Portd.3
Dim Wyp(4) As Byte 'zmienne wypełnienia
Dim Licz As Byte 'zmienna głównego licznika
Config Timer0 = Timer , Prescale = 64 'konfiguracja Timer0 jako timer
On Timer0 Przerwanie 'wywołanie procedury liczącej przy przerwaniu
Enable Timer0 'włączamy Timer0
Enable Interrupts 'włączamy przerwania
'###########################################
Wyp(1) = 48 ' przykładowe wartości początkowe wypełnień
Wyp(2) = 64
Wyp(3) = 128
Wyp(4) = 250
Do
Rem tu obsługa przycisków i wyświetlacza LCD
Loop
End
Przerwanie:
Incr Licz
If Licz = Wyp(1) Then Toggle Portd.0
If Licz = Wyp(2) Then Toggle Portd.1
If Licz = Wyp(3) Then Toggle Portd.2
If Licz = Wyp(4) Then Toggle Portd.3
If Licz = 0 Then
Portd.0 = 0 ' zerowanie portów
Portd.1 = 0
Portd.2 = 1
Portd.3 = 1
End If
Return
Symulacja nie wykazuje błędów w działaniu i istotnie program robi co do niego należy. Przerażające są jednak dla Mnie czasy - a zwłaszcza ten ostatni - uzyskane przy takim ustawieniu licznika:
Czas trwania procedury przerwania ~0,012ms
Czas pomiędzy kolejnymi przerwaniami ~2,04ms
Czas trwania pełnego impulsu (wypełnienie 100%) ~522,25ms (!!)
W związku z tym sugeruje drobną zmianę kosztem rozdzielczości. "Skracamy" licznik do 100 poprzez:
Kod: Zaznacz cały
If Licz = Wyp(4) Then Toggle Portd.3
If Licz = 100 Then
Licz = 0
Portd.0 = 0
A poziomy wypełnień także skracamy do łatwych i czytelnych 0 - 100, co odpowiadać będzie bezpośrednio procentom wypełnienia przebiegu.
Czas trwania procedury przerwania ~0,013ms
Czas pomiędzy kolejnymi przerwaniami ~2,04ms
Czas trwania pełnego impulsu (wypełnienie 100%) ~ 204,8ms
Dalsze skracanie jest możliwe, ale będzie wiązać się z małym oknem czasowym na dalsze operacje.