как прерывание повесить на PINA на 0b00000100 (порт)

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)

Сообщение CyberMerlin »

не могу разобраться с прерываниями на порта
Евстифеев "Микроконтроллеры AVR..." - описано конфигурирование GICR всякие int и иже с ним...
как сие применимо к моему случаю? не укладывается в голове
(ATMega 162)
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Пн дек 25, 2006 02:29:15
Откуда: г.Винница Украина

Сообщение factorial »

Вообщем говоря, у меня тоже есть атмега 162, это мой первый контроллер. Так вот, помимо всякой руской литературы на другие контроллеры, у меня есть даташит на Атмегу 162, там и смотри..., А организацию прерываний я начинаю з CodeWizard в CodeVision, он и мне автоматом выставляет куда кокой бит записать. А потом смотрю, что он куда поставил, если подробней, то ищу описание тех регистров в даташите. Одним словом, замути это в CodeWizard автоматически.
Контактная информация:
Реклама
Вечно гонимый
Аватара пользователя
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

factorial писал(а):организацию прерываний я начинаю в CodeWizard в CodeVisionAVR, он и мне автоматом выставляет куда кокой бит записать. А потом смотрю, что он куда поставил, если подробней, то ищу описание тех регистров в даташите.
Абсолютно верно - мастер начального кода в CVAVR позволят быстро и главное ПРАВИЛЬНО сконфигурировать МК. И не только в начале написания программы но и по ходу работы.

Я советую использовать в дополнение мастер компилятора ICC - imagecraft.com - в нем по-моему более наглядно сделана настройка таймеров.
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)

Сообщение CyberMerlin »

я конечно понимаю желание каждого посадить меня на использование программы которая будет думать за меня, НО все таки хотелось бы разобраться с этим, потому как я tavrasm использую и БЛОКНОТ
и дело здесь более принципальное чем скоростное

ХОЧУ разобраться в этом раз и навсегда (это как езда на велосипеде)
ПОМОГИТЕ пожалуйста как все таки конфигурить прерывание на желаемую ногу любого порта. Ибо в действительности там расписано кажется не нарусском языке. А ваши программы разъяснений никаких не дают (говорить они что ли не умеют :) )

(второй вопрос будет по SLEEP для PIC, он как-то не работает при отключении всего)
ab imo pectore
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
SfS
Друг Кота
Сообщения: 19705
Зарегистрирован: Пт янв 12, 2007 11:21:39
Откуда: Томск

Сообщение SfS »

То есть тебе вообще описать как конфигурить прерывания на AVR ?

Попробую.

Чтобы верно обрабатывать прерывания нужно:

1. Выставить вектор прерывания (таблица векторов приведена в описании на конкретный контроллер, у всех AVRок вектора прерываний расположены с адреса 0 памяти программ). Вектор - это команда перехода на обработчик прерывания. Для каждого прерывания команда должна лежать по строго определенному адресу, эти адреса и указаны в описании контроллера.

2. Выставить биты ISCx0 и OSCx1 регистра MCUCR в соответствии с нужным режимом прерывания (по низкому уровню, по изменению уровня, по перепаду с 1 в 0 или по перепаду с 0 в 1) - табличка в описании контроллера есть.

3. Выставить биты в регистре GIMSK (int0, int1 - в зависимости от номера нужного прерывания).

4. Разрешить прерывания командой SEI. Эту команду дают обычно после конфигурации всех прерываний. До этой команды все прерывания запрещены.

Ну и собственно выход из обработчика прерывания - командой RETI (а не RET !).

Вроде так. Уточни, что неясно.
Реклама
Вечно гонимый
Аватара пользователя
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

CyberMerlin писал(а):я конечно понимаю желание каждого посадить меня на использование программы которая будет думать за меня, НО все таки хотелось бы разобраться с этим
После того как мастер создаст код посмотрите комментарии в нем - какие строки конфигурируют прервания (либо то что вам нужно) - там вы увидите что в какие то регистры что-то записывается.

теперь в конце ДШ найдите эти регистры в таблице, справа будуд номера страниц ДШ где эти регистры описаны. прочитайте что означабт биты этих регистров и что записал туда мастер.

Теперь у вас будет полное понимание что куда и зачем.
Реклама
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)

Сообщение CyberMerlin »

2 SfS
1- ок
2- MCUCR не для 162 как я понял, т.е. в данном случае получается юзается GICR
по низкому уровню, по изменению уровня
это немножко не понятно, полагаю там можно использовать не только есть/нет сигнала, но и по напряжению подаваемому на ногу??
но как тогда это реализовать и какой шаг напряжения (в даташите (поскольку он ангельский) не смог осилить) :roll:
ab imo pectore
Контактная информация:
Вечно гонимый
Аватара пользователя
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

CyberMerlin писал(а): 2- MCUCR не для 162 как я понял, т.е. в данном случае получается юзается GICR
как я понял из страниxrb о прерываниях в AVR - pid.by.ru/03.htm
в прерываниях используют и то и другое.
CyberMerlin писал(а): полагаю там можно использовать не только есть/нет сигнала, но и по напряжению подаваемому на ногу??
но как тогда это реализовать и какой шаг напряжения

(в даташите (поскольку он ангельский) не смог осилить) :roll:
Поэтому очень рекомендую прочитать о прерваниях по русски и с рабочими примерами - исходник и симуляция с кнопками.

прерывания от фронта, от спада и от низкого уровня - т.е. лог "0" на ноге INTx

я пока только учусь и возможно ошибаюсь - но я понял так. если нет то поправьте.

Кстати в мастере CVAVR все варианты можно выбрать мышкой.

А даташит на мегу по-русски есть по ссылке выше.
Вечно гонимый
Аватара пользователя
Сообщения: 568
Зарегистрирован: Ср янв 10, 2007 19:15:51

Сообщение Abakt »

SfS писал(а):Вектор - это команда перехода на обработчик прерывания.
как я понял из курса, вектор это не команда а адрес куда переходит прога при возникновении прерывания.
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн сен 18, 2006 13:39:03
Откуда: Попуа Новой Гвинеи (Зимбабва)

Сообщение 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

ab imo pectore
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»