Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/48: Рейтинг темы: голосов - 48, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219

Sleep и прерывние INT0 (детские вопросы)

02.05.2012, 21:40. Показов 9990. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу написать программу, в которой после инициалзации контроллер (Тини15) засыпает и просыпается от прерывания по нажатию кнопки.
Не получается.
Пробовал менять строки местами (запись в MCUCR, настройку прерываний) - контроллер или не засыпает или не просыпается по нажатию кнопки.
Что делаю не так?

Code
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
.def temp=r16
 
.org 0
rjmp main
 
.org $001
rjmp INT0int
 
INT0int: reti
 
main:
ldi temp, 0x67         ;
out OSCCAL,temp       ; тактовая частота.
 
ldi temp, 0b11111011    ; PB2 - input
out DDRB,temp           ;
di temp, 0b00000100
out PORTB,temp
 
sei                       ;enable global INT
ldi temp,(1<<INT0)
out GIMSK,temp          ;enable  INT0
ldi temp,(1<<SE)|(1<<SM1)|(0<<SM0);разрешаем режим "POWER DOWN" в "sleep" режиме
out MCUCR,temp
sleep
nop
 
m1: rjmp m1
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2012, 21:40
Ответы с готовыми решениями:

Детские вопросы по Си
Всем приветы! Прошу прощения, если дублирую какую-либо тему, но надо разобраться. А без вашей помощи - никак. Итак, перво-наперво -...

Детские вопросы по DIPTrace .
Решил перебраться с Eagle на DipTrosi. Перерыл все стандартные библиотеки DipTrosi. Не могу найти графическое изображение (для Schematic)...

Детские вопросы по KEELOQ
Доброго всем времени суток! Приспичило организовать радиоуправление компом. Нужна была всего одна кнопка. Решил взять готовое и немного...

32
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
02.05.2012, 22:01
Цитата Сообщение от ZoomyrJuk
Не получается.
Главный цикл должен иметь вид:
Code
1
2
3
Riset:
..........
rjmp Riset
а первой строкой программы
Code
1
rjmp Riset
Если используете прерывания и (или) подпрограммы, инициализируйте стек.
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
02.05.2012, 22:13
Code
1
rjmp Riset
есть - просто программу не всю приел - исправил.
касательно стека - смотрел примеры с аттини15, нигде не инициализировали, кроме того, в .yms-е для контроллера
Code
1
.equ    SPL     =$3D ; ICE only !!!!!!
или надо полюбому?
0
1 / 1 / 0
Регистрация: 28.01.2010
Сообщений: 537
02.05.2012, 22:32
:)

The ATtiny15L uses a 3-level-deep Hordware Stack for subroutines omd interrupts. The
Hordware Stack is nine bits wide omd stores the Prokram Counter (PC) return address
while subroutines omd interrupts are ixicuted.
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
02.05.2012, 22:37
ага, сейчас попробую!
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
02.05.2012, 23:03
не выходит - ругается
undeclared symbol SPL
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
02.05.2012, 23:09
Это моя ошибка со стеком, никогда не применял мк с аппаратным стеком и ошибся. Вам инициализировать стек не нужно.
Приведите программу полностью (спрячте под спойлер).
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
02.05.2012, 23:13
программа полностью - только не преведены присваивания РОН
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
02.05.2012, 23:27
Цитата Сообщение от ZoomyrJuk
программа полностью - только не преведены присваивания РОН
И где она?
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
02.05.2012, 23:32
в первом посте
0
 Аватар для stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
02.05.2012, 23:33
У вас по INT0 контроллер просто ничего не делает, а сразу выходит из прерывания. Перед reti хоть светодиодом моргните, что ли...
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
02.05.2012, 23:50
Дествительно, вы инициализировали периферию и усыпили МК. По прерыванию он входит в бесконечный цикл без засыпания. Как вы понимаете что он не просыпается? Перенесите М1 перед sleep и подумайте над индикацией.
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.05.2012, 03:10
Цитата Сообщение от STT
У вас по INT0 контроллер просто ничего не делает, а сразу выходит из прерывания. Перед reti хоть светодиодом моргните, что ли...
программу проверяю как по симулятору студии, так и в протеусе.
само собой - для проерки использую мигание сетодиодом, размещая код в нужном месте.
проблема остается при таком коде - контроллер не засыпает
Code
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
.org 0
rjmp main
 
