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

 
 
> Проблема с Т3 в ATMEGA128, Прошу помощи
aai_m
сообщение Mar 14 2008, 10:02
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 29-11-05
Из: Донецк
Пользователь №: 11 548



Подобная тема поднималась уважаемым klen 16.11.2007 http://electronix.ru/forum/index.php?showt...%E0%E9%F2%E0%ED . К сожалению, проблема решена не была. Вернее уважаемый klen в частном случае решил, но сослася на потусторонние силы - "ШАЙТАН - БАЙРАМ" .
Суть проблемы - по ходу работы программы необходимо останавливать и вновь запускать таймер Т3 и менять содержимое регистров OCR3A/OCR3B/TCNT3. Первичная инициализация Т3 проходит успешно:
void timer3_init(void)
{
TCCR3B = 0x00; //stop
TCNT3H = 0xC1; //setup
TCNT3L = 0x81;
OCR3AH = 0x07;
OCR3AL = 0xCF;
OCR3BH = 0x07;
OCR3BL = 0xCF;
OCR3CH = 0x07;
OCR3CL = 0xCF;
ICR3H = 0x07;
ICR3L = 0xCF;
TCCR3A = 0x00;
TCCR3B = 0x09; //start Timer
}
Далее открываем фирменное описание на ATMEGA128 на странице 114 и читаем:
"The TCNTn, OCRnA/B/C, and ICRn are 16-bit registers that can be accessed by the AVR CPU via the 8-bit data bus. The 16-bit register must be byte accessed using two read or write operations. Each 16-bit timer has a single 8-bit register for temporary storing of the high byte of the 16-bit access. ".

Спасибо, что предупредили. Более того на странице 116 описания написано:
"The following code examples show how to do an atomic write of the TCNTn Register contents. Writing any of the OCRnA/B/C or ICRn Registers can be done by using the same principle."
И дается пример кода:
TIM16_WriteTCNTn:
; Save global interrupt flag
in r18,SREG
; Disable interrupts
cli
; Set TCNTn to r17:r16
out TCNTnH,r17
out TCNTnL,r16
; Restore global interrupt flag
out SREG,r18
ret
НО ЭТОТ КОД НИКОГДА РАБОТАТЬ НЕ БУДЕТ!
Потому что, на странице 365 того же описания с изумлением читаем:
($89) TCNT3H Timer/Counter3 – Counter Register High Byte
($88) TCNT3L Timer/Counter3 – Counter Register Low Byte
($87) OCR3AH Timer/Counter3 – Output Compare Register A High Byte и т. д.
Т. е. out TCNTnH,r17 в принципе не возможно(как к регистру ввода-вывода, т.к. такой регистр в регистровом файле отсутствует), а должно быть, по крайней мере, sts TCNTnH,R17 (как к адресному пространству памяти данных).
Применяем вот такую функцию :
void WriteOCR3A( unsigned int i )
{
unsigned char sreg;
CLI();
sreg = SREG;
OCR3A = i;
SREG = sreg;
SEI();
}
Но таймер Т3 правильно не настраивается. Причем есть действительно чертовчина. Например:
TCCR3B = 0x00; //stop
WriteTCNT3(Mem_TCNT);
WriteOCR3A(Mem_D_Period);
TCCR3B = 0x09; //start - не работает,

TCCR3B = 0x00; //stop
WriteTCNT3(Mem_TCNT);
WriteOCR3С(Mem_D_Period);
TCCR3B = 0x09; //start - не работает.
В симуляторе AVRStudio(Version 4.14 Beta 2) все работает без проблем.
Прошу помощи советом, ссылками для решения этой проблемы. Заранее благодарен.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:00
Рейтинг@Mail.ru


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