Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.51/41: Рейтинг темы: голосов - 41, средняя оценка - 4.51
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
1

Таймер

14.12.2012, 13:36. Просмотров 7543. Ответов 40
Метки нет (Все метки)

После выполнения подпрограммы выход из неё происходит в секцию Init, а не в rcall Timer. Где косяк ?
Код
.include "m8def.yms"
.list
;=====================

.def temp= r16
.def Mark240= r17
.def Counter= r18

;=====================
; Начало программы

rjmp Init           ;Первая выполняемая команда

;Подпрограмы:
Timer:

ldi temp,0b00000001; ????????????
out TIMSK,temp;      ????????????

ldi temp,0b00000001; Включаем таймер
out TCCR0,temp;      Частота T/C0  равна CK/???

ldi temp,0b11000000;
out SREG,temp;

brne timer

;=====================
Init:
ldi temp,0b00000001; 1 пин порта В выход, остальные входы
out DDRB, temp;

clr temp
out PortB, temp; Все выводы пота В выкл.

ldi Mark240,241;
ldi Counter,5
;=====================
Start:
sbi PortB,0 ; включаем СИД

rcall Timer

rjmp Start
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2012, 13:36
Ответы с готовыми решениями:

Таймер
Народ, помогите настроить таймер... ATmega8A 16mHz Нужно просто в определенные моменты...

Таймер на attiny2313
Приветствую всех. Как на 2313 рассчитать значение для записи в эти регистры, если я хочу получить...

Сторожевой таймер
В первый раз подключаю сторожевой таймер. Подскажите пожалуйста какие бывают ошибки. МК atmega8....

Таймер на MSP430F2131
Всем добра. В программе есть прерывание обработки таймера(если я правильно перевел название), но...

40
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
14.12.2012, 13:53 2
Выход из подпрограммы - по RET.
0
_moysi
0 / 0 / 0
Регистрация: 19.11.2010
Сообщений: 790
14.12.2012, 13:58 3
Стек.

Magic numbers.

Timer: - это вектор какого прерывания?
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
14.12.2012, 16:57 4
Цитата Сообщение от Финский
Выход из подпрограммы - по RET.
Я просто не могу понять почему после выполнения подпрограммы он прыгает в начало программы, а по идее должен продолжать программу после
rcall Timer
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
14.12.2012, 17:07 5
Программа делает в точности то, что вы ей указали. Где инициализация стека? (_коллега постом выше уже указал на эту ошибку, но понять его дано не всем в этой части вселенной)
Код
brne timer
- это вообще что?
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
14.12.2012, 17:45 6
Цитата Сообщение от tostid_kriim
После выполнения подпрограммы выход из неё происходит в секцию Init, а не в rcall Timer. Где косяк ?
Как написали выше, нужна еще одна команда. Когда условие
Код
brne timer
не выполняется, то выполняется следующая команда. А это - модуль Init... Нужно после brne поставить ret, по которой произойдет переход на вызывающую процедуру ;)
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
14.12.2012, 17:46 7
Цитата Сообщение от Финский
Программа делает в точности то, что вы ей указали. Где инициализация стека? Код:
brne timer - это вообще что?
Нормально там все. у человека "свой" таймер... личный... ;)
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
14.12.2012, 18:13 8
brne timer это что бы, он оставался в цикле, после того как он насчитает 255, должен вернуться rcall Timer, но он прыгает к метке Init.
Я хочу, что бы он отсчитал 255 и и вышел из под программы.
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
14.12.2012, 18:18 9
Оригинальный подход к программированию. С каких это пор таймеры выставляют флаг Z в SREGе? Зачем вам прерывание по переполнению Таймера0? И где, собственно, его обработчик?
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
14.12.2012, 18:30 10
Цитата Сообщение от Финский
Оригинальный подход к программированию. С каких это пор таймеры выставляют флаг Z в SREGе? Зачем вам прерывание по переполнению Таймера0? И где, собственно, его обработчик?
Это я пытаюсь понять, вы не могли бы превести код, а то я уже месяц бьюсь и ничего не получается.
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
14.12.2012, 18:34 11
Какая задача стоит? Что программа делать должна?
а то я уже месяц бьюсь и ничего не получается
За месяц можно учебный курс перечитать вдоль и поперек.
0
С_Ч
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
14.12.2012, 19:05 12
У тебя не определен стек, это написали выше. Кроме того неправильно написана подпрограмма, в конце должна быть команда возврата RET(RETI). На это тоже указали. Из-за этого при работе подпрограммы у тебя опрокидывается стек. Это означает следующее. При уходе в подпрограмму значение программного счетчика загружается память по адресу указаному в SPH:SPL (стек). При возврате в основную программу процессор берет адрес возврата оттуда куда загрузил. При включении питания в SPH:SPL находится случайное число, которое может указывать на адрес которого не существует, или на область памяти, используемой программой, или еще куда. В этом случае при входе в подпрограмму адрес возврата будет утерян. Возврат из подпрограммы произойдет в любое место. А дальше или WDT пересбросит процессор, или программа прогонит всю память. В любом случае все начнется с адреса 0x0000(т.е INIT).
И еще непонятно зачем вот это:
ldi temp,0b11000000;
out SREG,temp;

