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

 
 
> Не получается записать в регистр TCNT0 таймера, Atmega8515
esr
сообщение May 24 2015, 07:59
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 13-03-09
Из: Москва
Пользователь №: 46 073



Приветствую! Хочу сформировать интервал времени по таймеру
В даташите Atmega8515 написано, что можно напрямую работать с регистром TCNT0 таймера

Делаю побитную инверсию этого регистра

com TCNT0

Получаю ошибку компиляции

test_1.asm(158): error: Invalid register

т.е. как я понимаю, мой проект в AVR не понимает имя этого регистра

При этом на определение PORTB компилятор не ругается
out PORTB,temp_inv
и на включение/ выключение таймера тоже не ругается
clr temp_timer
out TCCR0,temp_timer

Описание в начале программы есть:

.include "8515def.inc"


Что не так ? 05.gif

Сообщение отредактировал esr - May 24 2015, 08:00
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mcheb
сообщение May 24 2015, 08:11
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(esr @ May 24 2015, 11:59) *
Приветствую! Хочу сформировать интервал времени по таймеру
В даташите Atmega8515 написано, что можно напрямую работать с регистром TCNT0 таймера

Делаю побитную инверсию этого регистра

com TCNT0




Что не так ? 05.gif

А с какими регистрами может работать команда com ? Может быть, в этом причина?
Go to the top of the page
 
+Quote Post
esr
сообщение May 24 2015, 16:38
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 13-03-09
Из: Москва
Пользователь №: 46 073



Цитата(mcheb @ May 24 2015, 12:11) *
А с какими регистрами может работать команда com ? Может быть, в этом причина?

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

; Инвертируем регистр таймера TCNT0 через считывание - инверсию -обратную запись с помощью промежуточного регистра

clr temp_inv
in temp_inv,TCNT0 ; Переписываем из регистра (счётчика) таймера в промежуточный регист
com temp_inv ; Инвертируем побитно в промежуточном регистре
out TCNT0,temp_inv ; Записываем обратно в таймер инвертированное значения

Ну и потом запускаю заново таймер и дальше идёт программа.

Оказывается этот регистр (счётчик) TCNT0 не регистр вовсе, а порт получается ? Потому что с ним команда in прошла, которая для портов ввода-вывода действует ?
А это в документации и не отражено нигде вроде бы ....

Цитата(Xenia @ May 24 2015, 12:41) *
А зачем вы это делаете? Если вы работаете с таймером 0 по прерыванию (переполнение), то в TCNT0 надо константу записывать, а не инверсию ему делать.

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

Сообщение отредактировал esr - May 24 2015, 16:39
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 8th August 2025 - 21:58
Рейтинг@Mail.ru


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