roboforum.ru

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

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

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

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

Сообщение blindman » 20 ноя 2009, 15:32

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

Добавлено спустя 1 минуту 41 секунду:
Это я протелепатировал, что тактовая частота 7.3728 МГц :)
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение milkpower » 20 ноя 2009, 15:41

ну частота естесс-но такая :wink:
но 7372800/1024/50=144 почему 71?
все-таки как сбросить последствия прихода прерывания таймера в порту?
Аватара пользователя
milkpower
 
Сообщения: 217
Зарегистрирован: 25 мар 2009, 13:57
Откуда: Ростов-на-Дону
ФИО: Виктор

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

Сообщение blindman » 20 ноя 2009, 15:47

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

Добавлено спустя 45 секунд:
В даташите есть формула, не 72, а именно 71
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение milkpower » 20 ноя 2009, 15:55

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

спасибо blindman

но вот про прерывания чет не пойму, почему они все-таки не нужны, попробую ДШ перевести.
Аватара пользователя
milkpower
 
Сообщения: 217
Зарегистрирован: 25 мар 2009, 13:57
Откуда: Ростов-на-Дону
ФИО: Виктор

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

Сообщение blindman » 20 ноя 2009, 15:57

Твое прерывание ничего не делает, кроме как перевзводит таймер и меняет состояние ноги - всё это таймер может делать сам, без участия программы
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

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

Сообщение milkpower » 20 ноя 2009, 16:03

а, ну так это пока тестовый вариант, в последствии в обработчике прерывания будет еще всяко-разное.
Аватара пользователя
milkpower
 
Сообщения: 217
Зарегистрирован: 25 мар 2009, 13:57
Откуда: Ростов-на-Дону
ФИО: Виктор

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

Сообщение Master » 20 ноя 2009, 16:39

Всякого разного в прерывании как раз меньше всего должно быть. Чем прерывание короче тем лучше.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

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

Сообщение ALHIMIK » 20 ноя 2009, 16:41

всякое разное можно повесить на флаги....
Аватара пользователя
ALHIMIK
 
Сообщения: 997
Зарегистрирован: 05 окт 2008, 14:41
Откуда: СПб
прог. языки: C,Python

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

Сообщение milkpower » 20 ноя 2009, 17:03

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

Добавлено спустя 17 минут 17 секунд:
все-таки вопрос открытый, как в порту выключить выставленный бит?
Аватара пользователя
milkpower
 
Сообщения: 217
Зарегистрирован: 25 мар 2009, 13:57
Откуда: Ростов-на-Дону
ФИО: Виктор

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

Сообщение avr123.nm.ru » 20 ноя 2009, 17:40

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

ПОРТ.БИТ = 0;

Манипулирование отдельными битами регистров есть и в даташитах на Си и АСМ и вот из курса для начинающих картинка
Вложения
avr123.nm.ru.png
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение milkpower » 20 ноя 2009, 22:43

это все я понимаю, но дело в том, что после сброса бита, он автоматически выставляется на следующей команде! вот что меня и ставит в тупик.
Аватара пользователя
milkpower
 
Сообщения: 217
Зарегистрирован: 25 мар 2009, 13:57
Откуда: Ростов-на-Дону
ФИО: Виктор

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

Сообщение avr123.nm.ru » 20 ноя 2009, 22:59

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

Лучше приложить проект целиком. Советую использовать PROTEUS.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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, и больше не отпускает
может еще надо какой регистр чистить, чтоб порт попустило?
Аватара пользователя
milkpower
 
Сообщения: 217
Зарегистрирован: 25 мар 2009, 13:57
Откуда: Ростов-на-Дону
ФИО: Виктор

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

Сообщение ALHIMIK » 20 ноя 2009, 23:35

Дык это см рис
Вложения
1234.JPG
Аватара пользователя
ALHIMIK
 
Сообщения: 997
Зарегистрирован: 05 окт 2008, 14:41
Откуда: СПб
прог. языки: C,Python

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

Сообщение Michael_K » 20 ноя 2009, 23:45

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

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

Основная ошибка вот в чем: если уж вы отдали ногу таймеру,
то рулить портом (через PORT) вы уже не сможете.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3