А упертость похвальна, значит толк будет.
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
14.12.2012, 21:27 13
Цитата Сообщение от С_Ч
У тебя не определен стек, это написали выше. Кроме того неправильно написана подпрограмма, в конце должна быть команда возврата RET(RETI). На это тоже указали. Из-за этого при работе подпрограммы у тебя опрокидывается стек. Это означает следующее. При уходе в подпрограмму значение программного счетчика загружается память по адресу указаному в SPH:SPL (стек). При возврате в основную программу процессор берет адрес возврата оттуда куда загрузил. При включении питания в SPH:SPL находится случайное число, которое может указывать на адрес которого не существует, или на область памяти, используемой программой, или еще куда. В этом случае при входе в подпрограмму адрес возврата будет утерян. Возврат из подпрограммы произойдет в любое место. А дальше или WDT пересбросит процессор, или программа прогонит всю память. В любом случае все начнется с адреса 0x0000(т.е INIT).
И еще непонятно зачем вот это:
ldi temp,0b11000000;
out SREG,temp;

А упертость похвальна, значит толк будет.
В книге Ефстифеева написано "При переходе таймера/счетчика из состояния""$FF"в состояние "$00" устанавливается флаг TOV0 регистра TIFR и генерируется запрос на прерывание. Разрешение прерывания осуществляется установкой в "1" разряда TOIE регистра TIMSK (Разумеется, флаг общего разрешения прерывания I регитсра SREG также должен быть установлен в "1")
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
14.12.2012, 21:28 14
[QUOTE="Финский"]Какая задача стоит? Что программа делать должна?[QUOTE="Цитата:[/QUOTE]
а то я уже месяц бьюсь и ничего не получается
За месяц можно учебный курс перечитать вдоль и поперек.
Люди разные, кому легко даетяс, комуто хуже, лучше бы помог.
0
С_Ч
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
14.12.2012, 22:01 15
Цитата Сообщение от tostid_kriim
В книге Ефстифеева написано "При переходе таймера/счетчика из состояния""$FF"в состояние "$00" устанавливается флаг TOV0 регистра TIFR и генерируется запрос на прерывание. Разрешение прерывания осуществляется установкой в "1" разряда TOIE регистра TIMSK (Разумеется, флаг общего разрешения прерывания I регитсра SREG также должен быть установлен в "1")
Ну понятно. Только для общего разрешения прерываний есть команда - sei, которая заменяет вот это
ldi temp,0b11000000;
out SREG,temp;
Но в этой конструкции помимо флага общих прерываний устанавливается еще флаг Т. Вреда, конечно, никакого, но нафига?
0
Финский
0 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 789
14.12.2012, 23:19 16
В книге Ефстифеева написано "При переходе таймера/счетчика из состояния""$FF"в состояние "$00" устанавливается флаг TOV0 регистра TIFR и генерируется запрос на прерывание.
Только флаг Z в регистре SREG к этому не имеет ни малейшего отношения.
Люди разные, кому легко даетяс, комуто хуже, лучше бы помог.
Я спрошу еще раз -
Какая задача стоит? Что программа делать должна?
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
15.12.2012, 10:35 17
Цитата Сообщение от С_Ч
Цитата Сообщение от tostid_kriim
В книге Ефстифеева написано "При переходе таймера/счетчика из состояния""$FF"в состояние "$00" устанавливается флаг TOV0 регистра TIFR и генерируется запрос на прерывание. Разрешение прерывания осуществляется установкой в "1" разряда TOIE регистра TIMSK (Разумеется, флаг общего разрешения прерывания I регитсра SREG также должен быть установлен в "1")
Ну понятно. Только для общего разрешения прерываний есть команда - sei, которая заменяет вот это
ldi temp,0b11000000;
out SREG,temp;
Но в этой конструкции помимо флага общих прерываний устанавливается еще флаг Т. Вреда, конечно, никакого, но нафига?
достаточно написать вот так или надо, что то еще добавить

ldi temp,0b00000001; ????????????
out TIMSK,temp; ????????????

ldi temp,0b00000001; Включаем таймер
out TCCR0,temp; Частота T/C0 равна CK/???

sei;
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
15.12.2012, 10:40 18
[QUOTE="Финский"][QUOTE="Цитата:[/QUOTE]
В книге Ефстифеева написано "При переходе таймера/счетчика из состояния""$FF"в состояние "$00" устанавливается флаг TOV0 регистра TIFR и генерируется запрос на прерывание.
Только флаг Z в регистре SREG к этому не имеет ни малейшего отношения.
Люди разные, кому легко даетяс, комуто хуже, лучше бы помог.
Я спрошу еще раз -
Какая задача стоит? Что программа делать должна?
записать во временный регистр допустим число 25, потом его отправить в таймер, потом таймер доходит до 255, и возвращается к месту откуда была запущена подпрограмма, потом следующее число 65, записать в таймер, и что бы он снова дошел до 255, произошло переполнение и он снова вышел из подпрограммы. И так еще несколько чисел.
0
С_Ч
0 / 0 / 0
Регистрация: 11.11.2012
Сообщений: 53
15.12.2012, 13:25 19
Выкинь свою программу и пиши по-новой.
Во-первых, главная программа должна начинаться со строк:
cli ;Запрет всех прерываний
ldi r16,low(ROMEND) ;Загрузка указателя стека
out SPL,r16 ;
ldi r16,high(ROMEND) ;
out SPH,r16 ;
wdr ;Сброс WDT
Во-вторых, ты должен настроить таймер и запретить прерывания от него. Лезешь в даташит и смотришь в какие регистры чего писать.
В-третьих, в подпрограмме таймера должен быть организован бесконечный цикл по проверке флага прерывания от этого таймера. Как только флаг установится, цикл прерывается и происходит выход из подпрограммы.
В-четвертых, после записи данных в таймер необходимо сбросить флаг прерывания.
В-пятых, во время циклов, особенно бесконечных, необходимо сбрасывать WDT командой wdr. Иначе окажешься на адресе 0x0000.
Ну и, в-шестых, вообще-то так не делают, разве что для тренировки.

Вперед на мины, программу за тебя никто писать не будет!
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
15.12.2012, 13:59 20
Цитата Сообщение от tostid_kriim
записать во временный регистр допустим число 25, потом его отправить в таймер, потом таймер доходит до 255, и возвращается к месту откуда была запущена подпрограмма, потом следующее число 65, записать в таймер, и что бы он снова дошел до 255, произошло переполнение и он снова вышел из подпрограммы. И так еще несколько чисел.
Вообще комменты читаешь? Команду "ret" после brne добавил?
0
15.12.2012, 13:59
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 13:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не работает таймер
Здравствуйте. Нужно чтобы мигали 3 любых светодиода с интервалом времени , задержка от таймера 0 с...

Таймер на микроконтроллере
помогите пожалуйста составить схему электрическую структурную таймера

atmega8535 таймер
Здравствуйте. У меня всё то же устройство. Задача такая: на шине разные слова. Слова с моим...

шим и таймер.
Во общем хочу сделать шим и выключить его по заданном интервалу времени. К примеру включили...


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

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

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