Форум Мікро-Чіп - Плавна зміна яскравості світлодіодів на pic16f84

Zajig movlw .255 movwf Duty Zajig_1 movlw B'11111111' movwf PortB movlw Duty movwf Temp TempOK decfsz Temp,F goto TempOK movlw B'00000000' movwf PortB movlw Duty movwf Temp comf Temp,F TempOKK decfsz Temp,F goto TempOKK incf Duty,F

movlw .255 movwf SecL Pause_CC decfsz SecL,F goto Pause_CC

Вибачте, але не зрозумів. до чого це. Що тільки у менший бік?

ЗИ. Є нюанс. При використанні передекремента (decfsz) потрібно перевірити перед циклом величину на нуль і вийти одразу (якщо нуль), інакше буде помилка позики.

Піднімати можна до 254. Якщо буде мало, потрібно давати затримку на керування.

Є ще одна штука - величина шпаруватості ШИМ не лінійна яскравості світлодіода. Це також бажано враховувати.

Вибачте, але не зрозумів. до чого це. Що тільки у менший бік?

Щось не знайшов команди на перевірку. Підкажіть плз. Куди вийти. Мені потрібно домогтися, щоб світлодіоди з максимальною яскравістю, плавно зменшили яскравість, наприклад, на половину, і продовжували світитися в півяскравості.

1. Перевірка біта -bittestfskip ifset(clear) -btfss(btfsc). Ознака нульового результату останньої операції (якщо вона має цю ознаку) - прапор Z регістру STATUS. Разом, олтугеза -btfss STATUS, Z2. Ще раз. Є цикл ШИМа (будь-який алгоритм). У ньому використовується змінна заповнення (наприклад, duty). Якщо цей цикл цю змінну повільно зменшувати (наприклад кожні 128 циклів ШИМа на одиницю), то яскравість буде плавно зменшуватися. При цьому потрібно кожен цикл перевіряти величину duty і, як тільки вона дорівнюватиме мінімальній заданій яскравості, так потрібно обходити процес їїдекременту. Тобто. після цього яскравість змінюватися не буде.

ЗИ. Писати код за Вас не принципово.

Як я зрозумів, потрібно плавно зменшувати pwm з 64 до, наприклад, 15, але не зрозумію як зробити такий цикл, після шима.

А щодо розрядності, то на око не видно. що 64.. що 254. Затримку на керування? не зовсім зрозумів про що це.

Як я зрозумів, потрібно плавно зменшувати pwm з 64 до, наприклад, 15, але не зрозумію як зробити такий цикл, після шима.

А щодо розрядності, то на око не видно. що 64.. що 254. Затримку на керування? не зовсім зрозумів про що це.

Краще оформити ШІМ як підпрограму, якій передається значення, від якого лінійно залежить коефіцієнт заповнення. Т.к. часи більші, то витрати на виклик підпрограми зневажливо малі. Без структурування програми її зростання після якоїсь (причому досить невеликої) межі стає неможливим. І завжди треба намагатися розділити програму на підпрограми (в ідеалі, якщо можна, як дрібніші).

Спробуйте самі. Чужий код добрий, коли щось своє вже є.

Зрозуміло, починаємо з нуля))). Я теж спочатку вчився на чужих вихідниках, але я сам шукав що потрібно було, нікого не напружуючи). Гаразд, ще кусочок коду:). Як, що куди розбирайся сам. Краще самонавчання вчителя немає.

;цикл затримки (у коді оновлення циклу ШІМ)

INCFSZ del1,f ;перший лічильник GOTO nz INCFSZ del2,f ;другий лічильник GOTO nz

MOVLW .100 ;встановлюємо необхідну затримку для нового циклу MOVWF del2

#include p10F200.inc skv equ .20 ;скважність ШІМ (0-31) del1 equ .21 ;лічильник del2 equ .22 ; port equ .23 ;порт GPIO ORG 0 ;вектор старту init MOVLW .31 MOVWF skv ;початкова шпаруватість ШИМ MOVLW .31 MOVF del1 ;лічильник шима CLRF port MOVLW .20 MOVLW del2 ;наростання шпаруватості MOVLW b'01111111' OPTION MOVLW b'11111110' MOVWF OSCCAL MOVLW b'00001000' TRIS .6 MOVLW b'00000001' ;вимикаємо дані порту MOVWF GPIO

start; ОСНОВНА ПРОГРАМА BSF port,0 MOVF skv,w SUBWF del1,w BTFSS STATUS,C BCF port,0 MOVF port,w MOVWF GPIO DECFSZ del1,f ;операція дільника лічильника GOTO start MOVLW .31 MOVWF del1 INCFSZ del2,f GOTO start MOVLW .20 MOVWF del2 ; приріст шпаруватості MOVF skv,w BTFSS STATUS,Z DECF skv,f GOTO start END

