Форум РадиоКот https://radiokot.ru/forum/ |
|
Помогите новичку с внешними прирываниями ATMEGA48 https://radiokot.ru/forum/viewtopic.php?f=20&t=40529 |
Страница 1 из 2 |
Автор: | спящий [ Сб янв 08, 2011 14:17:05 ] | ||
Заголовок сообщения: | Помогите новичку с внешними прирываниями 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
|
Автор: | ChipKiller [ Сб янв 08, 2011 16:03:23 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
Цитата: сталкнулся с такой проблеммой как внешние прирывания в MEGA48 - проблема в том, что плохо читал datasheet.В PROTEUS не работаю, так что пардон.... 1 INT0 и PCINT0 различные прерывания. 2 Много лишних(бесполезных) команд и директив ассемблера 3 Если пишешь 3 JMPa на обработку прерывания, то и обработчиков должно быть столько-же. 4 Если работаешь с кнопками неплохо-бы обрабатывать и "дребезг контактов" ... советую почитать книжку Евстифеева про Мегу, там все доходчиво описано. Успехов... |
Автор: | simpleX [ Пн янв 10, 2011 01:39:51 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
Пожалуйста, поподробнее: какую именно ошибку выдаёт? |
Автор: | спящий [ Пн янв 10, 2011 17:08:44 ] | |||
Заголовок сообщения: | 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
|
Автор: | simpleX [ Ср янв 12, 2011 21:47:59 ] | ||
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 | ||
Во-первых, надо в начале своей программы подключать заголовочный файл с адресами регистров и прочими объявлениями для конкретного камня - в данном случае это m48def.inc Во-вторых, у вас ошибка в коде, при записи в регистр EIMSK.
|
Автор: | спящий [ Чт янв 13, 2011 17:44:58 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
simpleX писал(а): Во-первых, надо в начале своей программы подключать заголовочный файл с адресами регистров и прочими объявлениями для конкретного камня - в данном случае это m48def.inc Во-вторых, у вас ошибка в коде, при записи в регистр EIMSK. simpleX большое спасибо.Ошибка была всего лишь вместо sts надо было написать out для EMISK(это написанно в даташите?). У меня есть вопросы возможно глупые но тем неменее должен задать):- зачем сопротивление?,что там за стрелка(около сопротивления)? И ГЛАВНЫЙ вопрос: кнопки присоединяются между земля-ножка,или можно питание-ножка? поидее мы изменяем напряжение(уровень) на ножке - питанием? |
Автор: | simpleX [ Чт янв 13, 2011 18:50:47 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
спящий писал(а): Ошибка была всего лишь вместо sts надо было написать out для EMISK(это написанно в даташите?). У меня есть вопросы возможно глупые но тем неменее должен задать):- зачем сопротивление?,что там за стрелка(около сопротивления)? И ГЛАВНЫЙ вопрос: кнопки присоединяются между земля-ножка,или можно питание-ножка? поидее мы изменяем напряжение(уровень) на ножке - питанием? Написано, но не так прямо, как вы только что вывели =) Даташит, пункт 5 "About code examples", второй абзац. Резистор подтягивает ногу МК к питанию, устанавливает высокий уровень на выводе МК. Стрелка - ето символ для обозначения + питания. Можно питание-ножка, главное надо так исхитриться в схеме, чтобы при нажатии кнопки КЗ не было и уровень на выводе МК поменялся. Поетому я нарисовал самый простой (на мой взгляд) вариант. |
Автор: | спящий [ Сб янв 29, 2011 18:51:32 ] |
Заголовок сообщения: | 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 [ Сб янв 29, 2011 20:44:56 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
Сбрасывать 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 |
Автор: | спящий [ Вс янв 30, 2011 05:31:13 ] |
Заголовок сообщения: | 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 надо сбросить или он автоматически сбрасывается? |
Автор: | спящий [ Вс янв 30, 2011 12:01:09 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
и еще раз здравствуйте, коряво - очень ,но вроде получилось ![]() 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 [ Вс янв 30, 2011 12:16:22 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
может проще его совсем не использовать? %) |
Автор: | спящий [ Вс янв 30, 2011 13:39:59 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
С удовольствием бы неиспользовал - но незнаю альтернативу,если бы я сделал прерывание из цикла rcall то будет вилять по времени сильно( |
Автор: | simpleX [ Вс янв 30, 2011 14:03:07 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
А вообще для чего вы хотите использовать WDT? |
Автор: | спящий [ Вс янв 30, 2011 15:07:40 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
для дипломного проекта: Регулирование скорость двигателя частотным преобразованием от регулятора 10 -0 В,программа примерно выглядит так: старт: таблица синусов ; тут изменяется время -процесс непрерывный и время меняется от 0.02 до 1 с rjmp старт WDT: -прерывание собаки ,равномерно независящее от время... изменяем время в зависимости от входа с регулятора reti чтото типо этого,перед входом в AVR будет стоять деоитель напряжения до 5 В. А нельза сделать прерывание от счетчмка T0? - хотя неполучиться, при T1(16 разрядный) будет спрашивать при частоте кварца 10Мг будет опрашивать каждые 0.0065с - тоесть почти все время( - а там и шумы и все прочее... |
Автор: | ibiza11 [ Вс янв 30, 2011 15:13:22 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
ник у вас говорящий)))) почему вы выбрали именно собаку для отсчета временных интервалов? полно других счетчиков с возможностью вызова прерываний. |
Автор: | спящий [ Вс янв 30, 2011 15:17:21 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
сильно часто прерывания будут или нет? T1 - 16 разрядный 2*16 =65536 при частоте 10МГц будет прерывания каждые 0.006 сек,так же ведь? |
Автор: | ibiza11 [ Вс янв 30, 2011 15:26:13 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
у каждого таймера есть предделитель - это раз, т.е. входную частоту можете получить практически много меньше чем тактовая контроллера. во вторых вам никто не запрещает в хоть 16битный счетчик при первом пуске (и при каждом прерывании) записать 65530 - тогда прерывания будут вызываться каждые 6 тактов таймера при достижении значения 65536 (ноль по-другому ![]() |
Автор: | спящий [ Вс янв 30, 2011 17:13:08 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
Спасибо.что-то я про преддилитель совсем забыл( сделал тоже самое по T0,вроде просто, вообще неработает ![]() ; .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 [ Вс янв 30, 2011 18:38:43 ] |
Заголовок сообщения: | Re: Помогите новичку с внешними прирываниями ATMEGA48 |
И опять неправильно используете инструкцию sts... Цитата: sts tccr0b,temp; Неужели так трудно проверить код самому? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |