Технический форум по робототехнике.
blindman » 20 ноя 2009, 15:32
Часто наблюдается такая ошибка - манипуляция значением счётчика в обработчике прерываний, с целью задать требуемый интервал между прерываниями. Чаще всего это означает, что неверно выбран режим работы таймера. В данном случае, для 50 Гц меандра - установить режим CTC/toggle on compare, в OCR0 записать 71, прескэйлер 1024. Прерывание не нужно
Добавлено спустя 1 минуту 41 секунду:Это я протелепатировал, что тактовая частота 7.3728 МГц

milkpower » 20 ноя 2009, 15:41
ну частота естесс-но такая
но 7372800/1024/50=144 почему 71?
все-таки как сбросить последствия прихода прерывания таймера в порту?
blindman » 20 ноя 2009, 15:47
Потому что toggle on compare - один цикл работы таймера равен полупериоду меандра. Еще раз : прерывания тебе не нужны
Добавлено спустя 45 секунд:
В даташите есть формула, не 72, а именно 71
milkpower » 20 ноя 2009, 15:55
да, точняк, стр77 пункт 14.7.2 формула

- formula.JPG (11.57 КиБ) Просмотров: 1960
спасибо
blindmanно вот про прерывания чет не пойму, почему они все-таки не нужны, попробую ДШ перевести.
blindman » 20 ноя 2009, 15:57
Твое прерывание ничего не делает, кроме как перевзводит таймер и меняет состояние ноги - всё это таймер может делать сам, без участия программы
milkpower » 20 ноя 2009, 16:03
а, ну так это пока тестовый вариант, в последствии в обработчике прерывания будет еще всяко-разное.
Master » 20 ноя 2009, 16:39
Всякого разного в прерывании как раз меньше всего должно быть. Чем прерывание короче тем лучше.
ALHIMIK » 20 ноя 2009, 16:41
всякое разное можно повесить на флаги....
milkpower » 20 ноя 2009, 17:03
ну смысл был в том, что там кроме сброса порта буду еще несколько команд.
Добавлено спустя 17 минут 17 секунд:
все-таки вопрос открытый, как в порту выключить выставленный бит?
avr123.nm.ru » 20 ноя 2009, 17:40
Можно использованием битовой маски а можно просто "очистить" бит иногда
ПОРТ.БИТ = 0;
Манипулирование отдельными битами регистров есть и в даташитах на Си и АСМ и вот из курса для начинающих картинка
- Вложения
-

milkpower » 20 ноя 2009, 22:43
это все я понимаю, но дело в том, что после сброса бита, он автоматически выставляется на следующей команде! вот что меня и ставит в тупик.
avr123.nm.ru » 20 ноя 2009, 22:59
Вы покажите кусок кода. Что за бит и регистр ?
Лучше приложить проект целиком. Советую использовать PROTEUS.
milkpower » 20 ноя 2009, 23:05
на прошлой странице я выкладывал весь код, он особо не изменился
- Код: Выделить всё • Развернуть
.INCLUDE "m16def.inc"
.CSEG
.def temp = r16
.ORG $0
rjmp RESET
.ORG $26
rjmp timer0
.ORG $30
timer0:
cli
push temp
clr temp
out TCNT0,temp
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
out portB,temp
out pinB,temp
pop temp
sei
reti
reset:
ldi temp, low(RAMEND)
out SPL, temp
ldi temp, high(RAMEND)
out SPH, temp
ldi temp,$FF
out ddrB,temp
;init 8-bit timer on 50hz
ldi temp,71
out OCR0,temp
ldi temp,(1<<OCIE0)
out TIMSK,temp
ldi temp,(1<<COM00)|(1<<COM01)|(1<<CS00)|(1<<CS02)
out TCCR0,temp
sei
mloop:
rjmp mloop
таймер отрабатывает нормально, в прерывание заходит, и в первый раз устанавливает 1 в portB.3, и больше не отпускает
может еще надо какой регистр чистить, чтоб порт попустило?
ALHIMIK » 20 ноя 2009, 23:35
Дык это см рис
- Вложения
-

Michael_K » 20 ноя 2009, 23:45
Код странный...
Что такое out PINB,temp, например?
Зачем cli в начале прерывания?
Зачем sei в конце прерывания?
Вообще, я честно не понял, что он должен делать

Основная ошибка вот в чем: если уж вы отдали ногу таймеру,
то рулить портом (через PORT) вы уже не сможете.