Dzielę połówkę sinusoidy na 100 części. 10ms / 100 = 0,1 ms = 0,0001s.
Odcinki czasu 0,1 ms generuje mi timer1
Takt zegarowy t = 1 / 8000000 Hz = 0,125 ms
Dla uzyskania 0,0001s muszę zliczyć 800 taktów ( 800 x 0,125 us = 100 us = 0,1 ms = 0,0001 s ). Aby licznik się przepełnił po wykonaniu 800 cykli maszynowych i wywołał przerwanie ustawiam wartość początkową licznika na 65536 - 800 = 64736.
Od tej pory co 0,0001 s inkrementuje się zmienna Czas_zwloki$ (sto kroków na połówce sinusa). Jeśli w pewnej chwili okaże się, że Czas_zwloki$ przekroczy Wartosc_t1$ zostanie załączony triak.
Gdy na int1 zostanie wykryte przejście przez zero zrobione na układzie zerocrosser triak zostanie wyłączony. Wyzerowana zostanie również zmienna Czas_zwloki$. I wszystko zacznie się od początku (triak zostanie włączony ponownie po przekroczeniu przez zmienną Czas_zwloki$ wartości odpowiedniej dla włączenia triaka.
Poniżej gotowy kod.
Kod: Zaznacz cały
$regfile = "m16def.DAT"
$crystal = 8000000
$baud = 4800
Echo Off
Nadawanie Alias Portc.7
Config Nadawanie = Output
Dim Wartosc_t1$ As Byte
Dim Wartosc_t2$ As Byte
Dim Wartosc_t3$ As Byte
Wartosc_t1$ = 0
Wartosc_t2$ = 0
Wartosc_t3$ = 0
Dim Czas_zwloki$ As Byte
Czas_zwloki$ = 0
D10 Alias Porta.6
Config D10 = Output
S10 Alias Pind.4
Config S10 = Input
Set S10
Declare Sub Odczytaj_klawisze
' KONFIGURACJA PRZERWANIA DETEKTORA PRZEJSC PRZEZ ZERO
Config Int1 = Rising
Enable Interrupts
Enable Int1
On Int1 Przejscie_przez_0
Dim W_pocz_timera As Word
' KONFIGURACJA TIMERA1 do odliczania 0,0001s odcinków czasu
Config Timer1 = Timer , Prescale = 1
On Timer1 00001s
Enable Interrupts
Enable Timer1
W_pocz_timera = 64736
Timer1 = W_pocz_timera
Do
Call Odczytaj_klawisze
Waitms 10
Loop
Sub Odczytaj_klawisze
If S10 = 0 Then
Incr Wartosc_t1$
If Wartosc_t1$ > 100 Then Wartosc_t1$ = 1
Set Nadawanie
Print Wartosc_t1$
Print
Reset Nadawanie
End If
Waitms 100
End Sub
End
00001s:
Timer1 = W_pocz_timera
Incr Czas_zwloki$
If Czas_zwloki$ > Wartosc_t1$ Then Set D10
Return
Przejscie_przez_0:
Disable Int1
Enable Interrupts
Reset D10
Czas_zwloki$ = 0
Enable Int1
Return
http://filmy.elektroda.net/42_1338305880.flv
Na filmie widać trzecią diodę od prawej (to jest właśnie D10), jej zachowanie (cały czas trzymany przycisk S10) i zachowanie podłączonej żarówki 230V.