Евстифеев "Микроконтроллеры AVR..." - описано конфигурирование GICR всякие int и иже с ним...
как сие применимо к моему случаю? не укладывается в голове
(ATMega 162)
Абсолютно верно - мастер начального кода в CVAVR позволят быстро и главное ПРАВИЛЬНО сконфигурировать МК. И не только в начале написания программы но и по ходу работы.factorial писал(а):организацию прерываний я начинаю в CodeWizard в CodeVisionAVR, он и мне автоматом выставляет куда кокой бит записать. А потом смотрю, что он куда поставил, если подробней, то ищу описание тех регистров в даташите.
После того как мастер создаст код посмотрите комментарии в нем - какие строки конфигурируют прервания (либо то что вам нужно) - там вы увидите что в какие то регистры что-то записывается.CyberMerlin писал(а):я конечно понимаю желание каждого посадить меня на использование программы которая будет думать за меня, НО все таки хотелось бы разобраться с этим
это немножко не понятно, полагаю там можно использовать не только есть/нет сигнала, но и по напряжению подаваемому на ногу??по низкому уровню, по изменению уровня
как я понял из страниxrb о прерываниях в AVR - pid.by.ru/03.htmCyberMerlin писал(а): 2- MCUCR не для 162 как я понял, т.е. в данном случае получается юзается GICR
Поэтому очень рекомендую прочитать о прерваниях по русски и с рабочими примерами - исходник и симуляция с кнопками.CyberMerlin писал(а): полагаю там можно использовать не только есть/нет сигнала, но и по напряжению подаваемому на ногу??
но как тогда это реализовать и какой шаг напряжения
(в даташите (поскольку он ангельский) не смог осилить)
Код: Выделить всё
; ПРОГРАММА ДЛЯ ИЗВЕЩАТЕЛЯ ПОЖАРНОГО ДЫМОВОГО ИП 212-32М
; 1. ВКЛЮЧЕНИЕ ИК-СВЕТОДИОДА ДОЛЖНО ПРОИСХОДИТЬ НА ВРЕМЯ 50 МКС
; С ПЕРИОДОМ 1 С
; Организация программы:
; Проверка на сброс при помощи WDT (период тика WDT 1152 мс)
;Если сброс произошел не при помощи WDT, то выполняется Функция Setup
; которая устанавливает начальные значения переменных и инициализирует таймер 0
; Если сброс произошел при момощи WDT, то выполняется основной цикл программы.
; В главном цикле программы производятся следующие действия:
; Сбрасывается сторожевой таймер
; Вызывается функция Timer (устанавливает признак OneSecondGone - прошел интервал 1с)
; Функция Timer выставляет OneSecondGone в 1, когда истек интервал 1 с
; GP0 - Сигнал с фотоприемника (1)
; GP1 - Выдача сигнала "Пожар" (1)
; GP2 - Включение ИК-светодиода (1)
; GP3 - Сброс (0)
;Константа, определяющая задержку 50 мкс
#define MKS_50_TIMER 10
;Константа, определяющая отсчет временного интервала таймером 0
#define TIMER_0_COUNT 40
;Константа, определяющая режим работы компаратора:
#define COMP_MODE 0xFB
;Частота опроса оптопары. 100 соответствует 1с
#define TIMER_1S_COUNT 100
;Бит признака сброса таймером WDT
#define WATCHDOG_RESET STATUS,4
;Значение, загружаемое в OPTION при начальных установках
#define OPTION_VALUE 0xfE
;Значение, загружаемое в TRIS при начальных установках
#define TRIS_VALUE 0x01
;Значение, загружаемое в OPTION при переходе в SLEEP
#define OPTION_SLEEP 0xFe
;Значение, загружаемое в TRIS при переходе в SLEEP
#define TRIS_SLEEP 0xFF
;Значение, загружаемое в COMCON при переходе в SLEEP
#define COMP_SLEEP 0xF7
list p=10f204 ; list directive to define processor
include "p10F204.inc" ; processor specific variable definitions
__CONFIG _MCLRE_OFF & _CP_OFF & _WDT_ON
udata
; data bank
DeviceState res 1 ;Слово состояния датчика
Delay50Count res 1 ;Счетчик задержки 50 мкс
Timer0Count res 1 ;Счетчик таймера 0 для отсчета 102.4 мс
#define OneSecondGone DeviceState,1
code 0
ResetEntry
BTFSC WATCHDOG_RESET
GOTO NormalReset
;Произошел сброс при помощи WDT - выполняем основной цикл программы
;Для начала восстанавливаем OPTION
; BSF OneSecondGone
GOTO MainLoop
NormalReset
;Сброс по питанию (или любой другой, кроме WDT)
CALL Setup ;Выполняем начальные установки переменных
; BSF OneSecondGone
MainLoop ;Главный цикл программы
CALL HardwareSetup ;Производим инициализацию выводов и регистра OPTION
CLRWDT ;Сбросили WDT
CALL PrepareToSleep
SLEEP
GOTO ResetEntry
HardwareSetup
movlw OPTION_VALUE
option
movlw TRIS_VALUE ;GP0 вход, остальное - выходы
tris GPIO
;Установки аппаратной части контроллера
movlw COMP_MODE ; Настройка работы компаратора
movwf CMCON0
clrf GPIO ;Обнуляем все выходы
RETLW 0
PrepareToSleep ;Подготовка к переходу в SLEEP
movlw OPTION_SLEEP ;_1
option
movlw TRIS_SLEEP ;_3
tris GPIO
movlw COMP_SLEEP ;_2
movwf CMCON0
RETLW 0
Setup
;Установки программной части контроллера
;Обнуляем все переменные
CLRF DeviceState
CLRF Delay50Count
MOVLW TIMER_1S_COUNT ;Загрузка начального значения таймера 1с
MOVWF Timer0Count
CLRF TMR0 ;запуск таймера 1с
retlw 0
; Функция Timer работает с таймером и выставляет OneSecondGone в 1
; когда истек интервал 1 с
Timer
MOVLW TIMER_0_COUNT
SUBWF TMR0,0 ;W=TMR0-TIMER_0_COUNT
BTFSS STATUS,0
RETLW 0 ;Интервал времени 102.4 мс не вышел, выходим
Tmr_102ms
CLRF TMR0
DECFSZ Timer0Count,1
RETLW 0 ;Интервал времени 1024 мс не вышел, выходим
;мы здесь каждые 1024мс
MOVLW TIMER_1S_COUNT ;Начать счет заново
MOVWF Timer0Count
CLRF TMR0 ;Перезапустив таймер
BSF OneSecondGone ;Установили признак, что одна секунда прошла
RETLW 0
end