Спасибі, що потрібно, ось чистий код для того щоб світлодіод плавно включався:

MOVLW .31 MOVWF skv ;початкова шпаруватість ШИМ MOVLW .31 MOVF del1 ;лічильник шима CLRF port MOVLW .20 MOVLW del2 ;наростання шпаруватості

start; ОСНОВНА ПРОГРАМА BSF port,2 MOVF skv,w SUBWF del1,w BTFSS STATUS,C BCF port,2 MOVF port,w movwf PortB DECFSZ del1,f ;операція дільника лічильника GOTO start MOVLW .31 MOVWF del1 INCFSZ del2,f GOTO start MOVLW .20 MOVWF del2 ; приріст шпаруватості MOVF skv,w BTFSS STATUS,Z DECF skv,f GOTO start END

Спасибі, що потрібно, ось чистий код для того щоб світлодіод плавно включався:

MOVLW .31 MOVWF skv ;початкова шпаруватість ШИМ MOVLW .31 MOVF del1 ;лічильник шима CLRF port MOVLW .20 MOVLW del2 ;наростання шпаруватості

start; ОСНОВНА ПРОГРАМА BSF port,2 MOVF skv,w SUBWF del1,w BTFSS STATUS,C BCF port,2 MOVF port,w movwf PortB DECFSZ del1,f ;операція дільника лічильника GOTO start MOVLW .31 MOVWF del1 INCFSZ del2,f GOTO start MOVLW .20 MOVWF del2 ; приріст шпаруватості MOVF skv,w BTFSS STATUS,Z DECF skv,f GOTO start END

>>підпрограма ШІМ включили вимкнули

основна програма: завантаження початкової шпаруватості мітка1: інкремент шпаруватості Добре більше потрібної? Так – йдемо далі. Ні - йдемо на.

завантаження початкової шпаруватості мітка2: декремент шпаруватості Добре менше потрібної? Так – йдемо далі. Ні - йдемо на

каюся. ( але простенькі проги вже пишу. це маленька підпрограма великої програми, яка мені не дається :(

я розумію, що потрібно зменшувати лічильник до певного часу, але не можу зрозуміти як він працює:(

Ось наприклад, що робить ця рядок? цей біт я не можу зрозуміти (

каюся. ( але простенькі проги вже пишу. це маленька підпрограма великої програми, яка мені не дається :(

я розумію, що потрібно зменшувати лічильник до певного часу, але не можу зрозуміти як він працює:(

Ось наприклад, що робить ця рядок? цей біт я не можу зрозуміти (

Ні, все-таки даремно готові коди одразу, тому й питання з'являються законні в цьому випадку. Потрібно блок-схему алгоритму розмалювати, тоді і код народиться.

Для прапора C написано в даташите, тобто. хто він такий і що може змінити.

Всім спасибі хтось допомагав, окреме спасибі за готовий код Industrialniy Ось наче трохи розібрався, і допилив те що потрібно. правда код майжеу 2а рази виріс. спробую оптимізувати, але головне робить те, що мені потрібно було :) Ось, може кому знадобиться:

init MOVLW .31 MOVWF skv ;початкова шпаруватість ШИМ MOVLW .25 MOVWF skvv MOVLW .66 MOVF del1 ;лічильник шима CLRF port MOVLW .20 MOVLW del2 ;наростання шпаруватості

start; ОСНОВНА ПРОГРАМА BCF port,2; встановити в 0 біт 2 регістра port MOVF skv,w SUBWF del1,w; Відняти W з dell BTFSS STATUS,C; Перевірити біт C в регістрі STATUS, якщо C=1, то пропустити наступну інструкцію BSF port,2 MOVF port,w movwf PortB DECFSZ del1,f ;операція дільника лічильника (відняти 1 з dell з розгалуженням) GOTO start MOVLW .66 MOVWF del1 INCFSZ del2,f GOTO start MOVLW .20 MOVWF del2 ;приріст шпаруватості MOVF skv,w BTFSS STATUS,Z DECF skv,f

cycle BCF port,2; встановити в 0 біт 2 регістра port MOVF skv,w SUBWF del1,w; Відняти W з dell BTFSS STATUS,C; Перевірити біт C в регістрі STATUS, якщо C=1, то пропустити наступну інструкцію BSF port,2 MOVF port,w movwf PortB DECFSZ del1,f ;операція дільника лічильника (відняти 1 з dell з розгалуженням) goto cycle MOVLW .66 MOVWF del1 INCFSZ del2,f GOTO cycle MOVLW .20 MOVWF del2 ;приріст шпаруватості MOVF skv,w BTFSS STATUS,Z goto cycle END