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

PWM LED ATTINY2313 Płynne przyciemnianie/rozjaśnianie

Post autor: shrek133 » 26 mar 2017, 14:18

Witam
Zabawę z mikrokontrolerami dopiero zaczynam dla tego potrzebuję pomocy

Zasada działania
Pkt1. Przytrzymaj 2 sekundy przycisk (Bez przerw jeśli przerwiesz instrukcje dalsze nie zostaną wykonane)
Pkt2. Jeśli przycisk był przytrzymany 2 sekundy wykonaj następujące kroki
Pkt3. Rozjaśnij Led do 100% Jasności powoli (Jeśli przycisk nie zostanie zwolniony od początku to świeć do momentu gdy zostanie zwolniony)
Pkt4. Przycisk został zwolniony ( Po zwolnieniu przycisku świeci jeszcze przez 10sek)
Pkt5. Płynnie przyciemniaj Led do 0% Jasności (Jeśli w trakcie wykonywanych instrukcji znowu przytrzymamy przycisk przez 2 sek nie spowoduje to przerwania operacji lecz program będzie to traktował że musi dokończyć pierwszą operacje po wygaszeniu znowu ma wykonać pkt.2 i tak w koło macieja)

Problem mam przy Pkt1. nie mogę sobie poradzić z tym przyciskiem zrobiłem coś w stylu że nalicza np. co 5ms po 1 pkt do zmiennej X gdy zmienna X osiągnie 254 wtedy wykonaj operacje. Ale to mnie nie zadowala bo jak klikam i klikam w przycisk to on sumuje każde wciśniecie ze za którymś razem to wystarczy pacnąć w przycisk a instrukcje dalej zostaną wykonane.

Do czego mi to ???
No potrzebuje żeby wyeliminować drgania przycisku i wpadłem na taki pomysł.

Z góry proszę o wyrozumiałość jak dla początkującego który chce na swoim kodzie zobaczyć jak powinno to wyglądać i w zaciszu sobie to przeanalizować.
  1. 'Procek
  2.  
  3. $regfile = "attiny2313.dat"
  4.  
  5. 'Czestotliwosc
  6.  
  7. $crystal = 8000000
  8.  
  9. 'Zmienne typu Word
  10.  
  11. Dim R As Word
  12. Dim L As Word
  13. Dim T As Word
  14.  
  15.  
  16. Dim Flaga As Bit
  17.  
  18. 'Start PWM'a
  19.  
  20.  
  21.  
  22. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
  23.  
  24. 'Deklaracja Portów
  25.  
  26. Config Pinb.3 = Output                                      'Port Orc1a
  27. Config Pinb.4 = Output                                      'Port Orc1b
  28. Config Pinb.1 = Input                                       'Port PB1 przycisk
  29. Portb.1 = 1                                                 'Stan poczatkowy
  30.  
  31. 'Wyzerowany PWM
  32.  
  33. Pwm1a = 255
  34. Pwm1b = 255
  35.  
  36. 'Pętla
  37.  
  38. Do
  39.  
  40. '**************** ????
  41.  
  42.  
  43.  
  44.  
  45. '**************** ????
  46.  
  47. 'Warunek
  48.  
  49. If Pinb.1 = 0 Then
  50. Waitms 50
  51.  
  52. 'Rozjasnianie
  53.  
  54. For L = 0 To 254
  55. Pwm1a = Pwm1a - 1
  56. Pwm1b = Pwm1b - 1
  57. Waitms 3
  58. Next L
  59.  
  60. 'Powtarzaj jesli przycisk wcisniety
  61.  
  62. While Pinb.1 = 0
  63. Pwm1a = 0
  64. Pwm1b = 255
  65. Wend
  66. Waitms 1000
  67.  
  68. 'Przycienianie
  69.  
  70. For R = 0 To 254
  71. Pwm1a = Pwm1a + 1
  72. Pwm1b = Pwm1b + 1
  73. Waitms 3
  74. Next R
  75.  
  76. 'Przerwa 2 sek
  77.  
  78. Waitms 100
  79.  
  80. 'Koniec Warunku
  81.  
  82. End If
  83.  
  84. 'Koniec Pętli powtórz od nowa
  85.  
  86. Loop
  87.  
  88. 'Koniec Programu
  89.  
  90. End
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 » 26 mar 2017, 14:54

