Скачиваний:
37
Добавлен:
21.02.2014
Размер:
44.54 Кб
Скачать

list p=pic16f628 ;Задаем тип микрокон-

;троллера

Include <p16f628.inc> ;Подключаем файл с описанием ;служебных регистров

;микроконтроллера PIC16F628

__ config _INTRC_OSC_CLKOUT &_DATA_CP_OFF &_CP_OFF &_BODEN_ON &_MCLRE_OFF &_PWRTE_ON &_WDT_OFF &_LVP_OFF ;Задаем слово конфигурации ;микроконтроллера

bot equ 20h

;Начальный адрес размещения переменных

cblock bot

impuls

temp

endc

#define shift STATUS,RP0 ;Бит переключения банков

#define zero STATUS,Z ;Бит нулевого результата

#define carry STATUS,C ;Бит отрицательного ;результата

#define speed PCON,OSCF ;Бит переключения ;скорости RC-генератора

#define key_1 PORTA,1 ;Кнопка №1

#define key_2 PORTB,0 ;Кнопка №2

#define key_3 PORTB,1 ;Кнопка №3

#define led PORTB,2 ;Вывод светодиода

org 0x2100 ;Адрес EEPROM памяти

DATA 0xA5 ;Ячейка EEPROM памяти со ;стартовой скважностью ШИМ

org 0x000 ;Вектор сброса

goto reset ;Идем на инициализацию

org 0x004 ;Вектор прерываний

return ;Выход с запрещением ;прерываний

;*****************************************************************************

; Инициализация микроконтроллера

;*****************************************************************************

reset clrf PORTB ;Очищаем порт В

clrf PORTA ;Очищаем порт A

movlw 0xff

movwf CMCON ;Выключаем модуль ;компараторов

bsf shift ;Выбираем Банк №1

movlw b’00000111’

movwf OPTION_REG ;Включаем делитель перед ;TMR0 1:256

movlw 0xff

movwf TRISA ;Определяем направление ;работы порта А movlw b’00000011’

movwf TRISB ;Определяем направление ;работы порта В bcf shift ;Выбираем Банк №0

;*****************************************************************************

; Начало основной программы

;*****************************************************************************

off clrf CCP1CON ;Выключаем ШИМ

bcf PORTB,3 ;Устанавливаем логический 0 на выходе ШИМ

movlw b’00111111’

movwf T2CON ;Настраиваем работу TMR2

bsf shift ;Выбираем Банк №1

movlw 0xff

movwf PR2 ;Задаем новый период ;работы TMR2

bcf speed ;Переключаем скорость внутреннего RC-генератора (37КГц)

bcf shift ;Выбираем Банк №0

bsf PIR1,TMR2IF ;Устанавливаем флаг ;прерывания TMR2

scan_1 btfsc key_1 ;Проверяем состояние ;кнопки key_1

goto start ;Если нажата, то идем на ;метку start

btfss PIR1,TMR2IF ;Проверяем состояние ;флага прерывания TMR2

goto scan_1

bcf PIR1,TMR2IF ;Сбрасываем флаг ;прерывания TMR2

btfss led ;Проверяем, включен ли светодиод

goto led_on ;Если он выключен, то ;идем на соответствующую ;метку

led_off bcf led ;Выключаем светодиод

movlw b’00111111’

movwf T2CON ;Задаем новый период ;работы TMR2

goto scan_1 ;Возвращаемся в начало цикла поверки состояния кнопки key_1

led_on bsf led ;Включаем светодиод

movlw b’00000111’

movwf T2CON ;Задаем новый период ;работы TMR2

goto scan_1 ;Возвращаемся в начало цикла поверки состояния кнопки key_1

start bcf led ;Гасим светодиод

bsf shift ;Выбираем Банк №1

bsf speed ;Переключаем скорость внутреннего RC-генератора ;(4МГц)

movlw 0x3E

movwf PR2 ;Задаем период ШИМ (15кГц)

bcf shift ;Выбираем Банк №0

call write ;Вызываем подпрограмму ;записи скважности в ;регистры ШИМ

movlw b’01111100’

movwf T2CON ;Настраиваем работу TMR2

movlw b’00001111’

iorwf CCP1CON,1 ;Запускаем ШИМ

scan_2 btfss key_1 ;Проверяем, не отпущена ли кнопка key_1

goto off ;Если отпущена, то идем ;на метку off

btfss key_2 ;Проверяем состояние ;кнопки key_2

goto plus ;Если нажата, то идем на ;метку plus

