Страница 1 из 1
как прерывание повесить на PINA на 0b00000100 (порт)
Добавлено: Чт дек 28, 2006 11:47:09
CyberMerlin
не могу разобраться с прерываниями на порта
Евстифеев "Микроконтроллеры AVR..." - описано конфигурирование GICR всякие int и иже с ним...
как сие применимо к моему случаю? не укладывается в голове
(ATMega 162)
Хм
Добавлено: Пн янв 22, 2007 02:31:25
factorial
Вообщем говоря, у меня тоже есть атмега 162, это мой первый контроллер. Так вот, помимо всякой руской литературы на другие контроллеры, у меня есть даташит на Атмегу 162, там и смотри..., А организацию прерываний я начинаю з CodeWizard в CodeVision, он и мне автоматом выставляет куда кокой бит записать. А потом смотрю, что он куда поставил, если подробней, то ищу описание тех регистров в даташите. Одним словом, замути это в CodeWizard автоматически.
Re: Хм
Добавлено: Пн янв 22, 2007 10:42:46
Abakt
factorial писал(а):организацию прерываний я начинаю в CodeWizard в CodeVisionAVR, он и мне автоматом выставляет куда кокой бит записать. А потом смотрю, что он куда поставил, если подробней, то ищу описание тех регистров в даташите.
Абсолютно верно - мастер начального кода в CVAVR позволят быстро и главное ПРАВИЛЬНО сконфигурировать МК. И не только в начале написания программы но и по ходу работы.
Я советую использовать в дополнение мастер компилятора ICC - imagecraft.com - в нем по-моему более наглядно сделана настройка таймеров.
Добавлено: Пн янв 22, 2007 11:03:59
CyberMerlin
я конечно понимаю желание каждого посадить меня на использование программы которая будет думать за меня, НО все таки хотелось бы разобраться с этим, потому как я tavrasm использую и БЛОКНОТ
и дело здесь более принципальное чем скоростное
ХОЧУ разобраться в этом раз и навсегда (это как езда на велосипеде)
ПОМОГИТЕ пожалуйста как все таки конфигурить прерывание на желаемую ногу любого порта. Ибо в действительности там расписано кажется не нарусском языке. А ваши программы разъяснений никаких не дают (говорить они что ли не умеют :) )
(второй вопрос будет по SLEEP для PIC, он как-то не работает при отключении всего)
Добавлено: Пн янв 22, 2007 12:04:07
SfS
То есть тебе вообще описать как конфигурить прерывания на AVR ?
Попробую.
Чтобы верно обрабатывать прерывания нужно:
1. Выставить вектор прерывания (таблица векторов приведена в описании на конкретный контроллер, у всех AVRок вектора прерываний расположены с адреса 0 памяти программ). Вектор - это команда перехода на обработчик прерывания. Для каждого прерывания команда должна лежать по строго определенному адресу, эти адреса и указаны в описании контроллера.
2. Выставить биты ISCx0 и OSCx1 регистра MCUCR в соответствии с нужным режимом прерывания (по низкому уровню, по изменению уровня, по перепаду с 1 в 0 или по перепаду с 0 в 1) - табличка в описании контроллера есть.
3. Выставить биты в регистре GIMSK (int0, int1 - в зависимости от номера нужного прерывания).
4. Разрешить прерывания командой SEI. Эту команду дают обычно после конфигурации всех прерываний. До этой команды все прерывания запрещены.
Ну и собственно выход из обработчика прерывания - командой RETI (а не RET !).
Вроде так. Уточни, что неясно.
Добавлено: Пн янв 22, 2007 14:23:42
Abakt
CyberMerlin писал(а):я конечно понимаю желание каждого посадить меня на использование программы которая будет думать за меня, НО все таки хотелось бы разобраться с этим
После того как мастер создаст код посмотрите комментарии в нем - какие строки конфигурируют прервания (либо то что вам нужно) - там вы увидите что в какие то регистры что-то записывается.
теперь в конце ДШ найдите эти регистры в таблице, справа будуд номера страниц ДШ где эти регистры описаны. прочитайте что означабт биты этих регистров и что записал туда мастер.
Теперь у вас будет полное понимание что куда и зачем.
Добавлено: Вт янв 23, 2007 11:17:01
CyberMerlin
2 SfS
1- ок
2- MCUCR не для 162 как я понял, т.е. в данном случае получается юзается GICR
по низкому уровню, по изменению уровня
это немножко не понятно, полагаю там можно использовать не только есть/нет сигнала, но и по напряжению подаваемому на ногу??
но как тогда это реализовать и какой шаг напряжения (в даташите (поскольку он ангельский) не смог осилить) :roll:
Добавлено: Вт янв 23, 2007 14:38:53
Abakt
CyberMerlin писал(а):
2- MCUCR не для 162 как я понял, т.е. в данном случае получается юзается GICR
как я понял из страниxrb о прерываниях в AVR - pid.by.ru/03.htm
в прерываниях используют и то и другое.
CyberMerlin писал(а): полагаю там можно использовать не только есть/нет сигнала, но и по напряжению подаваемому на ногу??
но как тогда это реализовать и какой шаг напряжения
(в даташите (поскольку он ангельский) не смог осилить)

Поэтому очень рекомендую прочитать о прерваниях по русски и с рабочими примерами - исходник и симуляция с кнопками.
прерывания от фронта, от спада и от низкого уровня - т.е. лог "0" на ноге INTx
я пока только учусь и возможно ошибаюсь - но я понял так. если нет то поправьте.
Кстати в мастере CVAVR все варианты можно выбрать мышкой.
А даташит на мегу по-русски есть по ссылке выше.
Добавлено: Вт янв 23, 2007 14:41:14
Abakt
SfS писал(а):Вектор - это команда перехода на обработчик прерывания.
как я понял из курса, вектор это не команда а адрес куда переходит прога при возникновении прерывания.
Добавлено: Ср янв 24, 2007 14:47:06
CyberMerlin
на который и ставится команда перехода jmp/rjmp
касаемо остального шеф сказал покамест запустить системку использующую sleep
теперь вопрос по sleep (чтоб далеко не уходить и параллельно обсуждать две темы)
вот кодик мой
он работает только в эмуле
на чипе (внутрисхемником) - не работает
речь идет о PIC 10f204
Код: Выделить всё
; ПРОГРАММА ДЛЯ ИЗВЕЩАТЕЛЯ ПОЖАРНОГО ДЫМОВОГО ИП 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