Oprogramowywałem kiedyś taki "ściemniacz" na dwa wyjścia led. Potem nawet użyłem jako efekt podświetlania schodków ciężarówki :D
Otwierasz drzwi i powoli podświetla się pierwszy a potem drugi schodek :D Po zamknięciu drzwi , po chwili schodki gasną, ale miały gasnąc już równocześnie a nie po kolei.

Punkt pierwszy o którym piszesz nie jest chyba skomplikowany do rozwiązania :D
  1. Config Portb.1 = Input : Set Portb.1 : Przycisk Alias Pinb.1
  2.  
  3. Dim Sw_cnt As Byte
  4.  
  5.  
  6. Do
  7.  
  8.  If Przycisk = 0 Then                   'jeśli wciśnięto przycisk
  9.   If Sw_cnt < 255 Then                  'i nie osiągnięto granicy przełączenia
  10.    Incr Sw_cnt                          'to dodawaj do licznika
  11.   Else                                  'jeśli jednak osiągnęliśmy granicę..
  12.    'zrob coś bo mamy już 255
  13.   End If
  14.  Else                                   'kiedy jednak puścimy przycisk
  15.   Sw_cnt = 0                            'to wyzeruj licznik
  16.  End If                                 'zawsze po wciśnieciu liczy od początku
  17.  
  18. Waitms 10
  19.  
  20. Loop
  21. End
Modyfikując juz niewiele można uzyskać różne wariacje typu "samopowtarzalność" kliku jeśli przytrzymamy przycisk.
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

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

Post autor: shrek133 » 26 mar 2017, 16:21

