Witam
Projektuję sterowanie halogenami LED 12V, które oprócz ściemniania/rozjaśniania będzie szybko wyłączać/włączać - każde wyjście osobnym, ale tylko jednym przyciskiem.
Założenie jest takie:
dłuższe ( powyżej 1 sek ) przytrzymanie - rozjaśnianie ( na przemian )
dłuższe ( powyżej 1 sek ) przytrzymanie - przyciemnianie ( na przemian )
krótkie ( poniżej 1 sek ) przytrzymanie - włączenie ( na przemian )
krótkie ( poniżej 1 sek ) przytrzymanie - wyłączenie ( na przemian )
O ile przyciemnianie/rozjaśnianie na przemian działa ( wykorzystałem Timer1 do PWM ) oraz wyłączenie/włączenie - ale każda z tych funkcji osobno, to nie udaje mi się ich zmusić do współpracy razem.
Na jednym z kursów znalazłem przykład mierzenia czasu przy użyciu Timer0, ale nie mam pomysłu jak to zastosować ( dopiero 3 tydzień z Bascomem ).
Poniżej kod programu - dodałem podprogram mierzący czas.
Czy przy założeniu, że obydwa przyciski nie będą razem naciskane, wyrobi się ten jeden timer ?
Jeszcze pytanie techniczne - jako element wykonawczy najlepszy jest BUZ11, chciałbym jednak odseparować układ od zasilania 12V halogenów LED, co polecacie ?
Kod programu:
Pozdrawiam
Piotr
Projektuję sterowanie halogenami LED 12V, które oprócz ściemniania/rozjaśniania będzie szybko wyłączać/włączać - każde wyjście osobnym, ale tylko jednym przyciskiem.
Założenie jest takie:
dłuższe ( powyżej 1 sek ) przytrzymanie - rozjaśnianie ( na przemian )
dłuższe ( powyżej 1 sek ) przytrzymanie - przyciemnianie ( na przemian )
krótkie ( poniżej 1 sek ) przytrzymanie - włączenie ( na przemian )
krótkie ( poniżej 1 sek ) przytrzymanie - wyłączenie ( na przemian )
O ile przyciemnianie/rozjaśnianie na przemian działa ( wykorzystałem Timer1 do PWM ) oraz wyłączenie/włączenie - ale każda z tych funkcji osobno, to nie udaje mi się ich zmusić do współpracy razem.
Na jednym z kursów znalazłem przykład mierzenia czasu przy użyciu Timer0, ale nie mam pomysłu jak to zastosować ( dopiero 3 tydzień z Bascomem ).
Poniżej kod programu - dodałem podprogram mierzący czas.
Czy przy założeniu, że obydwa przyciski nie będą razem naciskane, wyrobi się ten jeden timer ?
Jeszcze pytanie techniczne - jako element wykonawczy najlepszy jest BUZ11, chciałbym jednak odseparować układ od zasilania 12V halogenów LED, co polecacie ?
Kod programu:
[color=blue]'********************* Konfiguracja
$regfile = "m32def.dat"
$crystal = 16000000
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Config Timer0 = Timer , Prescale = 64
Config Portc = &B11111100 'Pc.0, Pc1 jako wejścia
Portc = &B11111111 'wszędzie stan spoczynkowy 1
Config Portd = &B11111111 'wszystkie jako wyjścia
Portd = &B11111111 'wygaszone
Enable Interrupts
Enable Timer1
Enable Timer0
'********************* Deklaracje podprogramów
Declare Sub Up1
Declare Sub Dn1
Declare Sub Up2
Declare Sub Dn2
Declare Sub S1
Declare Sub S2
On Timer0 Przerwanie_co_1ms
'********************* Deklaracje wejść i wyjść
W1 Alias Pinc.0
W2 Alias Pinc.1
St1 Alias Portd.5
St2 Alias Portd.4
'********************* Deklaracje zmiennych
Dim A As Byte
Dim B As Byte
Dim Licznik As Integer
Licznik = 0
A = 3
B = 3
'********************* Program główny
Do
If W1 = 0 Then ' jesli przycisk W1 wciśnięty
Gosub Przerwanie_co_1ms
If A = 3 Then ' jeśli zmienna A = 3
Gosub Up1
Waitms 3 ' idź do podprogramu Up1
If W1 = 1 Then 'jesli przycisk W1 rozłączony
Decr A ' zmniejsz wartość zmiennej A o 1
End If
End If
End If
If W1 = 0 Then ' jesli przycisk W1 wciśnięty
If A = 2 Then ' jeśli zmienna A = 2
Gosub Dn1
Waitms 3 ' idź do podprogramu Dn1
If W1 = 1 Then 'jesli przycisk W1 rozłączony
Incr A ' zwiększ wartość zmiennej A o 1
End If
End If
End If
If W2 = 0 Then
If B = 3 Then
Gosub Up2
If W2 = 1 Then
Decr B
End If
End If
End If
If W2 = 0 Then
If B = 2 Then
Gosub Dn2
If W2 = 1 Then
Incr B
End If
End If
End If
Loop
End
'********************* Podprogramy
Up1:
If Pwm1a < 255 Then ' rozjaśnianie LED na wyjściu 1 - Portd.5
Incr Pwm1a
End If
Waitms 10
Return
Dn1:
If Pwm1a > 0 Then ' ściemianie LED na wyjściu 1 - Portd.5
Decr Pwm1a
End If
Waitms 10
Return
Up2:
If Pwm1b < 255 Then
Incr Pwm1b
End If
Waitms 10
Return
Dn2:
If Pwm1b > 0 Then
Decr Pwm1b
End If
Waitms 10
Return
S1:
Toggle St1 ' Przełączanie wyjścia 1 - Portd.5
Return
S2: ' Przełączanie wyjścia 2 - Portd.4
Toggle St2
Return
Przerwanie_co_1ms: 'podprogram przerwania od przepełnienia timer0
Counter0 = Counter0 + 6 'ustawienie początkowej wartości timera0 poprzez
'dodanie do niego wartości 6 (odliczone zostanie
'dokładnie kolejne 250 impulsów)
Incr Licznik 'zwiększenie licznika
If Licznik = 1000 Then 'jeśli zmienna licznik równa się 500 (czyli
'odliczone zostało 1000*1ms=1sek), to
'
Licznik = 0 'wyzeruj zmienną licznik
End If
Return 'powrót z przerwania[/color]Pozdrawiam
Piotr