Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/35: Рейтинг темы: голосов - 35, средняя оценка - 4.69
worryor2031
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 79
1

atmega8535 таймер

09.02.2011, 16:35. Просмотров 6391. Ответов 9
Метки нет (Все метки)

Здравствуйте.

У меня всё то же устройство. Задача такая: на шине разные слова. Слова с моим адресом я обрабатываю, чужие - нет. При этом если временной интервал между словами больше 70 мс, то мне надо выдать ошибку.

Что я придумал: если слово с моим адресом, то запускаю 16-ти битный таймер.

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

Код
            ldi   temp,0b00001011      ;i?aaaaeeoaeu oaeia?a ia 64
out   TCCR1B,temp
clr   temp
out   TCCR1A,temp         ;CTC mode

cli
ldi   XL,low(8750)
ldi   XH,high(8750)

out   OCR1AH,XH
out   OCR1AL,XL
sei

ldi   temp,0b00000010      ;i?aaaaeeoaeu oaeia?a ia 32, normal mode
out   TCCR2,temp

ldi   temp,0b00000101
out   TCCR0,temp

ldi   temp,0x11
out   TIMSK,temp
Засовываю в регистр сравнения таймера значение "8750" и разрешаю прерывания по sompare match. А в сравнении адреса обнуляю таймер.

Т.е. мне представлялось, что контроллер должен действовать следующим образом: принялось первое "мое" слово, начал тикать таймер, если до следующего слова натикало до sompare match, то вылезает ошибка. Если нет, то нет.

Но по факту таймер начинает тикать с момента записи "8750" в регистр сравнения, поэтому, видимо, ошибка стала вылезать еще до того, как пришло первое "мое" слово.

Вот, собственно, что-то не придумывается, как это забороть.

на 8 МГц один такт равен 125 нс. Делим 70 мс на 125 нс - получаем 560000 тактов. Выбираем предделитель 64 - получаем 8750. Это если возникают какие-то вопросы почему именно это число.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2011, 16:35
Ответы с готовыми решениями:

АЦП, Atmega8535
Задача. Код программы: .include"m8535def.inc" .cseg .org$0 ldi r16,low(RAMEND) ldi...

USBasp на ATmega8535
Нет в наличии меги8 и меги48, зато есть горстка 8535. Посмотрел в датащите - 8535ая полностью по...

компаратор Atmega8535
Здравствуйте!Казалось бы простая такая штука компаратор,но при попытке настройки и симуляции в...

Atmega8535. Симулятор
Вообщем столкнулся с микроконтроллером ATmega8535 и нужно сэмулировать выполнение этого кода. Нашел...

ШИМ на Atmega8535
Доброго времени суток. MK Atmega8535. Необходимо калибровать яркость светодиода, подключенного к...

9
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
09.02.2011, 16:40 2
Таймер начинает тикать когда ты ему задаешь какой-то отличный от 0 предделитель частоты. По-этому его (предделитель) надо записывать только когда пришло твое слово.
0
DiVOuR
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 111
09.02.2011, 16:42 3
А что происходит с битами CS0..2 при записи в регистр сравнения?

И вообще, у тебя таймер тикать начинает "где-то" после второй строчки приведенного здесь кода.
0
worryor2031
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 79
09.02.2011, 17:16 4
Всем спасибо за ответы. Всё получилось. Возможно, возникнут еще вопросы. Пока тему не закрывайте, пожалуйста.
0
worryor2031
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 79
10.02.2011, 16:05 5
Снова возникли вопросы.

Ставлю предделитель таймера на "64". В студии видно, счетчик таймера инкрементируется каждые 64 тактовых импульса. Записываю в регистр сравнения число 10, следовательно каждый 11 импульс должно возникнуть прерывание, в котором я поставлю ножку в единицу, если там до этого был ноль и наоборот. Таким образом получу на ножке импульсы скважностью 2 и длительностью равной интервалу времени с которым возникают прерывания.

В студии все верно, прерывания возникают каждые 88 мкс. Подключаю частотомер, его показания - 720 мкс. Если поменять предделитель, то в соответствующее число раз вырастет или уменьшится длительность, индицируемая частотомером. На всякий случай посмотрел осциллографом - длительность примерно 720 мкс, показания совпадают с показаниями частотомера.

Напомню, частота кварца 8 Мгц.

Один такт, следовательно, 125 нс. 125*10^(-9)*64 = 8 мкс. 8 мкс *11 = 88 мкс
Если вдруг кому-то непонятно откуда 88 мкс и пр. цифры.
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
10.02.2011, 16:14 6
Симптомы очень похожи на CKDIV8, за исключением того, что в меге8535 этого фьюза нету. Но все-равно проверьте частоту кварца. И предделитель таймера...
0
worryor2031
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 79
10.02.2011, 16:24 7
Логично =)
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
10.02.2011, 16:28 8
А мк переключен на кварц? Или кварц просто рядом стоит, а мк от внутреннего генератора 1 МГц работает? :)
0
worryor2031
0 / 0 / 0
Регистрация: 26.01.2011
Сообщений: 79
10.02.2011, 16:44 9
Цитата Сообщение от xroymom
А мк переключен на кварц? Или кварц просто рядом стоит, а мк от внутреннего генератора 1 МГц работает? :)
Вот, точно. Я забыл, фьюзы-то когда прошивал я, вроде, не поменял :) Это косяк...
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
10.02.2011, 16:48 10
"Вы просто забыли его включить..." (с) :)
0
10.02.2011, 16:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2011, 16:48

Бегущий огонь на ATMega8535
задача на Микроконтроллере mega8535. (фото прикрепил) Фоновая программа реализует бегущий огонь...

ATMEGA8535. Проблемы с EEPROM
Помогите разобраться. Впервые, как пересел на си, использую EEPROM. Есть проект. Изначально...

AVR,ATmega8535, lm016l
Прошу помощи. Пишу на ассемблере AVR в протеусе 8.1 . Собрал схему ,подключил ЖКИ и делаю вроде...


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

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

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