Przed modyfikacją :evil: :(
  1. 'Procek
  2.  
  3. $regfile = "attiny2313.dat"
  4.  
  5. 'Czestotliwosc
  6.  
  7. $crystal = 8000000
  8.  
  9. 'Zmienne typu Word
  10.  
  11. Dim R As Word
  12. Dim L As Word
  13. Dim T As Word
  14.  
  15.  
  16.  
  17. 'Start PWM'a
  18.  
  19.  
  20.  
  21. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
  22.  
  23. 'Deklaracja Portów
  24.  
  25. Config Pinb.3 = Output                                      'Port Orc1a
  26. Config Pinb.4 = Output                                      'Port Orc1b
  27. Config Pinb.1 = Input                                       'Port PB1 przycisk
  28. Portb.1 = 1                                                 'Stan poczatkowy
  29.  
  30. 'Wyzerowany PWM
  31.  
  32. Pwm1a = 255
  33. Pwm1b = 255
  34.  
  35. 'Pętla
  36.  
  37. Do
  38.  
  39. '**************** ????
  40.  
  41.  
  42.  
  43.  
  44. '**************** ????
  45.  
  46. 'Warunek
  47.  
  48. If Pinb.1 = 0 Then
  49. Waitms 50
  50.  
  51. 'Rozjasnianie
  52.  
  53. For L = 0 To 254
  54. Pwm1a = Pwm1a - 1
  55. Pwm1b = Pwm1b - 1
  56. Waitms 3
  57. Next L
  58.  
  59. 'Powtarzaj jesli przycisk wcisniety
  60.  
  61. While Pinb.1 = 0
  62. Pwm1a = 0
  63. Pwm1b = 255
  64. Wend
  65. Waitms 1000
  66.  
  67. 'Przycienianie
  68.  
  69. For R = 0 To 254
  70. Pwm1a = Pwm1a + 1
  71. Pwm1b = Pwm1b + 1
  72. Waitms 3
  73. Next R
  74.  
  75. 'Przerwa 2 sek
  76.  
  77. Waitms 100
  78.  
  79. 'Koniec Warunku
  80.  
  81. End If
  82.  
  83. 'Koniec Pętli powtórz od nowa
  84.  
  85. Loop
  86.  
  87. 'Koniec Programu
  88.  
  89. End


Po modyfikacji :D :P
  1. 'Procek
  2. $regfile = "attiny2313.dat"
  3.  
  4. 'Czestotliwosc
  5. $crystal = 8000000
  6.  
  7. 'Zmienne typu Word
  8. Dim R As Word
  9. Dim L As Word
  10. Dim T As Word
  11. Dim Sw_cnt 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.  
  24. Pwm1a = 255
  25. Pwm1b = 255
  26.  
  27. 'Pętla
  28. Do
  29.  
  30. 'Warunek
  31. If Pinb.1 = 0 Then
  32. If Sw_cnt < 150 Then
  33. Incr Sw_cnt
  34. Else
  35.  
  36. 'Rozjasnianie
  37.  
  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. Wend
  49. Waitms 1000
  50.  
  51. 'Przycienianie
  52. For R = 0 To 254
  53. Pwm1a = Pwm1a + 1
  54. Pwm1b = Pwm1b + 1
  55. Waitms 3
  56. Next R
  57. Waitms 100
  58.  
  59. 'Koniec Warunku
  60. End If
  61. Else
  62. Sw_cnt = 0
  63. End If
  64. Waitms 1
  65.  
  66. 'Koniec Pętli wróć na początek
  67. Loop
  68.  
  69. 'Koniec Programu
  70. End

Filmik
https://drive.google.com/file/d/0B5e3Gh ... FVMVE/view
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
kaktus
Posty: 32
Rejestracja: 19 sie 2015, 15:13
Lokalizacja: opolskie
Kontakt:

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

Post autor: kaktus » 01 kwie 2017, 11:19

Ponieważ diodki LED sterujemy prądem, a nie napięciem zawsze staram się pozbyć elementów wydzielających niepotrzebne ciepło z obwodu szeregowego.

Do takiego rozwiązania nadają się zatem drivery bardziej lub mniej specjalizowane - drivery prądowe. Szereg z nich posiada wejście do sterowania intensywnością świecenia nazywane DIMMER lub PWM.
Ciekawym uniwersalnym i niedrogim w stosowaniu rozwiązaniem jest układ PT4115. Wymaga niewielkiej ilości elementów zewnętrznych. Jeśli nie masz możliwości czasu na poznawanie i budowę swojego drivera, możesz poszukać uniwersalnych rozwiązań na portalach aukcyjnych. Modulików takich jest szeroki wybór i nie są drogie. Są dostępne też rozwiązania rodzimych konstruktorów np panów Darków ;-)
Ich zaletą jest szeroki zakres napięć zasilania i dostosowanie prądu do indywidualnych potrzeb tak by LED-ki świeciły długo z nieprzerwanie niezmienną intensywnością, bez wpływu na wahania napięcia wejściowego.
teraz życie można rozdzielić między NOP i SLEEP
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

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

Post autor: shrek133 » 29 cze 2017, 13:05

Jeszcze z driverami się nie bawiłem ale jak znajdę trochę więcej czasu na drivery to się zabiorę. A co do tego samego projektu to czy istnieje możliwość przerobienia tego programu tak aby były 4 osobne kanały i każdy działał niezależnie :?: Bo postanowiłem coś jeszcze dołożyć do tego a robić 4 osobne płytki lub 4x attiny13 :roll: to trochę chyba marnotrawstwo. Z góry dzięki za oświetlenie uliczki :D
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 » 29 cze 2017, 13:10

Nie ma problemu jeśli myślisz o mikrokontorlerze który ma więcej pinów bo jak rozumiem cztery przyciski/wejścia i cztery wyjścia?
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

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

Post autor: shrek133 » 29 cze 2017, 13:31

Dokładnie właśnie o to mi chodzi tylko zastanawiam się czy jest sens zmieniać Attiny2313.
Wyjścia do tranzystorów to były by PB4 PB3 PB2 PD5
Wejścia do Przycisków to PD3 PD4 PB1 PB0
No i zasilanie GND 5V
razem wykorzystanych 10 pinów
Tylko nie chodzi mi czasem o to że... Jeśli włączymy jeden to drugi nie włączy dopiero po tym jak pierwszy wykona operacje to dopiero drugi się załączy czy też pierwszy zakłuć prace drugiego lub na przemian.
Tak jak by to były 4 osobne układy 4 głowy :D

