roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Re: МикроКонтроллер AVR начинающим - общие вопросы

blindman » 20 ноя 2009, 15:32

Часто наблюдается такая ошибка - манипуляция значением счётчика в обработчике прерываний, с целью задать требуемый интервал между прерываниями. Чаще всего это означает, что неверно выбран режим работы таймера. В данном случае, для 50 Гц меандра - установить режим CTC/toggle on compare, в OCR0 записать 71, прескэйлер 1024. Прерывание не нужно

Добавлено спустя 1 минуту 41 секунду:
Это я протелепатировал, что тактовая частота 7.3728 МГц :)

Re: МикроКонтроллер AVR начинающим - общие вопросы

milkpower » 20 ноя 2009, 15:41

ну частота естесс-но такая :wink:
но 7372800/1024/50=144 почему 71?
все-таки как сбросить последствия прихода прерывания таймера в порту?

Re: МикроКонтроллер AVR начинающим - общие вопросы

blindman » 20 ноя 2009, 15:47

Потому что toggle on compare - один цикл работы таймера равен полупериоду меандра. Еще раз : прерывания тебе не нужны

Добавлено спустя 45 секунд:
В даташите есть формула, не 72, а именно 71

Re: МикроКонтроллер AVR начинающим - общие вопросы

milkpower » 20 ноя 2009, 15:55

да, точняк, стр77 пункт 14.7.2 формула
formula.JPG
formula.JPG (11.57 КиБ) Просмотров: 1960

спасибо blindman

но вот про прерывания чет не пойму, почему они все-таки не нужны, попробую ДШ перевести.

Re: МикроКонтроллер AVR начинающим - общие вопросы

blindman » 20 ноя 2009, 15:57

Твое прерывание ничего не делает, кроме как перевзводит таймер и меняет состояние ноги - всё это таймер может делать сам, без участия программы

Re: МикроКонтроллер AVR начинающим - общие вопросы

milkpower » 20 ноя 2009, 16:03

а, ну так это пока тестовый вариант, в последствии в обработчике прерывания будет еще всяко-разное.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Master » 20 ноя 2009, 16:39

Всякого разного в прерывании как раз меньше всего должно быть. Чем прерывание короче тем лучше.

Re: МикроКонтроллер AVR начинающим - общие вопросы

ALHIMIK » 20 ноя 2009, 16:41

всякое разное можно повесить на флаги....

Re: МикроКонтроллер AVR начинающим - общие вопросы

milkpower » 20 ноя 2009, 17:03

ну смысл был в том, что там кроме сброса порта буду еще несколько команд.

Добавлено спустя 17 минут 17 секунд:
все-таки вопрос открытый, как в порту выключить выставленный бит?

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 20 ноя 2009, 17:40

Можно использованием битовой маски а можно просто "очистить" бит иногда

ПОРТ.БИТ = 0;

Манипулирование отдельными битами регистров есть и в даташитах на Си и АСМ и вот из курса для начинающих картинка
Вложения
avr123.nm.ru.png

Re: МикроКонтроллер AVR начинающим - общие вопросы

milkpower » 20 ноя 2009, 22:43

это все я понимаю, но дело в том, что после сброса бита, он автоматически выставляется на следующей команде! вот что меня и ставит в тупик.

Re: МикроКонтроллер AVR начинающим - общие вопросы

avr123.nm.ru » 20 ноя 2009, 22:59

Вы покажите кусок кода. Что за бит и регистр ?

Лучше приложить проект целиком. Советую использовать PROTEUS.

Re: МикроКонтроллер AVR начинающим - общие вопросы

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, и больше не отпускает
может еще надо какой регистр чистить, чтоб порт попустило?

Re: МикроКонтроллер AVR начинающим - общие вопросы

ALHIMIK » 20 ноя 2009, 23:35

Дык это см рис
Вложения
1234.JPG

Re: МикроКонтроллер AVR начинающим - общие вопросы

Michael_K » 20 ноя 2009, 23:45

Код странный...
Что такое out PINB,temp, например?
Зачем cli в начале прерывания?
Зачем sei в конце прерывания?

Вообще, я честно не понял, что он должен делать :)

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


cron
Rambler\'s Top100 Mail.ru counter