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

 
 
> регистр TCNT3 в атмеге162, где он????
Станис
сообщение Apr 15 2010, 05:41
Сообщение #1


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

Группа: Участник
Сообщений: 128
Регистрация: 12-11-09
Из: Perm
Пользователь №: 53 565



начнем с того что так получилось что регистра TCNT3 нет в атмеге162??
если все делать таким вариантом:

unsigned int TCNT3;
TCNT3 = (TCNT3H<<8) + TCNT3L;
то почемуто получается что Т3 вообще 8битник.. Где шайтан зарыт???
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SSerge
сообщение Apr 15 2010, 10:00
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Для начала нужно прочитать раздел "Accessing 16-bit Registers" из даташита, в разделе посвященном описанию таймеров "16-bit Timer/Counter (Timer/Counter 1 and Timer/Counter3 )".
Там написано в каком порядке нужно читать/писать эти регистры.
Приличный компилятор делает это сам, например для IAR просто описан 16-разрядный регистр TCNT3 и с ним можно работать именно как с 16-битной переменной не задумываясь о порядке доступа к младшей/старшей части.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Станис
сообщение Apr 15 2010, 11:33
Сообщение #3


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

Группа: Участник
Сообщений: 128
Регистрация: 12-11-09
Из: Perm
Пользователь №: 53 565



Цитата(SSerge @ Apr 15 2010, 16:15) *
Для начала нужно прочитать раздел "Accessing 16-bit Registers" из даташита, в разделе посвященном описанию таймеров "16-bit Timer/Counter (Timer/Counter 1 and Timer/Counter3 )".
Там написано в каком порядке нужно читать/писать эти регистры.
Приличный компилятор делает это сам, например для IAR просто описан 16-разрядный регистр TCNT3 и с ним можно работать именно как с 16-битной переменной не задумываясь о порядке доступа к младшей/старшей части.

при всем том что написано в разделе "Accessing 16-bit Registers" С регистром TCNT1 можно работать как обычной 16битной переменной.. а вот регистра TCNT3 вообще нет.. даже в ДШ. кто найдет напишите адрес biggrin.gif

Ну даладно вопрос решен по другому. Был использован регистр TCNT1 на множество процессов.. только вот код вышел раз в 20 больше... biggrin.gif
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Apr 15 2010, 12:37
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Станис @ Apr 15 2010, 14:48) *
при всем том что написано в разделе "Accessing 16-bit Registers" С регистром TCNT1 можно работать как обычной 16битной переменной.. а вот регистра TCNT3 вообще нет.. даже в ДШ. кто найдет напишите адрес biggrin.gif

Ну даладно вопрос решен по другому. Был использован регистр TCNT1 на множество процессов.. только вот код вышел раз в 20 больше... biggrin.gif


Не понятно что у вас не получается....
В документации всё предельно ясно написано с примерами кода:

Код
Assembly Code Examples(1)
...
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
C Code Examples(1)
unsigned int i;
...
/* Set TCNTn to 0x01FF */
TCNTn = 0x1FF;
/* Read TCNTn into i */
i = TCNTn;


Если пишете на С то вообще не понятно к чему эта возня с адресами, разделениями на H/L и т.п.
TCNT3 = 0x1234; //запись
или
unsigned int tcnt3_val = TCNT3; //чтение

На ассемблере просто соблюдайте порядок:
при записи TCNT3H/TCNT3L
при чтении TCNT3L/TCNT3H
Go to the top of the page
 
+Quote Post
Станис
сообщение Apr 16 2010, 02:57
Сообщение #5


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

Группа: Участник
Сообщений: 128
Регистрация: 12-11-09
Из: Perm
Пользователь №: 53 565



Цитата(mempfis_ @ Apr 15 2010, 18:52) *
Не понятно что у вас не получается....
В документации всё предельно ясно написано с примерами кода:

Код
Assembly Code Examples(1)
...
; Set TCNTn to 0x01FF
ldi r17,0x01
ldi r16,0xFF
out TCNTnH,r17
out TCNTnL,r16
; Read TCNTn into r17:r16
in r16,TCNTnL
in r17,TCNTnH
...
C Code Examples(1)
unsigned int i;
...
/* Set TCNTn to 0x01FF */
TCNTn = 0x1FF;
/* Read TCNTn into i */
i = TCNTn;


Если пишете на С то вообще не понятно к чему эта возня с адресами, разделениями на H/L и т.п.
TCNT3 = 0x1234; //запись
или
unsigned int tcnt3_val = TCNT3; //чтение

На ассемблере просто соблюдайте порядок:
при записи TCNT3H/TCNT3L
при чтении TCNT3L/TCNT3H



В ДШ вообще не указан адрес этого регистра и компилятор кодвижн вообще не хочет компилировать.. мотивируя тем что я вообще ему написал какуюто лажу TCNT3..
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:35
Рейтинг@Mail.ru


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