Podpowiedz jak to zmodyfikować :P
Pomysłów grom a realizacja to ekhm...
Zastosować to chcę OświetlenieSchowek OświetlenieKabiny OświetlenieBagażnika no i hit Oświetlenie deski że jak wkładasz kluczyk to UFO :D :twisted:
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 » 11 lip 2017, 19:03

Zobacz ten kod który niedawno napisałem na potrzeby forum Elektrody.
Czujniki PIR wydają z siebie stan wysoki kiedy wykryją ruch dlatego w programie użyte jest przerwanie INT z ustawionym wyzwalaniem Rising.
To Ci jest niepotrzebne, ale pokazuję kod tak jak był zamieszczony.

Ważne jest żebyś zrozumiał jak działa. Kiedy dostaje impuls plusowy to ustawia taki czas do odmierzenia 600 co oznacza 600 x100ms
Teraz kiedy zmienna do odmierzenia jest większa od zera to jest co 100ms zdejmowana o jeden. Jednak w tym czasie też dzieje się coś innego.
Zawsze kiedy zmienna jest większa od zera to sprawdzane jest czy zmienna od PWM ma już maksymalną wartość. Jeśli nie to jest zwiększana o jeden.
To tez dzieje się co 100ms wiec pomału rozjaśni to co ma rozjaśnić.
Natomiast gdy czas się skończy to sprawa jest odwracana. Dopóki PWM jest większy od zera to jest zdejmowany o jeden co 100ms więc pomału ściemni ;)
  1. $regfile = "attiny2313.dat"
  2. $crystal = 8000000
  3. $hwstack = 16 ' rozmiar stosu sprzętowego
  4. $swstack = 16 ' rozmiar stosu programowego
  5. $framesize = 16
  6.  
  7. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare_a_pwm = Clear_up , Compare_b_pwm = Clear_up
  8.  
  9.  
  10. '************ konfiguracja wejsc/wyjsc
  11. Config Pinb.0 = Output : Set Portb.0 : Led_1 Alias Portb.0
  12. Config Pinb.1 = Output : Set Portb.1 : Led_2 Alias Portb.1
  13. Config Pind.6 = Output : Set Portd.6 : Led_3 Alias Portd.6
  14. '********************* włączenie przerwania zewnętrznego Int1
  15.  
  16. Config Int1 = Rising
  17. Config Pind.3 = Input
  18. On Int1 Pir
  19. Enable Int1
  20.  
  21. '************
  22. Config Timer0 = Timer , Prescale = 1024                     '~ 33ms @8MHz/1024
  23.  
  24.  
  25. '*********************
  26. Dim Miliseconds As Byte , Pir_signal As Byte , Odliczaj_czas As Word
  27. Dim Pwm_level As Byte
  28.  
  29. Enable Interrupts
  30.  
  31. Do
  32.  
  33.  If Tifr.tov0 = 1 Then                                      'co 33ms
  34.   Tifr.tov0 = 1
  35.  
  36.    If Miliseconds < 2 Then
  37.     Incr Miliseconds
  38.    Else                                                     'co 100ms
  39.     Miliseconds = 0
  40.  
  41.  
  42.     If Odliczaj_czas > 0 Then
  43.      Decr Odliczaj_czas
  44.  
  45.      If Pwm_level < 255 Then                                'zwiekszaj do max co 100ms
  46.       Incr Pwm_level
  47.        Pwm1a = Pwm_level
  48.      End If
  49.  
  50.     Else                                                    'kiedy czas upłynał
  51.  
  52.      If Pwm_level > 0 Then                                  'zmniejszaj do zera co 100ms
  53.       Decr Pwm_level
  54.        Pwm1a = Pwm_level
  55.      End If
  56.  
  57.     End If
  58.  
  59.    End If
  60.  
  61.  End If
  62.  
  63. Loop
  64. End
  65.  
  66. Pir:
  67.  Odliczaj_czas = 600                                        'ustaw 60s
  68. Return
  69.  

