Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
1

Прерывание INT0 Atmega88

13.09.2017, 23:31. Просмотров 1306. Ответов 45
Метки нет (Все метки)

Пытаюсь использовать прерывание INT0. В avr studio и протеусе все работает хорошо, но в железе получается, что прерывание срабатывает, только если метка прерывания располагается по адресу 0x20 во flash памяти. Если я перед меткой вставляю хоть одну строчку, то прерывание перестает срабатывать. Т.е. если я всю таблицу прерываний захочу включить, то у меня адрес метки обработки прерывания сдвинется и в итоге ничего не сработает. Помогите разобраться, что не так делаю?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.include "m88def.inc"
 
.dseg
mass:  .byte 9
 
.cseg 0
rjmp reset
rjmp ext_int0
 
reset:
ldi r16, high(ramend)
out SPH,r16
ldi r16, low(ramend)
out SPL,r16
 
ldi r16, (1<PC0)|(1<PC1)|(1<PC2)|(1<PC3)|(1<PC4)|(1<PC5)
out DDRC, r16
out DDRB,r16
ldi r16, (0<PD0)|(0<PD1)|(0<PD2)|(1<PD3)|(1<PD4)|(1<PD5)|(1<PD6)|(1<PD7)
out DDRD,r16
ldi r16, (1<PD0)|(1<PD1)|(1<PD2)
out PORTD,r16
 
ldi XH, high(mass)
ldi XL, low(mass)
 
ldi r16, (1<ISC01)|(1<ISC00)
sts r16, EICRA 
sbi EIMSK, INT0
 
sei
proga:
cbi PORTC, 3
sbis PIND, 1
rjmp nul
rjmp proga
 
nul:
sbi PORTC, 3
sbis PIND, 0
rjmp proga
rjmp nul
 
m3:
clr r16
clr r17
clr r18
rjmp m3
 
ext_int0:            // адрес 0х20
in PIND, r16
out PORTC, r16
...........
reti
Добавлено через 6 минут
Цитата Сообщение от ElDave Посмотреть сообщение
sts r16, EICRA
прошу прощения sts EICRA, r16
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2017, 23:31
Ответы с готовыми решениями:

Прерывание INT0
Здравствуйте. Использую Attiny2313, на INT0 висит TSOP. В прерывании отправляются данные по USORT....

Прерывание INT0
Нарвался вот на неприятное дело :) Делаю (теперь уже сделал) системку управления ближним и дальним...

ATtiny84 и прерывание INT0
Здравствуйте! Прошу помощи в таком вопросе. В ATtiny84 задействовано прерывание INT0, регистрация...

внешнее прерывание INT0 ATtiny2313
Как изобразить прерывание в AtmelStdio7 ну хоть какое то хоть блин любое.... Сначала пробовал на...

Внешнее прерывание INT0. ATmega8
Я считаю что код правильный, но он не работает )))) Симуляция в Proteus показывает что прерывание...

45
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
14.09.2017, 05:46 2
Цитата Сообщение от ElDave Посмотреть сообщение
Assembler
1
ldi r16, (1<PC0)|(1<PC1)|(1<PC2)|(1<PC3)|(1<PC4)|(1<PC5)
что эта строчка означает?
0
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
14.09.2017, 08:33  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
что эта строчка означает?
в смысле
Assembler
1
 ldi r16, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)
и в остальных строчках тоже.
0
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
14.09.2017, 21:18 4
Цитата Сообщение от ElDave Посмотреть сообщение
в смысле
Assembler
1
ldi r16, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)
ошибка здесь или в программе тоже?
вообще странная смесь французского с нижнегородским в смысле Асемблера и си
ты уверен что данная строчка превратится в
Assembler
1
ldi r16,3Fh
я нет, поскольку с такой записью не сталкивался
0
14.09.2017, 21:18
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
14.09.2017, 21:26  [ТС] 5
в программе именно
Assembler
1
 ldi r16, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5),
Цитата Сообщение от ValeryS Посмотреть сообщение
ты уверен что данная строчка превратится в
уверен, проверено не однократно.

вот кстати пример из даташита:
Assembler
1
2
3
4
5
6
7
8
SPI_MasterInit:
; Set MOSI and SCK output, all others input
ldi r17,(1<<DD_MOSI)|(1<<DD_SCK)
out DDR_SPI,r17
; Enable SPI, Master, set clock rate fck/16
ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17
ret
честно говоря, я думал, что многие так пишут. Я сам недавно начал познавать avr и ассемблер.
0
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
14.09.2017, 22:16 6
ElDave, оформляйте код тэгами
написал код
выделил его и нажал кнопочку asm в шапке сообщения
0
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
15.09.2017, 21:07  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
написал код
выделил его и нажал кнопочку asm в шапке сообщения
ок, исправлюсь...
а по проблеме может кто чего сказать? какой день уже бьюсь...
0
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
15.09.2017, 21:37 8
Цитата Сообщение от ElDave Посмотреть сообщение
а по проблеме может кто чего сказать?
пока не могу
давно не писал под атмегу, но насколько помню, там несколько жампов,короткие и длинные, может что и путаю
может в этом проблема?
Вот Voland_ подойдет и все решит

Добавлено через 2 минуты
попробуй поменять местами обработчик прерываний и reset, если дело в переходах то не будет срабатывать reset
0
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
15.09.2017, 21:42  [ТС] 9
Цитата Сообщение от ValeryS Посмотреть сообщение
давно не писал под атмегу, но насколько помню, там несколько жампов,короткие и длинные, может что и путаю
в 8 битных рджампы, короткие, по крайней мере в 88 так, джампов там нет.
Цитата Сообщение от ValeryS Посмотреть сообщение
попробуй поменять местами обработчик прерываний и reset, если дело в переходах то не будет срабатывать reset
это интересно, попробую....хотя в таком случае возникнет проблема, что я собираюсь писать большой код в прерывании, и на ресет по идее рджамп не допрыгнет.
0
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
15.09.2017, 21:58 10
Цитата Сообщение от ElDave Посмотреть сообщение
в 8 битных рджампы, короткие, по крайней мере в 88 так, джампов там нет.
может быть, может быть
у меня в башке крутятся ассемблеры для 8086, x51, AVR, ARM они хоть чем то похожие но абсолютно разные
и без справочников так с ходу ответить не могу
тем более что я давно сижу на Си
Цитата Сообщение от ElDave Посмотреть сообщение
это интересно, попробую....хотя в таком случае возникнет проблема, что я собираюсь писать большой код в прерывании, и на ресет по идее рджамп не допрыгнет.
Во первых это не решение проблемы, а её локализация
во вторых код в прерывании должен быть как можно меньше
выставил флаги и отвалил
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,535
15.09.2017, 22:22 11
Обычно векторы прерываний заполняются rjmp <hanlder>.
То есть в вашем случае надо что-то типа такого (стр.12, см. пример).
Вы выставляете с помощью .org <N> нужный офсет (в данном случае, необходимое прерывание) и ставите туда команду rkmp <handler>.
А дальше уже, после всего этого списка располагается код.

PS: я просто поначалу думал, что ваша проблема совершенно в другом ).
0
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
15.09.2017, 22:35  [ТС] 12
Цитата Сообщение от Voland_ Посмотреть сообщение
Обычно векторы прерываний заполняются rjmp <hanlder>.
То есть в вашем случае надо что-то типа такого (стр.12, см. пример).
Вы выставляете с помощью .org <N> нужный офсет (в данном случае, необходимое прерывание) и ставите туда команду rkmp <handler>.
А дальше уже, после всего этого списка располагается код.
PS: я просто поначалу думал, что ваша проблема совершенно в другом ).
ну я вроде так и сделал в программе, у меня вектор reset имеет адрес 0000, вектор int0 - 0001, поэтому .org я не указывал, так как rjmp разместятся подряд.... там будут расположены прыжки на адрес в памяти. И ведь все работает в avr studio, отладка полностью проходит. Не получается в реальном мк, если сместить расположение в памяти(не 0x20 адрес) метки прерывания.
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,535
15.09.2017, 23:43 13
Цитата Сообщение от ElDave Посмотреть сообщение
ну я вроде так и сделал в программе
А чип у вас точно mega88? не 168? не 328? не mega8? Они же отличаются... По виду не должно быть проблем. Код верный, если вы исправили "<<", о которых вам сказал ValeryS.

Еще подправьте таки "nul" на что-нибудь другое . Потому что эта метка как-то звучит близко к сишныму "nul".

Насчет "сдвинуть" - то ничего тут страшного нет. Даже если не двигается обработчик int0 (чего быть не может), то вся таблица прерываний меньше 0x20. Вам просто надо reset: перенести тогда за этот обработчик.

Даже если rjmp не "достает" до обработчика, можно использова "veener"'ы. Это jmp'ы по-ближе, чтобы через них можно было бы уже прыгать куда вам надо.