btfss key_3 ;Проверяем состояние ;кнопки key_3

goto minus ;Если нажата, то идем на ;метку minus

goto scan_2 ;Повторяем цикл ;сканирования клавиатуры

plus movf impuls,w ;Сохраняем величину ;импульса ШИМ в ;аккумуляторе

sublw 0xff ;Сравниваем значение импульса ШИМ с максимальным ;значением

btfsc zero ;Проверяем состояние ;флага Z

goto exit_2 ;Если значение ;максимально, то выходим

movlw 0x03

addwf impuls,1 ;Увеличиваем длительность ;импульса ШИМ

goto exit_1 ;Идем на выход

minus movf impuls,w ;Сохраняем величину ;импульса ШИМ в ;аккумуляторе

sublw 0x69 ;Сравниваем значение импульса ШИМ с минимальным ;значением

btfsc zero ;Проверяем состояние ;флага Z

goto exit_2 ;Если значение минимально, ;то выходим

movlw 0x03

subwf impuls,1 ;Уменьшаем длительность ;импульса ШИМ

goto exit_1 ;Идем на выход

exit_1 bcf INTCON,GIE ;Запрещаем все прерывания

movf impuls,w ;Сохраняем значение длины ;импульса в аккумуляторе

bsf shift ;Выбираем Банк №1

movwf EEDATA ;Переписываем значение ;импульса в регистр ;EEPROM памяти

clrf EEADR ;Задаем адрес ячейки ;EEPROM памяти

bsf EECON1,WREN ;Разрешаем запись в ;EEPROM память

movlw 0x55

movwf EECON2 ;Записываем код для ;разрешения записи в ;EEPROM память

movlw 0xAA

movwf EECON2 ;Записываем код для ;разрешения записи в ;EEPROM память

bsf EECON1,WR ;Включаем запись

btfsc EECON1,WR ;Ожидаем окончания записи

goto $-1

bcf shift ;Выбираем Банк №0

call write ;Вызываем подпрограмму ;записи скважности в ;регистры ШИМ

exit_2 bsf led ;Включаем светодиод

movlw 0x02 ;Задаем величину паузы

call pause ;Вызываем подпрограмму ;паузы

bcf led ;Выключаем светодиод

movlw 0x04 ;Задаем величину паузы

call pause ;Вызываем подпрограмму ;паузы

goto scan_2 ;Возвращаемся в начало цикла поверки состояния кнопок

;*****************************************************************************

; Подпрограмма записи скважности в регистры ШИМ

;*****************************************************************************

write bsf shift ;Выбираем Банк №1

clrf EEADR ;Задаем адрес ячейки ;EEPROM памяти

bsf EECON1,RD ;Включаем чтение

;EEPROM памяти

movf EEDATA,w ;Сохраняем полученное ;значение в аккумуляторе

bcf shift ;Выбираем Банк №0

movwf impuls

;Переписываем полученное значение длительности ;импульса в регистр

movwf temp ;Переписываем полученное значение длительности ;импульса в регистр

bcf CCP1CON,4 ;Сбрасываем бит

bcf CCP1CON,5 ;Сбрасываем бит

bcf carry ;Сбрасываем флаг С

rrf temp,1

;Сдвигаем вправо значение регистра, в котором ;находится величина длительности импульса

btfsc carry ;Проверяем состояние ;флага С

bsf CCP1CON,4 ;И устанавливаем бит, ;если С=1

bcf carry ;Сбрасываем флаг С

rrf temp,1

;Сдвигаем вправо значение регистра, в котором ;находится величина длительности импульса

btfsc carry ;Проверяем состояние ;флага С

bsf CCP1CON,5 ;И устанавливаем бит, если ;С=1

movf temp,w

movwf CCPR1L ;Записываем старшие ;разряды скважности

return ;Выходим из подпрограммы

;*****************************************************************************

; Подпрограмма паузы для обеспечения плавности регулировок скважности ШИМ

;*****************************************************************************

pause movwf temp ;Сохраняем величину паузы ;в регистре

clrf TMR0 ;Очищаем TMR0

p_1 bcf INTCON,T0IF

;Сбрасываем флаг прерывания по переполнению TMR0

btfss INTCON,T0IF

;Проверяем состояние флага переполнения TMR0

goto $-1 ;Создаем цикл

decfsz temp,1 ;Отнимаем единицу от ;значения регистра

goto p_1 ;Создаем цикл

return ;Выходим из подпрограммы

end

Соседние файлы в папке Лит-ра для КР