W Twoim przypadku, żeby otrzymać cztery kanały PWM trzeba by napisac programowe PWM. Jest to dość łatwe do zrobienia ;)
Większa część jest pokazana na mojej stronie w dziale "Kody różne" własnie przy okazji programowego PWM.

...albo masz, łap :D

Kod jest prosty. Wejścia na PORTB.0 do PORTB.3 a wyjscia na PORTB.4 do PORTB.7
  1. $regfile = "attiny2313.dat"
  2. $crystal = 8000000
  3. $hwstack = 40
  4. $swstack = 16
  5. $framesize = 24
  6.  
  7. Config Portb = &B11110000 : Portb = &B00001111
  8.  
  9.  
  10. Config Timer0 = Timer , Prescale = 8 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  11. Enable Compare0a : On Compare0a Int0_isr : Compare0a = 124
  12.  
  13. Config Timer1 = Timer , Prescale = 64 , Compare_a = Disconnect , Compare_b = Disconnect , Clear_timer = 1
  14. Compare1a = 12499                                           '100ms @8MHz/64
  15.  
  16. Dim Pwm_val(4) As Byte , N As Byte , Licznik As Byte
  17.  
  18. Enable Interrupts
  19.  
  20.  
  21. Do
  22.  
  23.  If Tifr.ocf1a = 1 Then                                'jesli mineło 100ms
  24.   Tifr.ocf1a = 1                                       'skasuje flagę ustawioną przez Timer
  25.  
  26.  
  27.   For N = 0 To 3                                       'sprawdź cztery wejścia
  28.  
  29.    If Portb.n = 0 Then                                 'jeśli jest sygnał masy na wejściu
  30.  
  31.     If Pwm_val(n + 1) < 100 Then Incr Pwm_val(n + 1)   'jesli N=0 to zmieniamy Pwm_val(1)
  32.  
  33.    Else                                                'jeśli wejście w stanie wysokim
  34.  
  35.     If Pwm_val(n + 1) > 0 Then Decr Pwm_val(n + 1)     'zmniejszaj PWM  dla wybranego kanału
  36.  
  37.  
  38.    End If
  39.  
  40.   Next
  41.  
  42.  End If
  43.  
  44. Loop
  45. End
  46.  
  47. Int0_isr:
  48. Incr Licznik : If Licznik > 100 Then Licznik = 0
  49. If Licznik < Pwm_val(1) Then Set Portb.4 Else Reset Portb.4
  50. If Licznik < Pwm_val(2) Then Set Portb.5 Else Reset Portb.5
  51. If Licznik < Pwm_val(3) Then Set Portb.6 Else Reset Portb.6
  52. If Licznik < Pwm_val(4) Then Set Portb.7 Else Reset Portb.7
  53. Return
Coś tam powinno działać :D
Może trzeba zmienić jakieś czasy ;)
shrek133
Posty: 9
Rejestracja: 26 mar 2017, 13:57

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

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

Witam ponownie.
Troche kłopotliwie działa ten programik

Obecnie działa to tak:

Przytrzymuje Przycisk 2sek +-
Rozjaśnia się
Puszczam Przycisk
Świeci
Przyciemnia

A problem pojawia się że jak:
Przytrzymuje Przycisk 2sek +-
Rozjaśnia się
Puszczam Przycisk
i znowu przyciskam (Procedura nie resetuje czasu świecenia ciągłego że cały czas się świeci, tylko całość zaczyna się od nowa)
Świeci
Przyciemnia

