PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Pytania, kody i porady dotyczące nie tylko Bascom.
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: shrek133 » 30 gru 2018, 17:59

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.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: Henryk » 30 gru 2018, 18:28

Trochę błądzę myślami jak to sobie wykombinowałeś , sprawdź na pinie Pinb.1 czy sterownik RGB ustawia stan " 0 " .
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: shrek133 » 30 gru 2018, 20:14

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ć :P
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: Henryk » 30 gru 2018, 20:41

Dodałem do kodu zmienną kasuj a pętle ściemniania zamknąłem w warunku .
  1. $regfile = "attiny2313.dat"
  2.  
  3. 'Czestotliwosc
  4. $crystal = 8000000
  5.  
  6. 'Zmienne typu Word
  7. Dim R As Word
  8. Dim L As Word
  9. Dim T As Word
  10. Dim Sw_cnt As Byte
  11. Dim Kasuj As Byte
  12.  
  13. 'Start PWM'a
  14. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
  15.  
  16. 'Deklaracja Portów
  17. Config Pinb.3 = Output       'Port Orc1a
  18. Config Pinb.4 = Output       'Port Orc1b
  19. Config Pinb.1 = Input       'Port PB1 przycisk
  20. Portb.1 = 1       'Stan poczatkowy
  21.  
  22. 'Wyzerowany PWM
  23. Pwm1a = 255
  24. Pwm1b = 255
  25. Kasuj = 0
  26. 'Pętla
  27. Do
  28.                                              'Warunek
  29. If Pinb.1 = 0 Then
  30. If Sw_cnt < 150 Then
  31. Incr Sw_cnt
  32. Else
  33.                                               'Rozjasnianie
  34. For L = 0 To 254
  35. Pwm1a = Pwm1a - 1
  36. Pwm1b = Pwm1b - 1
  37. Waitms 3
  38. Next L
  39.  
  40. 'Powtarzaj jesli przycisk wcisniety
  41. While Pinb.1 = 0
  42. Pwm1a = 0
  43. Pwm1b = 255
  44. Kasuj = Kasuj + 1 ' tu nie jestem pewien czy to odpowiednie miejsce ?
  45. Wend
  46. Waitms 1000
  47.  
  48.  
  49. 'Przycienianie
  50. If Kasuj => 5 Then      ' jeśli zmienna kasuj osiągnie wartość => od 5 wykona się pętla ściemniania
  51. For R = 0 To 254
  52. Pwm1a = Pwm1a + 1
  53. Pwm1b = Pwm1b + 1
  54. Waitms 3
  55. Next R
  56. End If
  57.  
  58. Waitms 100
  59.  
  60. 'Koniec Warunku
  61. End If
  62. Else
  63. Sw_cnt = 0
  64. End If
  65. Waitms 1
  66.  
  67. 'Koniec Pętli wróć na początek
  68. Loop
  69.  
  70. 'Koniec Programu
  71. End
Może tak zadziała , pewny nie jestem ;)
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: shrek133 » 30 gru 2018, 21:19

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 :P ciężki temat.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: Henryk » 30 gru 2018, 21:30

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 .
  1. $regfile = "attiny2313.dat"
  2.  
  3. 'Czestotliwosc
  4. $crystal = 8000000
  5.  
  6. 'Zmienne typu Word
  7. Dim R As Word
  8. Dim L As Word
  9. Dim T As Word
  10. Dim Sw_cnt As Byte
  11. Dim Kasuj As Byte
  12.  
  13. 'Start PWM'a
  14. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
  15.  
  16. 'Deklaracja Portów
  17. Config Pinb.3 = Output       'Port Orc1a
  18. Config Pinb.4 = Output       'Port Orc1b
  19. Config Pinb.1 = Input       'Port PB1 przycisk
  20. Portb.1 = 1       'Stan poczatkowy
  21.  
  22. 'Wyzerowany PWM
  23. Pwm1a = 255
  24. Pwm1b = 255
  25. Kasuj = 0
  26. 'Pętla
  27. Do
  28.                                              'Warunek
  29. If Pinb.1 = 0 Then
  30. If Sw_cnt < 150 Then
  31. Incr Sw_cnt
  32. Else
  33.                                               'Rozjasnianie
  34. For L = 0 To 254
  35. Pwm1a = Pwm1a - 1
  36. Pwm1b = Pwm1b - 1
  37. Waitms 3
  38. Next L
  39.  
  40. 'Powtarzaj jesli przycisk wcisniety
  41. While Pinb.1 = 0
  42. Pwm1a = 0
  43. Pwm1b = 255
  44. Kasuj = 0
  45. Wend
  46. Waitms 1000
  47. kasuj = kasuj+1 ' nowe miejsce
  48.  
  49. 'Przycienianie
  50. If Kasuj => 5 Then      ' jeśli zmienna kasuj osiągnie wartość => od 5 wykona się pętla ściemniania
  51. For R = 0 To 254
  52. Pwm1a = Pwm1a + 1
  53. Pwm1b = Pwm1b + 1
  54. Waitms 3
  55. Next R
  56. End If
  57.  
  58. Waitms 100
  59.  
  60. 'Koniec Warunku
  61. End If
  62. Else
  63. Sw_cnt = 0
  64. End If
  65. Waitms 1
  66.  
  67. 'Koniec Pętli wróć na początek
  68. Loop
  69.  
  70. 'Koniec Programu
  71. End
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: shrek133 » 30 gru 2018, 23:06

: :| 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
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: Henryk » 31 gru 2018, 8:49

No i dupa ! , nie ma prawa działać , ja ślepy jak kret a Ty mnie nie poprawiasz :D
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 ;)
  1. $regfile = "attiny2313.dat"
  2.  
  3. 'Czestotliwosc
  4. $crystal = 8000000
  5.  
  6. 'Zmienne typu Word
  7. Dim Klucz As Bit
  8. Dim R As Word
  9. Dim L As Word
  10. Dim T As Word
  11. Dim Sw_cnt As Byte
  12. Dim Czas As Byte
  13.  
  14. 'Start PWM'a
  15. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
  16.  
  17. 'Deklaracja Portów
  18. Config Pinb.3 = Output       'Port Orc1a
  19. Config Pinb.4 = Output       'Port Orc1b
  20. Config Pinb.1 = Input       'Port PB1 przycisk
  21. Portb.1 = 1       'Stan poczatkowy
  22.  
  23. 'Wyzerowany PWM
  24. Pwm1a = 255
  25. Pwm1b = 255
  26. Czas = 0
  27. Klucz = 1
  28. 'Pętla
  29. Do
  30.                                              'Warunek
  31. If Pinb.1 = 0 Then
  32. If Sw_cnt < 150 Then
  33. Incr Sw_cnt
  34. Klucz = 0       ' ustawiamy klucz na "0" zezwolenie na zliczanie opuźnienia
  35. Czas = 0       ' zerujemy czas opóźnienia jeśli nadszedł impuls z pinb.1 "0" przed upływem 5 sekund
  36. Else
  37.                                               'Rozjasnianie
  38. For L = 0 To 254
  39. Pwm1a = Pwm1a - 1
  40. Pwm1b = Pwm1b - 1
  41. Waitms 3
  42. Next L
  43.  
  44. 'Powtarzaj jesli przycisk wcisniety
  45. While Pinb.1 = 0
  46. Pwm1a = 0
  47. Pwm1b = 255
  48.  
  49. Wend
  50. Waitms 1000
  51.  
  52. 'Waitms 100
  53.  
  54. 'Koniec Warunku
  55. End If
  56. Else
  57. Sw_cnt = 0
  58. End If
  59. Waitms 1
  60.  
  61. 'Koniec Pętli wróć na początek
  62.  
  63. 'Przycienianie
  64. If Klucz = 0 Then       ' klucz zabezpiecza przed wielokrotnym wykonaniem warunku
  65. Incr Czas
  66. Wait 1
  67. If Czas = 5 Then       ' warunek zostanie wykonane raz po upływie 5 sekund
  68. For R = 0 To 254
  69. Pwm1a = Pwm1a + 1
  70. Pwm1b = Pwm1b + 1
  71. Waitms 3
  72. Next R
  73. Czas = 0
  74. Klucz = 1
  75. End If
  76. End If
  77.  
  78. Loop
  79.  
  80. 'Koniec Programu
  81. End
Praktycznie musisz sprawdzić sam ;)
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: niveasoft » 01 sty 2019, 12:24

W tym moim ostatnim kodzie był szewski, ale typowy błąd :
  1.  If Portb.n = 0 Then                                 'jeśli jest sygnał masy na wejściu
Oczywiście powinno być:
  1.  If Pinb.n = 0 Then                                 'jeśli jest sygnał masy na wejściu
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 :D

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.
  1. $regfile = "attiny2313.dat"                                 'FLASH 2KB, RAM 128B, EEPROM 128B
  2. $crystal = 8000000
  3. $hwstack = 8
  4. $swstack = 8
  5. $framesize = 32
  6.  
  7.  
  8. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up
  9.  
  10.  
  11. Config Pinb.3 = Output                                      'Port Orc1a
  12. Config Pinb.4 = Output                                      'Port Orc1b
  13.  
  14. Przycisk Alias Pinb.1
  15. Config Pinb.1 = Input                                       'Port PB1 przycisk
  16. Portb.1 = 1                                                 'Stan poczatkowy
  17.  
  18.  
  19.  
  20. Dim Pwm_val As Byte , Timeout As Word
  21.  
  22. Do
  23.  
  24.  If Przycisk = 0 Then Timeout = 5000                        '5000ms = 5s
  25.  
  26.  '-------------------------------------
  27.  If Timeout > 0 Then
  28.   Decr Timeout
  29.  
  30.   'timeout jest > 0 więc rozjaśniaj
  31.   If Pwm_val < 255 Then
  32.    Incr Pwm_val
  33.    Pwm1a = Pwm_val
  34.    Pwm1b = Pwm_val
  35.   End If
  36.  
  37.  Else
  38.  
  39.    'Timeout = 0 więc ściemniaj
  40.   If Pwm_val > 0 Then
  41.    Decr Pwm_val
  42.    Pwm1a = Pwm_val
  43.    Pwm1b = Pwm_val
  44.   End If
  45.  
  46.  End If
  47.  '-------------------------------------
  48.  Waitms 1
  49. Loop
ODPOWIEDZ