PS: следите тоже за регистрами в прерывании - те, что вы используете, надо ж сохранять и восстанавливать на стеке. По виду у вас и сохранять-то не за чем... но мало ли..
0
ElDave
0 / 0 / 0
Регистрация: 13.09.2017
Сообщений: 30
16.09.2017, 00:58  [ТС] 14
Цитата Сообщение от Voland_ Посмотреть сообщение
А чип у вас точно mega88? не 168? не 328? не mega8? Они же отличаются... По виду не должно быть проблем. Код верный, если вы исправили "<<", о которых вам сказал ValeryS.
чип точно 88. Код исправленный, это здесь я уже писал по памяти и сделал ошибки. Компилятор avr studio его прошел.
Цитата Сообщение от Voland_ Посмотреть сообщение
Насчет "сдвинуть" - то ничего тут страшного нет. Даже если не двигается обработчик int0 (чего быть не может), то вся таблица прерываний меньше 0x20. Вам просто надо reset: перенести тогда за этот обработчик.
но мне не понятно, как такое может быть, что если сдвинуть в памяти метку прерывания, то она перестает работать.... я всегда думал, что я волен писать программу как угодно, на каком адресе окажется моя метка, туда и прыгнет (в пределах допуска rjmp). При чем это только на реальном мк. Может я какие настройки не учел?! уже не знаю, на что думать.
Цитата Сообщение от Voland_ Посмотреть сообщение
Даже если rjmp не "достает" до обработчика, можно использова "veener"'ы. Это jmp'ы по-ближе, чтобы через них можно было бы уже прыгать куда вам надо.
прием такой знаю, но не хотелось бы усложнять программу...
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,535
16.09.2017, 16:08 15
Цитата Сообщение от ElDave Посмотреть сообщение
на каком адресе окажется моя метка, туда и прыгнет (в пределах допуска rjmp)
Естественно. Так и есть. И мало того - если эта программа работает в Atmel Studio и в Протеусе - то вероятность того, что она правильная- это 99,9%. Тут стоит искать причину в бракованом чипе, каких-то частотных багах вашего чипа (соотношение питание-частота), и внешних воздействиях. Потому что сэмулировать их в протеусе будет сложно.
0
sharpey
365 / 155 / 37
Регистрация: 21.09.2008
Сообщений: 518
30.09.2017, 16:29 16
ElDave, могу настоятельно порекомендовать книгу "Практическое программирование микроконтроллеров Atmel AVR языке ассемблера", автор Ревич Юрий Всеволодович, выпущенную в 2014 году издательством "БХВ-Петербург". Скан этой книги в Сети есть. Если не сможете её найти, напишите в приват - вышлю по e-mail, размер порядка 12 Мб. Для Вас будет интересна и полезна глава 5 "Общие принципы программирования МК семейства AVR", подглава "Обработка прерываний", начиная со страницы 93.
0
ElDave
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
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
04.10.2017, 04:32 18
Цитата Сообщение от ElDave Посмотреть сообщение
я использую работу от кварца 18МГц.
настрой фьюзы для работы от внутреннего генератора
пропадет проблема или нет?

Добавлено через 11 минут
Цитата Сообщение от ElDave Посмотреть сообщение
SUT1 (unprogrammed), SUT0 (programmed),
прочитал на одном форуме
CKSEL3 - запрограммировать =0
CKSEL2 - не программировать =1
CKSEL1 - не программировать =1
CKSEL0 - не программировать =1

SUT1 - не программировать =1
SUT0 - не программировать =1
и посмотрел в калькуляторе
http://www.engbedded.com/fusecalc
SUT оба должны быть выключены
0
Kukuxumushu
1849 / 632 / 119
Регистрация: 13.06.2015
Сообщений: 2,158
Завершенные тесты: 2
04.10.2017, 16:14 19
ElDave, а у где у вас собственно разметка карты прерываний директивами org?
Вот по вашей логике, произошло прерывание, на какую инструкцию МК прыгнуть должен?

Добавлено через 2 минуты
Вот что-то подобное где у вас?
Assembler
1
2
3
4
5
.org    $0000  // прыжок на старт кода
jmp     Main
.org    $001C  // вектор прерывания по таймеру
jmp     Timer1_Ovf
.org    $0046
0
ValeryS
Модератор
7528 / 5703 / 738
Регистрация: 14.02.2011
Сообщений: 19,524
Завершенные тесты: 1
04.10.2017, 20:04 20
Цитата Сообщение от Kukuxumushu Посмотреть сообщение
а у где у вас собственно разметка карты прерываний директивами org?
А она обязательна?
0
04.10.2017, 20:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2017, 20:04

Прерывание по изменению уровня на INT0 в ATmega16
Предисловие. Проект частотомера в AVR Studyo 4. При использовании режима Power-down Mode...

Не работает прерывание INT0.
Доброго времени суток. Прошу помощи!! Контроллер PIC18F2520. Компилятор C18. Кнопка подключена...

Си, INT0
Обработчик внешнего прерывания увеличивает значение переменной tmp на единицу. Главный цикл должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru