курсовой проект / Аэроионизатор / Лит-ра для КР / Программа PIC
.doclist 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