Помогите новичку с внешними прирываниями ATMEGA48

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

Собственно сталкнулся с такой проблеммой как внешние прирывания в MEGA48.
Вот простая программа которая нехочет работать в PROTEUS:
При нажатия кнопки ,увеличивается TEMP,и выводится на выход PORTC
а также поясните для чего pcicr , pcmsk0, pcifr -а даташите нечего непонял(
И еще хотел спросить INTO и PCINT0 отдельно?
тоесть для PCINTO ненадо заполнять eicra EIMSK EIfr
тоесть для INTO ненадо заполнять pcicr pcmsk0 pcifr
Файлы прикрепленны


;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list

;
.def temp =r16;

.org 0x000
rjmp unit;
.org 0x0001
rjmp EXT_INT0;настраиваем прерывание into
.org 0x0003
rjmp PCINT0; настраиваем прерывание PCINTo

unit :
clr temp;
out DDRB,temp;
clr temp;
out DDRD,temp;
ser temp;
out DDRc,temp;

ldi r16,high(RAMEND) ; устанавливаем область стека
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;

clr temp;

ldi temp,0b00000010 ;INT0 ISC11=1,SC10=0
sts eicra,temp ;по спадающему фронту

ldi temp,0b00000001 ;разрешаем прерывание INT0
sts EIMSK,temp;

ldi temp,0b00000000 ;по низкому уровню ставим 0
sts EIfr,temp;

ldi temp,0b00000001 ;устанавливаем контроль
sts pcicr,temp; ; прирывания на PCINT0-7


ldi temp,0b00000001
sts pcmsk0,temp;

ldi temp,0b00000000 ; Флаг устанавливается автоматически
sts pcifr,temp; ; при возникновения событии на PCINT0
; сбрасывается в 0 при прирывании
; после снова устанавливается в 1

;разрешаем прерывание
sei

start:
out portc,temp;
rjmp start;


;прерывание
!!!!! PCINTo: !!!!!!!!!!!!!! - в АВР выдает ошибку
EXT_INT0:
inc temp;
reti
Вложения
perivanie.rar
(7.11 КБ) 224 скачивания
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение ChipKiller »

сталкнулся с такой проблеммой как внешние прирывания в MEGA48
- проблема в том, что плохо читал datasheet.
В PROTEUS не работаю, так что пардон....

1 INT0 и PCINT0 различные прерывания.
2 Много лишних(бесполезных) команд и директив ассемблера
3 Если пишешь 3 JMPa на обработку прерывания, то и обработчиков должно быть столько-же.
4 Если работаешь с кнопками неплохо-бы обрабатывать и "дребезг контактов" ...

советую почитать книжку Евстифеева про Мегу, там все доходчиво описано. Успехов...
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

Пожалуйста, поподробнее: какую именно ошибку выдаёт?
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

здравствуйте и снова я)на счет ошибки ладно разобрался - просто я думал что надо писать именно PCINTo: - а оказывается это обычный безусловный переход.
Спасибо за книжку!!!! - много узнал) - относительно)

даже почти получилось настроить PCINT - проблемма:
при подачи sin сигнал на ножку(PROTEUS!!!!!) он как и должен прерывается по изменению сигнала, а вот при подключение через кнопку, она срабатывает 1 раз,и все стоит на месте(- это очень надо)

и неполучается настроить int0 - вроде просто но неполучается - несрабатывает,код программы:


.org 0x000
rjmp unit;
.org 0x0001
rjmp sydi;настраиваем прерывание into

unit :
clr temp;
out DDRB,temp;
out DDRD,temp;
ser temp;
out DDRc,temp;

ldi r16,high(RAMEND) ; устанавливаем область стека
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;

ldi temp,0b00000010 ;INT0 ISC11=1,SC10=0
sts eicra,temp ;по спадающему фронту

ldi temp,0b00000001 ;разрешаем прерывание INT0
sts EIMSK,temp;

ldi temp,0b00000001 ;
sts EIfr,temp;


sei

start:

out portc,temp;
rjmp start;


;прерывание
sydi:

inc temp;

reti
Вложения
22.rar
это по INT0
(56.43 КБ) 198 скачиваний
1.rar
это по PCINT0
(112.2 КБ) 187 скачиваний
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

Во-первых, надо в начале своей программы подключать заголовочный файл
с адресами регистров и прочими объявлениями для конкретного камня -
в данном случае это m48def.inc
Во-вторых, у вас ошибка в коде, при записи в регистр EIMSK.
Вложения
int0.zip
(87.27 КБ) 196 скачиваний
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