Powinno działać tak:
Rozjaśnia się
Puszczam Przycisk
Nawet minimalne przyciśnięcie przycisku powinno podtrzymywać świecenie ciągłe przez 5 sek do puki nie dostanie żadnego impulsu ( Puszczam odlicza sie czas 5 4 3 i minimalnie szybko wciskam a ten czas tak jak by się resetował od nowa odlicza 5 4 3 ale światło cały czas się świeci nie miga!! dopiero jak nie dam impulsu 5 4 3 2 1 nastąpi przyciemnianie i wybudzenie dopiero wtedy gdy przytrzymam te 2 sekundy.
  1. 'Procek
  2.  
  3. $regfile = "attiny2313.dat"
  4.  
  5. 'Czestotliwosc
  6.  
  7. $crystal = 8000000
  8.  
  9. 'Zmienne typu Word
  10.  
  11. Dim R As Word
  12. Dim L As Word
  13. Dim T As Word
  14.  
  15.  
  16.  
  17. 'Start PWM'a
  18.  
  19.  
  20.  
  21. Config Timer1 = Pwm , Pwm = 8 , Prescale = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
  22.  
  23. 'Deklaracja Portów
  24.  
  25. Config Pinb.3 = Output                                      'Port Orc1a
  26. Config Pinb.4 = Output                                      'Port Orc1b
  27. Config Pinb.1 = Input                                       'Port PB1 przycisk
  28. Portb.1 = 1                                                 'Stan poczatkowy
  29.  
  30. 'Wyzerowany PWM
  31.  
  32. Pwm1a = 255
  33. Pwm1b = 255
  34.  
  35. 'Pętla
  36.  
  37. Do
  38.  
  39. '**************** ????
  40.  
  41.  
  42.  
  43.  
  44. '**************** ????
  45.  
  46. 'Warunek
  47.  
  48. If Pinb.1 = 0 Then
  49. Waitms 50
  50.  
  51. 'Rozjasnianie
  52.  
  53. For L = 0 To 254
  54. Pwm1a = Pwm1a - 1
  55. Pwm1b = Pwm1b - 1
  56. Waitms 3
  57. Next L
  58.  
  59. 'Powtarzaj jesli przycisk wcisniety
  60.  
  61. While Pinb.1 = 0
  62. Pwm1a = 0
  63. Pwm1b = 255
  64. Wend
  65. Waitms 1000
  66.  
  67. 'Przycienianie
  68.  
  69. For R = 0 To 254
  70. Pwm1a = Pwm1a + 1
  71. Pwm1b = Pwm1b + 1
  72. Waitms 3
  73. Next R
  74.  
  75. 'Przerwa 2 sek
  76.  
  77. Waitms 100
  78.  
  79. 'Koniec Warunku
  80.  
  81. End If
  82.  
  83. 'Koniec Pętli powtórz od nowa
  84.  
  85. Loop
  86.  
  87. 'Koniec Programu
  88.  
  89. End

Po modyfikacji :D :P
  1. 'Procek
  2. $regfile = "attiny2313.dat"
  3.  
  4. 'Czestotliwosc
  5. $crystal = 8000000
  6.  
  7. 'Zmienne typu Word
  8. Dim R As Word
  9. Dim L As Word
  10. Dim T As Word
  11. Dim Sw_cnt 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.  
  24. Pwm1a = 255
  25. Pwm1b = 255
  26.  
  27. 'Pętla
  28. Do
  29.  
  30. 'Warunek
  31. If Pinb.1 = 0 Then
  32. If Sw_cnt < 150 Then
  33. Incr Sw_cnt
  34. Else
  35.  
  36. 'Rozjasnianie
  37.  
  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. Wend
  49. Waitms 1000
  50.  
  51. 'Przycienianie
  52. For R = 0 To 254
  53. Pwm1a = Pwm1a + 1
  54. Pwm1b = Pwm1b + 1
  55. Waitms 3
  56. Next R
  57. Waitms 100
  58.  
  59. 'Koniec Warunku
  60. End If
  61. Else
  62. Sw_cnt = 0
  63. End If
  64. Waitms 1
  65.  
  66. 'Koniec Pętli wróć na początek
  67. Loop
  68.  
  69. 'Koniec Programu
  70. End
Pomoże ktoś ?
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, 17:37

Witam :D

Której wersji należy się trzymać , tej po modyfikacji czy przed :?:

Wersja po modyfikacji , nie rozumie do czego zmienna Sw_cnt

Czasy w pętlach FOR ...NEXT masz bardzo krótkie Waitms3 ...3 milisekundy , pętla skończy się zanim puścisz przycisk .
ODPOWIEDZ