PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
-
- Posty: 9
- Rejestracja: 26 mar 2017, 13:57
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
Trzymamy się wersji Tej po modyfikacji
Sw_cnt to ma służyć temu żeby od razu procedura nie startowała.
Inaczej to opiszę zrobiłem sobie ten układ i dołożyłem sterownik LEDÓW RGB
w tym sterowniku cały czas jest +12 Aktywne sterowane kolory są -GND ( nawet jak wyłączysz dalej jest +12v)
Chciałem poprzedni projekt wykorzystać i dołożyłem kabelki które są odpowiedzialne za sterowanie kolorami do każdego z nich dałem diode prostowniczą ( jest to zrobione zamiast przycisku )
Gdy włączam tryb w sterowniku RGB gdzie diody migają wtedy te Ledy dodatkowe zwykłe nie powininny się gaśić bo sterownik działa i steruje diodami RGB a on wykonuje cały czas operację gaśnięcia i rozjaśniania dla tego chodzi mi o to aby każdy impuls był odbierany jako reset licznika. Czyli ten uklad z attiny2313 gdy dostanie impuls jaki kolwiek ma rozjaśniać ledy i w momencie gdy przez 5 sekund nie dostanie impulsu to ma przygasić te ledy dodatkowe zwykłe i jak dostanie to się uruchamia rozjaśnia i świeci światłem ciągłym i każdy impuls to co idzie z RGB ma resetować ten licznik 5 sekundowy.
Sw_cnt to ma służyć temu żeby od razu procedura nie startowała.
Inaczej to opiszę zrobiłem sobie ten układ i dołożyłem sterownik LEDÓW RGB
w tym sterowniku cały czas jest +12 Aktywne sterowane kolory są -GND ( nawet jak wyłączysz dalej jest +12v)
Chciałem poprzedni projekt wykorzystać i dołożyłem kabelki które są odpowiedzialne za sterowanie kolorami do każdego z nich dałem diode prostowniczą ( jest to zrobione zamiast przycisku )
Gdy włączam tryb w sterowniku RGB gdzie diody migają wtedy te Ledy dodatkowe zwykłe nie powininny się gaśić bo sterownik działa i steruje diodami RGB a on wykonuje cały czas operację gaśnięcia i rozjaśniania dla tego chodzi mi o to aby każdy impuls był odbierany jako reset licznika. Czyli ten uklad z attiny2313 gdy dostanie impuls jaki kolwiek ma rozjaśniać ledy i w momencie gdy przez 5 sekund nie dostanie impulsu to ma przygasić te ledy dodatkowe zwykłe i jak dostanie to się uruchamia rozjaśnia i świeci światłem ciągłym i każdy impuls to co idzie z RGB ma resetować ten licznik 5 sekundowy.
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
Trochę błądzę myślami jak to sobie wykombinowałeś , sprawdź na pinie Pinb.1 czy sterownik RGB ustawia stan " 0 " .
-
- Posty: 9
- Rejestracja: 26 mar 2017, 13:57
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
Sterownika nie ruszamy bo wszystko działa jak należy
Nie wiem jak mam to łatwiej wytłumaczyć
Kwestia programowa że w miejscu "Powtarzaj jesli przycisk wcisniety" w kodzie tu tak mi się wydaje że trzeba zmienić żeby każde tak jakby zwarcie z masą było odbierane przez mikro kontroler że ma światło cały czas się świecić do momentu gdy przez 5 sek nie otrzyma żadnego zwarcia z masą wtedy i tylko wtedy ma się włączyć procedura ściemniania... nie wiem jak łatwiej to opisać
Nie wiem jak mam to łatwiej wytłumaczyć
Kwestia programowa że w miejscu "Powtarzaj jesli przycisk wcisniety" w kodzie tu tak mi się wydaje że trzeba zmienić żeby każde tak jakby zwarcie z masą było odbierane przez mikro kontroler że ma światło cały czas się świecić do momentu gdy przez 5 sek nie otrzyma żadnego zwarcia z masą wtedy i tylko wtedy ma się włączyć procedura ściemniania... nie wiem jak łatwiej to opisać
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
Dodałem do kodu zmienną kasuj a pętle ściemniania zamknąłem w warunku .
Może tak zadziała , pewny nie jestem
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny2313.dat"
- 'Czestotliwosc
- $crystal = 8000000
- 'Zmienne typu Word
- Dim R As Word
- Dim L As Word
- Dim T As Word
- Dim Sw_cnt As Byte
- Dim Kasuj As Byte
- 'Start PWM'a
- Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
- 'Deklaracja Portów
- Config Pinb.3 = Output 'Port Orc1a
- Config Pinb.4 = Output 'Port Orc1b
- Config Pinb.1 = Input 'Port PB1 przycisk
- Portb.1 = 1 'Stan poczatkowy
- 'Wyzerowany PWM
- Pwm1a = 255
- Pwm1b = 255
- Kasuj = 0
- 'Pętla
- Do
- 'Warunek
- If Pinb.1 = 0 Then
- If Sw_cnt < 150 Then
- Incr Sw_cnt
- Else
- 'Rozjasnianie
- For L = 0 To 254
- Pwm1a = Pwm1a - 1
- Pwm1b = Pwm1b - 1
- Waitms 3
- Next L
- 'Powtarzaj jesli przycisk wcisniety
- While Pinb.1 = 0
- Pwm1a = 0
- Pwm1b = 255
- Kasuj = Kasuj + 1 ' tu nie jestem pewien czy to odpowiednie miejsce ?
- Wend
- Waitms 1000
- 'Przycienianie
- If Kasuj => 5 Then ' jeśli zmienna kasuj osiągnie wartość => od 5 wykona się pętla ściemniania
- For R = 0 To 254
- Pwm1a = Pwm1a + 1
- Pwm1b = Pwm1b + 1
- Waitms 3
- Next R
- End If
- Waitms 100
- 'Koniec Warunku
- End If
- Else
- Sw_cnt = 0
- End If
- Waitms 1
- 'Koniec Pętli wróć na początek
- Loop
- 'Koniec Programu
- End
-
- Posty: 9
- Rejestracja: 26 mar 2017, 13:57
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
Sprawdziłem i nie działa tak jak powinno i też się na tym wykłada jak przed modyfikacją, Jak są bardzo krótkie impulsy to rozjaśnia swieci 5 sek i przyciemnia sie i tak w kolo a ma sie rozjasnic caly czas swiecic tak jak wczesniej do momentu gdy nie dostanie przez te 5 sekund kontaktu z masa ciężki temat.
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
Sprawdź co się teraz będzie działo przestawiłem zmienną kasuj .
Ewentualnie zwiększ wartość => 5 aby dopasować do opóźnienia pięciu sekund .
Płytę testową mam zajętą , nie mogę tego sprawdzić jak działa .
Ewentualnie zwiększ wartość => 5 aby dopasować do opóźnienia pięciu sekund .
Płytę testową mam zajętą , nie mogę tego sprawdzić jak działa .
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny2313.dat"
- 'Czestotliwosc
- $crystal = 8000000
- 'Zmienne typu Word
- Dim R As Word
- Dim L As Word
- Dim T As Word
- Dim Sw_cnt As Byte
- Dim Kasuj As Byte
- 'Start PWM'a
- Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
- 'Deklaracja Portów
- Config Pinb.3 = Output 'Port Orc1a
- Config Pinb.4 = Output 'Port Orc1b
- Config Pinb.1 = Input 'Port PB1 przycisk
- Portb.1 = 1 'Stan poczatkowy
- 'Wyzerowany PWM
- Pwm1a = 255
- Pwm1b = 255
- Kasuj = 0
- 'Pętla
- Do
- 'Warunek
- If Pinb.1 = 0 Then
- If Sw_cnt < 150 Then
- Incr Sw_cnt
- Else
- 'Rozjasnianie
- For L = 0 To 254
- Pwm1a = Pwm1a - 1
- Pwm1b = Pwm1b - 1
- Waitms 3
- Next L
- 'Powtarzaj jesli przycisk wcisniety
- While Pinb.1 = 0
- Pwm1a = 0
- Pwm1b = 255
- Kasuj = 0
- Wend
- Waitms 1000
- kasuj = kasuj+1 ' nowe miejsce
- 'Przycienianie
- If Kasuj => 5 Then ' jeśli zmienna kasuj osiągnie wartość => od 5 wykona się pętla ściemniania
- For R = 0 To 254
- Pwm1a = Pwm1a + 1
- Pwm1b = Pwm1b + 1
- Waitms 3
- Next R
- End If
- Waitms 100
- 'Koniec Warunku
- End If
- Else
- Sw_cnt = 0
- End If
- Waitms 1
- 'Koniec Pętli wróć na początek
- Loop
- 'Koniec Programu
- End
-
- Posty: 9
- Rejestracja: 26 mar 2017, 13:57
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
: Dziwne to teraz działa w ten sposób że rozjaśnia poświeci się i nagle łup gaśnie i rozjaśnia i świeci i tak w kolo
- Henryk
- Posty: 348
- Rejestracja: 22 sty 2018, 17:20
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
No i dupa ! , nie ma prawa działać , ja ślepy jak kret a Ty mnie nie poprawiasz
Niby dlaczego ma działać grzebiemy w warunku który ma być spełniony kiedy na pinb.1 jest stan niski
Opóźnienie i przyciemnianie ma mieć miejsce kiedy stanu niskiego na pinb.1 brak .
Przeniosłem przyciemnienie do pętli głównej i zabezpieczyłem bitem Klucz aby przyciemnianie wykonało się tylko raz po upływie 5 sekund .
Teraz przy braku impulsów powinno zadziałać opóźnienie prawidłowo
Praktycznie musisz sprawdzić sam
Niby dlaczego ma działać grzebiemy w warunku który ma być spełniony kiedy na pinb.1 jest stan niski
Opóźnienie i przyciemnianie ma mieć miejsce kiedy stanu niskiego na pinb.1 brak .
Przeniosłem przyciemnienie do pętli głównej i zabezpieczyłem bitem Klucz aby przyciemnianie wykonało się tylko raz po upływie 5 sekund .
Teraz przy braku impulsów powinno zadziałać opóźnienie prawidłowo
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny2313.dat"
- 'Czestotliwosc
- $crystal = 8000000
- 'Zmienne typu Word
- Dim Klucz As Bit
- Dim R As Word
- Dim L As Word
- Dim T As Word
- Dim Sw_cnt As Byte
- Dim Czas As Byte
- 'Start PWM'a
- Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
- 'Deklaracja Portów
- Config Pinb.3 = Output 'Port Orc1a
- Config Pinb.4 = Output 'Port Orc1b
- Config Pinb.1 = Input 'Port PB1 przycisk
- Portb.1 = 1 'Stan poczatkowy
- 'Wyzerowany PWM
- Pwm1a = 255
- Pwm1b = 255
- Czas = 0
- Klucz = 1
- 'Pętla
- Do
- 'Warunek
- If Pinb.1 = 0 Then
- If Sw_cnt < 150 Then
- Incr Sw_cnt
- Klucz = 0 ' ustawiamy klucz na "0" zezwolenie na zliczanie opuźnienia
- Czas = 0 ' zerujemy czas opóźnienia jeśli nadszedł impuls z pinb.1 "0" przed upływem 5 sekund
- Else
- 'Rozjasnianie
- For L = 0 To 254
- Pwm1a = Pwm1a - 1
- Pwm1b = Pwm1b - 1
- Waitms 3
- Next L
- 'Powtarzaj jesli przycisk wcisniety
- While Pinb.1 = 0
- Pwm1a = 0
- Pwm1b = 255
- Wend
- Waitms 1000
- 'Waitms 100
- 'Koniec Warunku
- End If
- Else
- Sw_cnt = 0
- End If
- Waitms 1
- 'Koniec Pętli wróć na początek
- 'Przycienianie
- If Klucz = 0 Then ' klucz zabezpiecza przed wielokrotnym wykonaniem warunku
- Incr Czas
- Wait 1
- If Czas = 5 Then ' warunek zostanie wykonane raz po upływie 5 sekund
- For R = 0 To 254
- Pwm1a = Pwm1a + 1
- Pwm1b = Pwm1b + 1
- Waitms 3
- Next R
- Czas = 0
- Klucz = 1
- End If
- End If
- Loop
- 'Koniec Programu
- End
- niveasoft
- Posty: 1213
- Rejestracja: 17 sie 2015, 12:13
- Kontakt:
Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie
W tym moim ostatnim kodzie był szewski, ale typowy błąd :
Oczywiście powinno być:
Dlatego lepiej jest na początku programu nadać sobie Aliasy do portów. Wtedy o pomyłkę trudniej.
Szkoda, że nie napisałeś o problemie wcześniej
Wracając do nowego zagadnienia. Jeśli nie używasz już programowego PWMa to lepiej na drugi raz rozpocznij nowy temat.
To co chcesz osiągnąć robi się prosto stosując "Timeout". Świecenie układu nie uzależniasz od żadnego pinu tylko od wartości jakiejś zmiennej.
To różnica Jesli zmienna "ma jakąś wartość to zrób to", natomiast wartość tej zmiennej możesz właśnie nadać przyciskiem.
W poniższym programie jakiekolwiek wciśnięcie przycisku lub po prostu masa na wejściu ustawi w zmiennej wartość 5000.
Zawsze kiedy ta zmienna ma wartość > 0 to program ją odlicza w dół, ale też zawsze kiedy jest większa od zera to PWM ma osiągnąć 255.
Kiedy przycisk nie zostanie wciśnięty chociażby na moment przez 5s to zmienna osiągnie zero i rozpocznie się ściemnianie. Każdy impuls masy na wejściu przywróci rozjaśnianie.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- If Portb.n = 0 Then 'jeśli jest sygnał masy na wejściu
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- If Pinb.n = 0 Then 'jeśli jest sygnał masy na wejściu
Szkoda, że nie napisałeś o problemie wcześniej
Wracając do nowego zagadnienia. Jeśli nie używasz już programowego PWMa to lepiej na drugi raz rozpocznij nowy temat.
To co chcesz osiągnąć robi się prosto stosując "Timeout". Świecenie układu nie uzależniasz od żadnego pinu tylko od wartości jakiejś zmiennej.
To różnica Jesli zmienna "ma jakąś wartość to zrób to", natomiast wartość tej zmiennej możesz właśnie nadać przyciskiem.
W poniższym programie jakiekolwiek wciśnięcie przycisku lub po prostu masa na wejściu ustawi w zmiennej wartość 5000.
Zawsze kiedy ta zmienna ma wartość > 0 to program ją odlicza w dół, ale też zawsze kiedy jest większa od zera to PWM ma osiągnąć 255.
Kiedy przycisk nie zostanie wciśnięty chociażby na moment przez 5s to zmienna osiągnie zero i rozpocznie się ściemnianie. Każdy impuls masy na wejściu przywróci rozjaśnianie.
Code: [Zaznacz cały] [Rozwiń/Zwiń]
- $regfile = "attiny2313.dat" 'FLASH 2KB, RAM 128B, EEPROM 128B
- $crystal = 8000000
- $hwstack = 8
- $swstack = 8
- $framesize = 32
- Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up
- Config Pinb.3 = Output 'Port Orc1a
- Config Pinb.4 = Output 'Port Orc1b
- Przycisk Alias Pinb.1
- Config Pinb.1 = Input 'Port PB1 przycisk
- Portb.1 = 1 'Stan poczatkowy
- Dim Pwm_val As Byte , Timeout As Word
- Do
- If Przycisk = 0 Then Timeout = 5000 '5000ms = 5s
- '-------------------------------------
- If Timeout > 0 Then
- Decr Timeout
- 'timeout jest > 0 więc rozjaśniaj
- If Pwm_val < 255 Then
- Incr Pwm_val
- Pwm1a = Pwm_val
- Pwm1b = Pwm_val
- End If
- Else
- 'Timeout = 0 więc ściemniaj
- If Pwm_val > 0 Then
- Decr Pwm_val
- Pwm1a = Pwm_val
- Pwm1b = Pwm_val
- End If
- End If
- '-------------------------------------
- Waitms 1
- Loop