реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> прерывание от таймера меги16
wert123
сообщение Dec 16 2007, 15:12
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 28-10-07
Пользователь №: 31 824



Подскажите в чем проблема, не наблюдаеться перехода на обработку прерывания т/с0 по совпадению, хотя TIFR флаг появляеться:
.include "m16def.inc"

rjmp reset
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
rjmp TAMER0_COMP


reset:
clr r16
ldi r16,low(RAMEND);
out spl,r16;
ldi r16,high(RAMEND);
out sph,r16;
ldi r16,255;
out DDRA,r16;
ldi r16,0;
out PORTA,r16;
;;;;конфигурирование таймера
sei
ldi r16,9
out OCR0,r16
ldi r16,2;прерыв по совпад
out TIMSK,r16
ldi r16,9;по совпадению, вн генер 1Мгц
out TCCR0,r16
;;;задержка
delay:
ldi r19,20;
delay1:
ldi r17,100;
delay2:
ldi r18,20;
delay3:
dec r18;
brne delay3;
dec r17;
brne delay2;
dec r19;
brne delay1;

TAMER0_COMP:
ldi r16,255;
out PORTA,r16;
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Dec 16 2007, 18:40
Сообщение #2





Guests






Кроме этого, не наблюдаетЬся и каких-либо следов прочтения даташита и даже малейшего понимания сути работы механизма Compare, прерываний и т.д. Марш зубрить букварь!
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 16 2007, 19:30
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Извините, было лениво искать ошибку в вашем коде.
Привожу пример который работает, сравните со своим кодом и найдите ошибку.

CODE

.include "m16def.inc"

.def AH = R25
.def AL = R24
.def BlinkReg = R15

.ORG 0
jmp PROG_START

.ORG 0x26
rjmp TIMER0_COMP_HANDLER


PROG_START:
// stack initialization
ldi AL, Low( RAMEND)
out SPL, AL
ldi AL, High( RAMEND )
out SPH, AL

// timer0 initialization
ldi AL, (1 << OCIE0)
out TIMSK, AL
ldi AL, 9 // your OCR value
out OCR0, AL
ldi AL, (1 << CTC0) | (1 << CS00)
out TCCR0, AL

// initialize port A as output
ldi AL, 0xFF
out DDRA, AL

// enable ints
sei



MAIN_LOOP:
rjmp MAIN_LOOP



TIMER0_COMP_HANDLER:
com BlinkReg
out PortA, BlinkReg
reti
Go to the top of the page
 
+Quote Post
bodja74
сообщение Dec 16 2007, 19:36
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(wert123 @ Dec 16 2007, 19:12) *
Подскажите в чем проблема, не наблюдаеться перехода на обработку прерывания т/с0 по совпадению, хотя TIFR флаг появляеться:
.include "m16def.inc"

rjmp reset
nop


Так таблица прерваний делается только для меги8\48\88\8515\8535 и тинек ,для меги16 каждый вектор идет в четыре байта ,тоесть заместь rjmp reset идет jmp reset ,
команда nop имеет размер 2 байта и если хотите заполнить вектора nop-ами ,нужно указавать по два nop на каждый вектор.
Можно еще так smile.gif
.org 0
jmp reset
.org 0x26
jmp Compare_T0
Go to the top of the page
 
+Quote Post
wert123
сообщение Dec 17 2007, 10:57
Сообщение #5





Группа: Новичок
Сообщений: 12
Регистрация: 28-10-07
Пользователь №: 31 824



Цитата(bodja74 @ Dec 16 2007, 23:36) *
Так таблица прерваний делается только для меги8\48\88\8515\8535 и тинек ,для меги16 каждый вектор идет в четыре байта ,тоесть заместь rjmp reset идет jmp reset ,
команда nop имеет размер 2 байта и если хотите заполнить вектора nop-ами ,нужно указавать по два nop на каждый вектор.
Можно еще так smile.gif
.org 0
jmp reset
.org 0x26
jmp Compare_T0



Чтоб не начинать новую тему, да эта и похожа, у меня такой вопрос-как организовать счет внешних событий(скажем по нажатию на кнопку 5 раз) и после этого, чтоб на какой-нибудь разряд порта выдовать 1.
Я думал (у меня мега16) можно сконфигурировать скажем т/с0 на прерыв по совпадению, в ОСR0 загнать 5, и TCCR0 на тактирование от внешнего источника, тоесть счет импульсов от нажатия кнопки РВ0 , но не получаеться, что не так?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 17 2007, 11:46
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(wert123 @ Dec 17 2007, 12:57) *
что не так?
Если "выдовать 1" происходит раньше, чем на пятом нажатии - скорее всего дребезг контактов вызывает больше, чем один импульс на нажатие.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
wert123
сообщение Dec 17 2007, 14:49
Сообщение #7