simpleX писал(а):Во-первых, надо в начале своей программы подключать заголовочный файл
с адресами регистров и прочими объявлениями для конкретного камня -
в данном случае это m48def.inc
Во-вторых, у вас ошибка в коде, при записи в регистр EIMSK.


simpleX большое спасибо.Ошибка была всего лишь вместо sts надо было написать out для EMISK(это написанно в даташите?). У меня есть вопросы возможно глупые но тем неменее должен задать):- зачем сопротивление?,что там за стрелка(около сопротивления)? И ГЛАВНЫЙ вопрос: кнопки присоединяются между земля-ножка,или можно питание-ножка?
поидее мы изменяем напряжение(уровень) на ножке - питанием?
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

спящий писал(а):Ошибка была всего лишь вместо sts надо было написать out для EMISK(это написанно в даташите?). У меня есть вопросы возможно глупые но тем неменее должен задать):- зачем сопротивление?,что там за стрелка(около сопротивления)? И ГЛАВНЫЙ вопрос: кнопки присоединяются между земля-ножка,или можно питание-ножка?
поидее мы изменяем напряжение(уровень) на ножке - питанием?


Написано, но не так прямо, как вы только что вывели =)
Даташит, пункт 5 "About code examples", второй абзац.

Резистор подтягивает ногу МК к питанию, устанавливает высокий уровень на выводе МК. Стрелка - ето символ для обозначения + питания.

Можно питание-ножка, главное надо так исхитриться в схеме, чтобы при нажатии кнопки КЗ не было и уровень на выводе МК поменялся. Поетому я нарисовал самый простой (на мой взгляд) вариант.
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

и снова здравствуйте. Совсем запутался с настройками watchdog - вроде и просто - но неполучаестья. . . Программа простая, специально сократил,урбал из нее ненужное)

Суть программы : прерывание по "Собаке" ,увеличиваем содержимое в регистре и на "выход"(порт)

Чуть незабыл вопрос:
Зачем сбрасывать WDT

sbr temp,(1<<wdce) + (1<<wde); сбрасываем таймер
sts wdtcsr,temp;
cbr temp,(1<<wde);
sts wdtcsr,temp;

если можно
WDR????



Программа:


;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list



;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;
.def delay2 =r19;
.def delay3=r20;
RJMP RESERT;
.org 0x006
rjmp WDT; прерывание по собаке


RESERT :
ser temp;
out DDRB,temp;
out DDRD,temp;

ldi temp,low(ramend);
out spl,temp;
ldi temp,high(ramend);
out sph,temp;


ldi temp,0b11000001;
;1- wdif флаг прерывания
;0- wdie разрешаем прерывание
;1-wde,0- wdce включаем тайм-аут(короче не сброс ,а прерывание)

sts wdtcsr,temp;
sei;
wdr;


start:
out portB,r17;
out portd,r18;
rjmp start;


WDT:
inc r17;
dec r18;

sbr temp,(1<<wdce) + (1<<wde); сбрасываем таймер
sts wdtcsr,temp;
cbr temp,(1<<wde);
sts wdtcsr,temp;
reti






выдает ошибку: watchdog setup sequence is timed out. Do nothing
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

Сбрасывать WDT нужно для того, чтобы (если вы уж решили использовать WDT) МК работал непрерывно. В этом и суть WDT: не сбросите в своей программе таймер, сбросится МК.

Похоже, вы совсем не читали даташит...

ldi temp,0b11000001;

Не нужно здесь устанавливать флаг WDIF. Он сам установится, когда произойдёт прерывание.

sbr temp,(1<<wdce) + (1<<wde); сбрасываем таймер

Таймер сбрасывается специальной инструкцией WDR и не в прерывании, когда переполнение таймера УЖЕ произошло, а заранее! Это у вас режим interrupt, а если бы был interrupt+reset, то ето был бы первое и последнее прерывание от WDT...

; Включение WDT в режиме interrupt

ldi temp,0x58
sts wdtcsr,temp
ldi temp, 0x41
sts wdtcsr,temp
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

несовсем понял -а точнее совсем непонял) Я пытаюсь настраивать по книжки Евстифеева MEGA
Там написано (страница 393):
если WDE установлен в 1 - включен стороживой таймер,в 0- выключен выключен стороживой таймер

тут же снизу таблица:
wde - 0,wdie - 1 режим работы по прерыванию,


Думаю вы иммели ввиду так?

ldi temp,0b01011001;насройка перевода в interrupt
sts wdtcsr,temp;
ldi temp,0b01000001; перевод в interrupt
sts wdtcsr,temp;
sei;

start:
out portB,r17;
out portd,r18;
rjmp start;

WDT:
inc r17;
subi r18,10;
reti



программа делает 1 прерывание и все (
может думаю WDT надо сбросить или он автоматически сбрасывается?
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

и еще раз здравствуйте, коряво - очень ,но вроде получилось :shock: :


ldi temp,0b01011000;насройка перевода в interrupt
sts wdtcsr,temp;

ldi temp,0b01100111; перевод в interrupt
sts wdtcsr,temp;
sei;


start:

out portd,r17;
out portb,r18;
rjmp start;

WDT:
inc r17;
subi r18,10;
wdr; может какнибудь подругому его сбросить?
reti

В цикле(основной программе) сбрасывать нельзя! -он у меня колеблица от 0.02с до 3с - неровно получится.
едиственное непонял: по даташиту прерывания должны быть через 8 сек, у меня 256033 циклов,это 2 сек,если частота 125кГЦ?
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

может проще его совсем не использовать? %)
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

С удовольствием бы неиспользовал - но незнаю альтернативу,если бы я сделал прерывание из цикла rcall то будет вилять по времени сильно(
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

А вообще для чего вы хотите использовать WDT?
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

для дипломного проекта: Регулирование скорость двигателя частотным преобразованием от регулятора 10 -0 В,программа примерно выглядит так:


старт:
таблица синусов ; тут изменяется время -процесс непрерывный и время меняется от 0.02 до 1 с
rjmp старт

WDT: -прерывание собаки ,равномерно независящее от время...
изменяем время в зависимости от входа с регулятора
reti

чтото типо этого,перед входом в AVR будет стоять деоитель напряжения до 5 В. А нельза сделать прерывание от счетчмка T0? - хотя неполучиться, при T1(16 разрядный) будет спрашивать при частоте кварца 10Мг будет опрашивать каждые 0.0065с - тоесть почти все время( - а там и шумы и все прочее...
Последний раз редактировалось спящий Вс янв 30, 2011 15:14:25, всего редактировалось 1 раз.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение ibiza11 »

ник у вас говорящий)))) почему вы выбрали именно собаку для отсчета временных интервалов? полно других счетчиков с возможностью вызова прерываний.
Ставим плюсы: )
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

сильно часто прерывания будут или нет? T1 - 16 разрядный 2*16 =65536 при частоте 10МГц будет прерывания каждые 0.006 сек,так же ведь?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение ibiza11 »

у каждого таймера есть предделитель - это раз, т.е. входную частоту можете получить практически много меньше чем тактовая контроллера.
во вторых вам никто не запрещает в хоть 16битный счетчик при первом пуске (и при каждом прерывании) записать 65530 - тогда прерывания будут вызываться каждые 6 тактов таймера при достижении значения 65536 (ноль по-другому :) )
Ставим плюсы: )
спящий
Потрогал лапой паяльник
Сообщения: 303
Зарегистрирован: Сб янв 08, 2011 13:48:41

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение спящий »

Спасибо.что-то я про преддилитель совсем забыл(
сделал тоже самое по T0,вроде просто, вообще неработает :cry:



;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.list
.nolist
.list
;
.def temp =r16;
.def delay =r17;
.def delay1 =r18;
.def delay2 =r19;
.def delay3=r20;
RJMP RESERT;
.org 0x010
rjmp TIMO_OFF; прерывание по переполнению TCN T0


RESERT :

ser temp;
out DDRB,temp;
out DDRD,temp;

ldi temp,low(ramend);
out spl,temp;
ldi temp,high(ramend);
out sph,temp;



ldi temp,0b00000001; настройка прерывание по переполнению T0
sts timsk0,temp;

ldi temp,0b00000000; настраиваем WGM0-2 по 0 - режим NORMAL
sts tccr0a,temp;
ldi temp,0b00000101; частота/1024
sts tccr0b,temp;

sei;

start:
out portd,r17;
out portb,r18;
rjmp start;

TIMO_OFF:
inc r17;
subi r18,10;
reti
Аватара пользователя
simpleX
Первый раз сказал Мяу!
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск
Контактная информация:

Re: Помогите новичку с внешними прирываниями ATMEGA48

Сообщение simpleX »

И опять неправильно используете инструкцию sts...
sts tccr0b,temp;

Неужели так трудно проверить код самому?
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
Закрыто

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