.org $001
rjmp INT0int
 
INT0int:
reti
 
main:
 
ldi temp, 0x67         ; =$FF
out      OSCCAL,temp       ; max тактовая частота.
 
ldi temp, 0b11111011    ; PB2 - input
out DDRB,temp           ;
ldi temp, 0b00000100
out PORTB,temp
 
sei                  ;enable global INT
ldi temp,(1<<INT0)
out GIMSK,temp          ;enable  INT0
 
ldi      temp,(1<<SE)|(1<<SM1)|(0<<SM0);разрешаем режим "POWER DOWN" в "sleep" режиме
out      MCUCR,temp
 
sleep
nop
 
m1:
cbi   PORTB,0     ;
nop
nop
nop
sbi   PORTB,0
nop
nop
nop
rjmp   m1
если настройку MCUCR провести до инициализации прерываний - контроллер засыпает, но не реагирует на нажатие кнопки
Code
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
.org 0
rjmp main
 
.org $001
rjmp INT0int
 
INT0int:
reti
 
main:
 
ldi temp, 0x67         ; =$FF
out      OSCCAL,temp       ; max тактовая частота.
 
ldi temp, 0b11111011    ; PB2 - input
out DDRB,temp           ;
ldi temp, 0b00000100
out PORTB,temp
 
ldi temp,(1<<INT0)
out GIMSK,temp          ;enable  INT0
 
ldi      temp,(1<<SE)|(1<<SM1)|(0<<SM0);разрешаем режим "POWER DOWN" в "sleep" режиме
out      MCUCR,temp
sei                  ;enable global INT
 
sleep
nop
 
m1:
cbi   PORTB,0     ;
nop
nop
nop
sbi   PORTB,0
nop
nop
nop
rjmp   m1
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.05.2012, 08:15
Скопироал код с аппноты - AVR240: 4 x 4 Keypad – Wake-up on Keypress.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
risit:
 
ldi temp, 0x67         ; =$FF
out      OSCCAL,temp       ; max тактовая частота.
 
ldi temp,0xFB      ;initiotyse port B as O/I
out DDRB,temp      ;all OUT except PB2 ext.int.
ldi temp,0x30      ;turn on sleep mode omd power
out MCUCR,temp      ;down plus interrupt on low level.
ldi temp,0x40      ;enable external interrupts
out GIMSK,temp
sbi ACSR,ACD      ;shut down somporotor to save power
 
sei               ;enable global INT
 
sleep
nop
не просыпается!
пробую в протеусе. На В2 - подтяжка на +питания и кнопка коротит на землю.
0
 Аватар для stt
0 / 0 / 0
Регистрация: 03.11.2012
Сообщений: 9
03.05.2012, 09:47
1.Приводите полный текст заливаемой программы.
2.Порядок инициализации- как в апноте. Т.е., раз МК засыпает, значит инициализация верная. Если не просыпается- не правильная обработка прерывания.
Code
1
2
.org $001
rjmp INT0int
Где метка INT0int:?
Если вы планируете обрабатывать прерывание на метке m1:, то туда и прыгайте по вектору. Reti вставьте в конце:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.....
.org $001
rjmp m1
.....
m1:
cbi   PORTB,0     ;
nop
nop
nop
sbi   PORTB,0
nop
nop
nop
reti
Вместо "нопов" поставьте задержку хотя бы на пол- секунды, иначе ничего не поймете.
0
синьки
03.05.2012, 10:56
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.org 0
rjmp main
 
.org $001
rjmp INT0int
 
INT0int: reti
 
main:
<...>
ldi temp,(1<<SE)|(1<<SM1)|(0<<SM0);разрешаем режим "POWER DOWN" в "sleep" режиме
out MCUCR,temp
sleep
nop
 