Группа: Новичок
Сообщений: 12
Регистрация: 28-10-07
Пользователь №: 31 824



Цитата(Сергей Борщ @ Dec 17 2007, 15:46) *
Если "выдовать 1" происходит раньше, чем на пятом нажатии - скорее всего дребезг контактов вызывает больше, чем один импульс на нажатие.



Спасибо за выдОвать-не углядел, у меня вопрос не в этом, скорее я не правильно его сформулировал-как организовать счет внешних событий?И возможно ли, чтоб внешними собітиями біли импульсы от нажатия кнопки?


Цитата(wert123 @ Dec 17 2007, 18:24) *
Спасибо за выдОвать-не углядел, у меня вопрос не в этом, скорее я не правильно его сформулировал-как организовать счет внешних событий от нажатия кнопки-только организацией внешних прерываний?И скажите какой минимальной может быть частота внешнего сигнала для того, чтоб таймер считал эти импульсы?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 17 2007, 14:58
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(wert123 @ Dec 17 2007, 16:49) *
как организовать счет внешних событий?И возможно ли, чтоб внешними собітиями біли импульсы от нажатия кнопки?
Можно так, как вы описали - завести на счетный вход таймера. Такой вариант хорош, если импульсы формируются каким-либо датчиком, у которого отсутствует дребезг. Для кнопки не подходит, или надо как-то давить дребезг аппаратно. Можно таймер заставить генерить прерывания с периодом 10мс и в прерывании считывать состояние ножки, к которой подключена кнопка. Любая вменяемая кнопка имеет дребезг меньше 10мс. Дальше программно считать количество нажатий. Можно завести кнопку на вход прерывания, по нажатию кнопки будет генерится прерывание, в нем увеличиваем счетчик нажатий, запрещаем это прерывание на 10 мс. Чаще всего используется второй способ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
wert123
сообщение Dec 17 2007, 15:22
Сообщение #9





Группа: Новичок
Сообщений: 12
Регистрация: 28-10-07
Пользователь №: 31 824



Цитата(Сергей Борщ @ Dec 17 2007, 18:58) *
Можно так, как вы описали - завести на счетный вход таймера. Такой вариант хорош, если импульсы формируются каким-либо датчиком, у которого отсутствует дребезг. Для кнопки не подходит, или надо как-то давить дребезг аппаратно. Можно таймер заставить генерить прерывания с периодом 10мс и в прерывании считывать состояние ножки, к которой подключена кнопка. Любая вменяемая кнопка имеет дребезг меньше 10мс. Дальше программно считать количество нажатий. Можно завести кнопку на вход прерывания, по нажатию кнопки будет генерится прерывание, в нем увеличиваем счетчик нажатий, запрещаем это прерывание на 10 мс. Чаще всего используется второй способ.


Спасибо все понял, но я еще до дребезга не дошел, я проверяю только в AVR studio, и выставляю через какое то время в PINB0 "1"-симулируя нажатие кнопки, а счета почему-то не происходит в таймере0.Вот код:
.include "m16def.inc"
.org 0
jmp reset
.org 0x26
jmp TAMER0_COMP


reset:
clr r16
ldi r16,low(RAMEND);
out spl,r16;
ldi r16,high(RAMEND);
out sph,r16;
ldi r16,255;
out DDRA,r16;
ldi r16,0;
out PORTA,r16;
ldi r16,0;
out DDRB,r16;
;;;;конфигурирование таймера
sei
ldi r16,5
out OCR0,r16
ldi r16,2;прерыв по совпад
out TIMSK,r16
ldi r16,14;по совпадению, вн генер
out TCCR0,r16

;;;задержка
delay:
ldi r19,20;
delay1:
ldi r17,100;
delay2:
ldi r18,200;
delay3:
dec r18;
brne delay3;
dec r17;
brne delay2;
dec r19;
brne delay1;

TAMER0_COMP:
ldi r16,255;
out PORTA,r16;

ldi r19,20;
delay7:
ldi r17,100;
delay8:
ldi r18,20;
delay9:
dec r18;
brne delay9;
dec r17;
brne delay8;
dec r19;
brne delay7;
jmp reset
;;;;задержка
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 17 2007, 16:02
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(wert123 @ Dec 17 2007, 18:22) *
Вот код:
TAMER0_COMP:
ldi r16,255;
out PORTA,r16;
...
jmp reset
;;;;задержка

А где RETI?
Из прерывания надо выходить командой RETI - которая вытаскивает из стека адрес возврата и устанавливает флаг I (тем самым разрешая прерывания). Вместо "jmp reset" поставьте reti.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01427 секунд с 7
ELECTRONIX ©2004-2016