Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
34
Добавлен:
21.02.2014
Размер:
257.02 Кб
Скачать

На выводы 10 – 13 микроконтроллера поступают сигналы от четырех установленных на плате ввода/вывода кнопок, с помощью которых управляют источником. Формируемые микроконтроллером в последовательной форме сигналы управления находящимися на той же плате двумя цифровыми светодиодными индикаторами сдвиговый регистр DD2 преобразует в параллельную форму. Индикация динамическая: в зависимости от уровней напряжения на выводах 6 и 9 DD1 в каждый момент времени работает лишь один из индикаторов.

5 РАЗРАБОТКА УПРАВЛЯЮЩЕЙ ПРОГРАММЫ

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_ Проверяем, не отпущена ли кнопка 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

26

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

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