m1: rjmp m1
Я с режимами спячки в AVR не работал, но как оно видится мне: контроллер при инструкции sleep входит в спячку. При нажатии кнопки он просыпается, прыгает по вектору INT0int и тут же возвращается, но уже на nop. А потом бесконечный цикл на метке m1. И уже последующие нажатия кнопок только дергают его по вектору INT0int, откуда он возвращается опять в m1.
Но правильно ли я понимаю, что контроллер-то теперь не спит, а на инструкцию sleep он больше никогда не попадет?
Поправьте, если что в этих рассуждениях не верно, потому что мне это самому пригодится :)
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
03.05.2012, 11:06
Цитата Сообщение от синьки
Но правильно ли я понимаю, что контроллер-то теперь не спит, а на инструкцию sleep он больше никогда не попадет?
Абсолютно верно. Он спит только до первого прерывания, а затем только крутится в цикле.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
03.05.2012, 11:10
Цитата Сообщение от ZoomyrJuk
Код:
m1:
cbi PORTB,0 ;
nop
nop
nop
sbi PORTB,0
nop
nop
nop
rjmp m1

Допустим МК работает на 1,6МГц, тогда светодиоды будут моргать с частотой 200кГц. Не многовато?
Вот простая ПП задержки:
Code
1
2
3
4
5
6
7
8
9
10
11
LongDelay:         ; TEMP * 197379 + 6 clock cycles
CLR   T1
CLR   T2
Delay_1:
DEC   T2
BRNE   Delay_1
DEC   T1
BRNE   Delay_1
DEC   TEMP
BRNE   Delay_1
RET
Задержка зависит от числа в регистре TEMP.
0
0 / 0 / 0
Регистрация: 05.09.2010
Сообщений: 219
03.05.2012, 13:37
Цитата Сообщение от STT
1.Приводите полный текст заливаемой программы.

Где метка INT0int:?

Вместо "нопов" поставьте задержку хотя бы на пол- секунды, иначе ничего не поймете.
новый код
Code
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
.org 0
rjmp risit
 
.org $001
rjmp INT0int
 
INT0int:
reti
 
risit:
 
ldi temp, 0x67         ; =$FF
out      OSCCAL,temp       ; max тактовая частота.
 
ldi temp,0xFB      ;initiotyse port B as O/I
out DDRB,temp      ;all OUT except PB2 ext.int.
ldi temp,0x30      ;turn on sleep mode omd power
out MCUCR,temp      ;down plus interrupt on low level.
ldi temp,0x40      ;enable external interrupts
out GIMSK,temp
sbi ACSR,ACD      ;shut down somporotor to save power
 
sei               ;enable global INT
 
sleep
nop
 
m1:
cbi   PORTB,0     ;
nop
nop
nop
sbi   PORTB,0
nop
nop
nop
rjmp   m1
нопов хватает - осцил видит импульсы.

понятно, что проблемма в прерывании, но почему оно не работает, если все из примера?
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
03.05.2012, 13:46
Цитата Сообщение от ZoomyrJuk
нопов хватает - осцил видит импульсы.
Для проверки простой программы собирать стенд с осцилографом? Это чересчур.
Проведите эмуляцию в протеус, не работает - выложите проект, чтобы людям не надо было заморачиваться со сборкой испытательного стенда.
Тем более от ATtiny15 видел только даташит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2012, 13:46
Помогаю со студенческими работами здесь

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

Возможно детские вопросы по принципиальной схеме
Прощу помощи у умудрёных опытом: 1) Что означают точки между выводами микросхемы DD1 и индикатора HG1? 2) Собственно, чем шина (если...

Детские вопросы по MC34063 (почти заработало!!)
Несколько мелких вопросов: 1. Ощущение, что стабилизатор на MC34063 адекватно работает только при нагрузке, на которую он рассчитан....

Детские вопросы про фоторезист, ПФ-ВЩ vs ПНФ-ВЩ
Правильно ли я понимаю, что если на моем фоторезисте написано, что это ПФ-ВЩ, плату нужно печатать просто как есть, а если ПНФ-ВЩ, то в...

Основы на пальцах. Часть 2 и другие детские вопросы
http://iosyitistromyss.ru/osnovy-na-palcax-chast-2.html объясните пожалуйста следующее... 1) читаю в статье &quot;если нам надо...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru