Lev@

Шим На Pic16f628

11 сообщений в этой теме

Lev@    1

Думаю в жизни каждого верстальщика программ для МК возникает момент, когда необходимо написать программу , которая будет формировать ШИМ сигналы. Вот и я наконец пришел к этому.

Посидев полдня в изучении даташитов(без пива – нельзя, болею) так ничего толкового и не надумал. Решил обратится к своему старому другу и помощнику – книгам по программированию. Сразу стало ясно, что на PICBasic сделать нормальный ШИМ не получится, значит придется работать по старинке – ASM!

И так попробую подитожить, что у меня получилось.

Первое: Период. Это время, за которое таймер TMR2 сделает полный цикл 00:FF и равное

(4*tosc)*Коэфф. деления предделителя*(PR2+1)

, где 4*tosc – длительность машинного цикла(при тактовой частоте 4МГц = 4*1/4)

Коэфф. деления предделителя – 1:1, 1:4, 1:16 устанавливается в регистре T2CON битами T2CKPS1: T2CKPS0

PR2 – это регистр периода таймера TMR2, т.е. им задается время через которое таймер сделает полный цикл.

… с этим вроде понятно?!

Дальше – скважность или длительность импульса CCP1. Тут немного сложнее, задается регистром CCPR1L(в упрощенном виде) численно означает сколько времени относительно TMR2 будет длится импульс CCP1, т.е. если PR2 больше CCPR1L в два раза – половину счета времени таймером на выходе CCP1 будет лог. 1, а другую лог. 0. Если значения PR2 и CCPR1L будут равны(или CCPR1L) – то на выходе CCP1 всегда будет лог. 1. Если CCPR1L будет 00 - то на выходе CCP1 всегда будет лог.0.

Как смог, так и объяснил… Фух!

Кстати самое интересное – ШИМ работает в фоновом режиме – т.е. программа может спокойно делать другие задачи. И еще одно значение регистра CCPR1L можно менять походу выполнения программы, единственное, «но» модуль ШИМ его воспримет только тогда, когда таймер TMR2 закончит счет.

Думаю этого хватит чтобы написать небольшую(первую) программку с ШИМ.

 
list	p=16f628a
#include	<p16f628a.inc>
org	0x00
reset
goto	start
org	0x20
; **************************************************************
start
clrf	ccp1con		; выключить модуль CCP
clrf	TMR2		; Очистить TMR2(на всякий случай)
bsf	STATUS,RP0	; Банк 1
movlw	b'11111111'	; Задаем период TMR2
movwf	PR2
bcf	STATUS,RP0	; Банк 0
movlw	b'11111110'	; Задаем длительность импульса CCP1
movwf	CCPR1L
clrf	INTCON		; Запрещаем все прерывания
bsf	STATUS,RP0	; Банк 1
bcf	TRISB,3		; Задаем направление выводу RB3 - CCP1
clrf	PIE1		; Запрет прерываний от периферийных модулей
bcf	STATUS,RP0	; Банк 0
clrf	PIR1		; Срос флагов прерываний от периферийных модулей
movlw	b'00001100'	; Переводим модуль CCP1 в режим ШИМ
movwf	CCP1CON
bsf	T2CON,TMR2ON	; Включить таймер TMR2
clrwdt			; Очистить сторожевой таймер

label
clrwdt			; Очистить сторожевой таймер
btfss	pir1,tmr2if	; Проверка переполнения TMR2
goto	label
decf	CCPR1L,1
clrf	PIR1		; Сброс флагов прерываний от периферийных модулей
goto	label
end

Изменено пользователем Lev@

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Немного не понятно в чём у Вас проблема. Или вы хотите знаниями из даташита поделиться ? Если воторое, то это никчему, каждый это может увидеть в ДШ :)

CCPR1 не обязательно менять после переполнения TMR2, сам модуль обработает эти изменения тогда, когда ему это будет нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lev@    1
Немного не понятно в чём у Вас проблема. Или вы хотите знаниями из даташита поделиться ? Если воторое, то это никчему, каждый это может увидеть в ДШ :)

Мысль была в том что может кому-то поможет мое описание... ХЗ лично я не всегда с даташита мог понять что делать... :(

CCPR1 не обязательно менять после переполнения TMR2, сам модуль обработает эти изменения тогда, когда ему это будет нужно.

Это я уже для своего случая начал делать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Broka    3

Вопрос такой интересный ,а почему на PicBasic сделать нормальный ШИМ нельзя? У него что,что то не хватает?

Я например недавно устройство сделал,так написал всю прогу на PicBasic,в том числе и ШИМ( Прекрасно всё работает)

Это для 16F628A, так что в PicBasic всё работает не хуже, хотя иногда приходится вставлять строки на ASMe

CCPR1L = 14 ;Установка периода 50%

CCP1CON = %00001111 ;Включаем ШИМ

STATUS.5 = 1;Банк 1

PR2 = 27 ;Частота ШИМ примерно 36КГЦ (для TSOP1736)

STATUS.5 = 0;БАНК 0

TMR2 = 0;Включение модуля ШИМ

T2CON = %00000100;и таймера TMR2, чтобы ШИМ работало

Изменено пользователем Broka

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3110    0

Спасибо за пояснения)) А у меня такой вопрос: кнотроллер PIC16F8..(забыл дальше) ну не важно... Частоту шим надо сделать в районе 40-50 Гц. Кварц на 10 Мгц... что-то не очень низкая частота ШИМ получается на такой тактовой ))

Но у таймера есть еще делитель на выходе (тоже вроде максимум на 16). Можно ли это деление как-то применить?

ps В контроллерах не силен, но сделать хочется)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lev@    1
Вопрос такой интересный ,а почему на PicBasic сделать нормальный ШИМ нельзя? У него что,что то не хватает?

Я например недавно устройство сделал,так написал всю прогу на PicBasic,в том числе и ШИМ( Прекрасно всё работает)

Это для 16F628A, так что в PicBasic всё работает не хуже, хотя иногда приходится вставлять строки на ASMe

CCPR1L = 14 ;Установка периода 50%

CCP1CON = %00001111 ;Включаем ШИМ

STATUS.5 = 1;Банк 1

PR2 = 27 ;Частота ШИМ примерно 36КГЦ (для TSOP1736)

STATUS.5 = 0;БАНК 0

TMR2 = 0;Включение модуля ШИМ

T2CON = %00000100;и таймера TMR2, чтобы ШИМ работало

Да, правильно - если не использовать стандартную библиотеку БарсиКа... помоему PWM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
arhimed2007    6

Вопрос чайника :) : включение/выключение ШИМ осуществляется запуском/остановкой TMR2? Допустим, мне надо по команде останавливать ШИМ и выставлять на его выходе 0. 

Командой

bсf T2CON,TMR2ON

это можно устроить? Или надо каждый раз очищать/переинициализировать CCP1CON?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 324

читайте  референс мануал на модуль ССР пока не придет озарение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    546

Выключение модуля осуществляется ровно также, как и его включение. Только обратной операцией.
Как его включить (или выключить) - подробно описано в документации на камень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
arhimed2007    6

Да, сбросом/восстановлением CCP1CON всё делается на ура. Спасибо за ответы, особенно компании Microchip :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас