0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
||||||
1 | ||||||
Прерывание INT0 Atmega8813.09.2017, 23:31. Показов 4641. Ответов 45
Метки нет (Все метки)
Пытаюсь использовать прерывание INT0. В avr studio и протеусе все работает хорошо, но в железе получается, что прерывание срабатывает, только если метка прерывания располагается по адресу 0x20 во flash памяти. Если я перед меткой вставляю хоть одну строчку, то прерывание перестает срабатывать. Т.е. если я всю таблицу прерываний захочу включить, то у меня адрес метки обработки прерывания сдвинется и в итоге ничего не сработает. Помогите разобраться, что не так делаю?
прошу прощения sts EICRA, r16
0
|
13.09.2017, 23:31 | |
Ответы с готовыми решениями:
45
Прерывание INT0 Прерывание INT0 ATtiny84 и прерывание INT0 Внешнее прерывание INT0. ATmega8 внешнее прерывание INT0 ATtiny2313 |
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
||||||
14.09.2017, 08:33 [ТС] | 3 | |||||
в смысле
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
||||||
14.09.2017, 21:18 | 4 | |||||
ошибка здесь или в программе тоже?
вообще странная смесь французского с нижнегородским в смысле Асемблера и си ты уверен что данная строчка превратится в
0
|
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
|||||||||||
14.09.2017, 21:26 [ТС] | 5 | ||||||||||
в программе именно
вот кстати пример из даташита:
0
|
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
|
15.09.2017, 21:07 [ТС] | 7 |
ок, исправлюсь...
а по проблеме может кто чего сказать? какой день уже бьюсь...
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
15.09.2017, 21:37 | 8 |
пока не могу
давно не писал под атмегу, но насколько помню, там несколько жампов,короткие и длинные, может что и путаю может в этом проблема? Вот Voland_ подойдет и все решит Добавлено через 2 минуты попробуй поменять местами обработчик прерываний и reset, если дело в переходах то не будет срабатывать reset
0
|
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
|
15.09.2017, 21:42 [ТС] | 9 |
в 8 битных рджампы, короткие, по крайней мере в 88 так, джампов там нет.
это интересно, попробую....хотя в таком случае возникнет проблема, что я собираюсь писать большой код в прерывании, и на ресет по идее рджамп не допрыгнет.
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
15.09.2017, 21:58 | 10 |
может быть, может быть
у меня в башке крутятся ассемблеры для 8086, x51, AVR, ARM они хоть чем то похожие но абсолютно разные и без справочников так с ходу ответить не могу тем более что я давно сижу на Си Во первых это не решение проблемы, а её локализация во вторых код в прерывании должен быть как можно меньше выставил флаги и отвалил
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
15.09.2017, 22:22 | 11 |
Обычно векторы прерываний заполняются rjmp <hanlder>.
То есть в вашем случае надо что-то типа такого (стр.12, см. пример). Вы выставляете с помощью .org <N> нужный офсет (в данном случае, необходимое прерывание) и ставите туда команду rkmp <handler>. А дальше уже, после всего этого списка располагается код. PS: я просто поначалу думал, что ваша проблема совершенно в другом ).
0
|
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
|
15.09.2017, 22:35 [ТС] | 12 |
ну я вроде так и сделал в программе, у меня вектор reset имеет адрес 0000, вектор int0 - 0001, поэтому .org я не указывал, так как rjmp разместятся подряд.... там будут расположены прыжки на адрес в памяти. И ведь все работает в avr studio, отладка полностью проходит. Не получается в реальном мк, если сместить расположение в памяти(не 0x20 адрес) метки прерывания.
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
15.09.2017, 23:43 | 13 |
А чип у вас точно mega88? не 168? не 328? не mega8? Они же отличаются... По виду не должно быть проблем. Код верный, если вы исправили "<<", о которых вам сказал ValeryS.
Еще подправьте таки "nul" на что-нибудь другое . Потому что эта метка как-то звучит близко к сишныму "nul". Насчет "сдвинуть" - то ничего тут страшного нет. Даже если не двигается обработчик int0 (чего быть не может), то вся таблица прерываний меньше 0x20. Вам просто надо reset: перенести тогда за этот обработчик. Даже если rjmp не "достает" до обработчика, можно использова "veener"'ы. Это jmp'ы по-ближе, чтобы через них можно было бы уже прыгать куда вам надо. PS: следите тоже за регистрами в прерывании - те, что вы используете, надо ж сохранять и восстанавливать на стеке. По виду у вас и сохранять-то не за чем... но мало ли..
0
|
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
|
16.09.2017, 00:58 [ТС] | 14 |
чип точно 88. Код исправленный, это здесь я уже писал по памяти и сделал ошибки. Компилятор avr studio его прошел.
но мне не понятно, как такое может быть, что если сдвинуть в памяти метку прерывания, то она перестает работать.... я всегда думал, что я волен писать программу как угодно, на каком адресе окажется моя метка, туда и прыгнет (в пределах допуска rjmp). При чем это только на реальном мк. Может я какие настройки не учел?! уже не знаю, на что думать. прием такой знаю, но не хотелось бы усложнять программу...
0
|
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
|
|
16.09.2017, 16:08 | 15 |
Естественно. Так и есть. И мало того - если эта программа работает в Atmel Studio и в Протеусе - то вероятность того, что она правильная- это 99,9%. Тут стоит искать причину в бракованом чипе, каких-то частотных багах вашего чипа (соотношение питание-частота), и внешних воздействиях. Потому что сэмулировать их в протеусе будет сложно.
0
|
612 / 373 / 69
Регистрация: 21.09.2008
Сообщений: 1,277
|
|
30.09.2017, 16:29 | 16 |
ElDave, могу настоятельно порекомендовать книгу "Практическое программирование микроконтроллеров Atmel AVR языке ассемблера", автор Ревич Юрий Всеволодович, выпущенную в 2014 году издательством "БХВ-Петербург". Скан этой книги в Сети есть. Если не сможете её найти, напишите в приват - вышлю по e-mail, размер порядка 12 Мб. Для Вас будет интересна и полезна глава 5 "Общие принципы программирования МК семейства AVR", подглава "Обработка прерываний", начиная со страницы 93.
0
|
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
|
|
03.10.2017, 22:32 [ТС] | 17 |
sharpey, у меня есть эта книга и я ее читаю. Посмотрел еще раз со страницы 93, и не нашел каких либо программных косяков у себя.
Поменял контроллер на atmega88pa, вопрос остался. Значит возможно дело в настройке МК, я использую работу от кварца 18МГц. Фьюзы прошил : RSTDISBL(unprogrammed), DWEN (unprogrammed), SPIEN(2) (programmed), WDTON (unprogrammed), EESAVE (unprogrammed), BODLEVEL(unprogrammed), BODLEVEL1 (unprogrammed), BODLEVEL0 (unprogrammed). CKDIV8(unprogrammed), CKOUT (unprogrammed), SUT1 (unprogrammed), SUT0 (programmed), CKSEL3 (programmed), CKSEL2 (unprogrammed), CKSEL1 (unprogrammed), CKSEL0 (unprogrammed).
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
04.10.2017, 04:32 | 18 |
настрой фьюзы для работы от внутреннего генератора
пропадет проблема или нет? Добавлено через 11 минут прочитал на одном форуме http://www.engbedded.com/fusecalc SUT оба должны быть выключены
0
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||||||
04.10.2017, 16:14 | 19 | |||||
ElDave, а у где у вас собственно разметка карты прерываний директивами org?
Вот по вашей логике, произошло прерывание, на какую инструкцию МК прыгнуть должен? Добавлено через 2 минуты Вот что-то подобное где у вас?
0
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,514
|
|
04.10.2017, 20:04 | 20 |
0
|
04.10.2017, 20:04 | |
04.10.2017, 20:04 | |
Помогаю со студенческими работами здесь
20
Прерывание по изменению уровня на INT0 в ATmega16 Не работает прерывание INT0. ATmega88 Си, INT0 ATMega88 - 10 PWM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |