Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: регистр TCNT3 в атмеге162
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Станис
начнем с того что так получилось что регистра TCNT3 нет в атмеге162??
если все делать таким вариантом:

unsigned int TCNT3;
TCNT3 = (TCNT3H<<8) + TCNT3L;
то почемуто получается что Т3 вообще 8битник.. Где шайтан зарыт???
Vetal-Soft
1. Есть. В пространстве ОЗУ, TCNT3H - 0x89, TCNT3L - 0x88
2.
CODE
unsigned int blabla;
TCNT3H = blabla << 8;
TCNT3L = blabla;
Станис
Цитата(Vetal-Soft @ Apr 15 2010, 14:19) *
1. Есть. В пространстве ОЗУ, TCNT3H - 0x89, TCNT3L - 0x88
2.
CODE
unsigned int blabla;
TCNT3H = blabla << 8;
TCNT3L = blabla;


TCNT3H и TCNT3L я от туда и считываю но получаю 8битное число.. хотя таймер 16битный...
SSerge
Для начала нужно прочитать раздел "Accessing 16-bit Registers" из даташита, в разделе посвященном описанию таймеров "16-bit Timer/Counter (Timer/Counter 1 and Timer/Counter3 )".
Там написано в каком порядке нужно читать/писать эти регистры.
Приличный компилятор делает это сам, например для IAR просто описан 16-разрядный регистр TCNT3 и с ним можно работать именно как с 16-битной переменной не задумываясь о порядке доступа к младшей/старшей части.
Станис
Цитата(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
mempfis_
Цитата(Станис @ 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
Станис
Цитата(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..
Станис
Вообщем надо было лишь в mega162.h добавить строку:
#define TCNT3 (*(unsigned char *) 0x88) // 16 bit access

адрес по TCNT3L
mempfis_
Цитата
В ДШ вообще не указан адрес этого регистра

Адрес вам указали:
Код
1. Есть. В пространстве ОЗУ, TCNT3H - 0x89, TCNT3L - 0x88


Цитата
и компилятор кодвижн вообще не хочет компилировать.. мотивируя тем что я вообще ему написал какуюто лажу TCNT3..

А хидер правильный подключён?
Напишите свою функцию и читайте через указатель:
Код
unsigned int tcntL=0, tcntH=0;
tcntL =  (unsigned int) *( (unsigned char*) 0x88);
tcntH = (unsigned int) *( (unsigned char*) 0x89);
demiurg_spb
Ошибочка у Вас тут:
Цитата(Станис @ Apr 16 2010, 09:33) *
#define TCNT3 (*(unsigned char *) 0x88) // 16 bit access

Вы наверное хотите этого...
Код
#define TCNT3 (*(unsigned short*) 0x88)
defunct
Цитата(Станис @ Apr 15 2010, 08:56) *
Где шайтан зарыт???

В IAR и в WinAVR никаких проблем с TCNT3 нет.
Просто пишете x = TCNT3; без всякого шайтанства.

Наверно с CV работаете? Вот в нем шайтан и зарыт.
Может пора снести этот шайтан-CV, и начать пользоваться нормальными инструментами?
Станис
Цитата(demiurg_spb @ Apr 18 2010, 16:16) *
Ошибочка у Вас тут:

Вы наверное хотите этого...
Код
#define TCNT3 (*(unsigned short*) 0x88)


ну да ошибся.. Я думаю лучше будет (*(unsigned int *) .. short тут никчему



Цитата(defunct @ Apr 19 2010, 05:34) *
В IAR и в WinAVR никаких проблем с TCNT3 нет.
Просто пишете x = TCNT3; без всякого шайтанства.

Наверно с CV работаете? Вот в нем шайтан и зарыт.
Может пора снести этот шайтан-CV, и начать пользоваться нормальными инструментами?


Когда начал осваивать МК первое что попалось на глаза CVAVR, в принципе пока меня устраивает ну и изучаю я мк всего еще 3 месяца..
demiurg_spb
Цитата(Станис @ Apr 19 2010, 07:12) *
ну да ошибся.. Я думаю лучше будет (*(unsigned int *) .. short тут никчему
Это абсолютно безразлично для Вашего конкретного случая.

Цитата(Станис @ Apr 19 2010, 07:12) *
Когда начал осваивать МК первое что попалось на глаза CVAVR, в принципе пока меня устраивает ну и изучаю я мк всего еще 3 месяца..
Побаловались и хватит. Переходите на что-нибудь серьёзное (gcc, iar). И чем раньше, тем лучше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.