Programowy PWM na 18-tu kanałach

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Programowy PWM na 18-tu kanałach

Post autor: Zbyszek » 13 sty 2025, 9:01

Witam,
Chciałem zrobić sterownik do podświetlania schodów. Mam 18 stopni i do każdego stopnia puściłem osobny kabelek. Chciałbym żeby stopnie zaświecały i rozjaśniały się po kolei, to znaczy
1 krok - 1 stopień 10%
2 krok - 1 stopień 20% - 2 stopień 10%
3 krok - 1 stopień 30% - 2 stopień 20% - 3 stopień 10%

Czy da radę zrobić to programowym PWM ? pewnie tak tylko nie za bardzo wiem jak przypisać do danego portu żeby na nim było wypełnienie PWM o zadanej wartości.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Programowy PWM na 18-tu kanałach

Post autor: niveasoft » 13 sty 2025, 9:40

Da się na pewno. Napisałem juz taki sterownik na 21 stopni. Do tego wiele efektów do wyboru. Poniżej wideo z testów.
On ma też zapalać tak słabo skrajne stopnie żeby było wiadomo po ciemku gdzie są schody. Schody mają wejście na czujniki, ale nie zapalaja sie w dzień.
Do tego regulowane czasy. mam nawet do tego płytkę :D
Mogę pomóc z programowym PWM, ale te efekty to sam opracujesz :D

Zbyszek
Posty: 96
Rejestracja: 30 lis 2017, 17:12

Re: Programowy PWM na 18-tu kanałach

Post autor: Zbyszek » 13 sty 2025, 10:02

Efekty nie są mi potrzebne, wystarczy tak jak opisałem w 1 poście, dwa wejścia atmegi były by zarezerwowane jako załącz / wyłącz schody. Chciałem to zrobić na czujnikach zbliżeniowych sharpa ( z czujnikami to nie problem ). Tylko jak w bascomie przypisać wypełnienie xx % do danego portu. Wystarczyła by mi wtedy Atmega 8 albo 328 jak by brakło pamięci. 1 i ostatni stopień też nie muszą się świecić. Sygnał z 1 czujnika - powoli się rozświetlają, a sygnał z 2 czujnika - powoli przygasają.
Podpowiesz jak przypisać wypełnienie xx % do danego portu ?
Efekt ma być taki jak na samym początku filmu.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Programowy PWM na 18-tu kanałach

Post autor: niveasoft » 13 sty 2025, 10:09

Najpierw zajrzyj na moją stronę -> https://bart-projects.pl/rozne.html
Tam, gdy przewiniesz niżej jest temat i kod "Programowe PWM na ośmiu kanałach na Attiny2313 i każdym innym - Soft PWM Bascom"
Jak coś będzie niejasne to pisz dalej śmiało ;)

Tam jest pętla For-Next która nie jest za szybka, ale to tam było na jednym porcie.
Można to rozpisac na linijki dla kazdego pinu i bedzie nawet szybciej.
Awatar użytkownika
niveasoft
Posty: 1313
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Programowy PWM na 18-tu kanałach

Post autor: niveasoft » 13 sty 2025, 10:51

Tu jest kawałek kodu tych schodów. 24 kanały. Atmega32 przy 16MHz
  1. '*** Timer0 Config  for Software PWM 24 channel ***
  2. Config Timer0 = Timer , Prescale = 8 , Compare = Disconnect , Clear_timer = 1
  3. Enable Compare0 : On Compare0 Timer0_isr Nosave : Compare0 = 150
  1. Timer0_isr:
  2.  
  3.   $asm
  4.   !PUSH R16
  5.   !PUSH R20
  6.   !PUSH R24
  7.   !PUSH R26
  8.   !PUSH R27
  9.   !in R24, sreg
  10.   !PUSH  R24
  11.   $end Asm
  12.  
  13.       Incr Licznik                                          'zwieksz Licznik o jeden
  14.  If Licznik = 100 Then Licznik = 1                          'jesli Licznik = 100 to wyzeruj
  15.  
  16.  If Licznik > Pwm_val(1) Then Reset Portc.7 Else Set Portc.7
  17.  If Licznik > Pwm_val(2) Then Reset Portc.6 Else Set Portc.6
  18.  If Licznik > Pwm_val(3) Then Reset Portc.5 Else Set Portc.5
  19.  If Licznik > Pwm_val(4) Then Reset Portc.4 Else Set Portc.4
  20.  If Licznik > Pwm_val(5) Then Reset Portc.3 Else Set Portc.3
  21.  If Licznik > Pwm_val(6) Then Reset Portc.2 Else Set Portc.2
  22.  If Licznik > Pwm_val(7) Then Reset Portc.1 Else Set Portc.1
  23.  If Licznik > Pwm_val(8) Then Reset Portc.0 Else Set Portc.0
  24.  
  25.  If Licznik > Pwm_val(9) Then Reset Portd.7 Else Set Portd.7
  26.  If Licznik > Pwm_val(10) Then Reset Portd.6 Else Set Portd.6
  27.  If Licznik > Pwm_val(11) Then Reset Portd.5 Else Set Portd.5
  28.  If Licznik > Pwm_val(12) Then Reset Portd.4 Else Set Portd.4
  29.  If Licznik > Pwm_val(13) Then Reset Portd.3 Else Set Portd.3
  30.  If Licznik > Pwm_val(14) Then Reset Portd.2 Else Set Portd.2
  31.  If Licznik > Pwm_val(15) Then Reset Portd.1 Else Set Portd.1
  32.  If Licznik > Pwm_val(16) Then Reset Portd.0 Else Set Portd.0
  33.  
  34.  If Licznik > Pwm_val(17) Then Reset Portb.7 Else Set Portb.7
  35.  If Licznik > Pwm_val(18) Then Reset Portb.6 Else Set Portb.6
  36.  If Licznik > Pwm_val(19) Then Reset Portb.5 Else Set Portb.5
  37.  If Licznik > Pwm_val(20) Then Reset Portb.4 Else Set Portb.4
  38.  If Licznik > Pwm_val(21) Then Reset Portb.3 Else Set Portb.3
  39.  If Licznik > Pwm_val(22) Then Reset Portb.2 Else Set Portb.2
  40.  If Licznik > Pwm_val(23) Then Reset Portb.1 Else Set Portb.1
  41.  If Licznik > Pwm_val(24) Then Reset Portb.0 Else Set Portb.0
  42.  
  43.   '          Tuned with NoSave Tool
  44.  
  45.   $asm
  46.   !POP  R24
  47.   !out sreg, r24
  48.   !POP R27
  49.   !POP R26
  50.   !POP R24
  51.   !POP R20
  52.   !POP R16
  53.   $end Asm
  54.  
  55. Return
ODPOWIEDZ