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

 
 
> Проблема с Т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
 
Start new topic
Ответов
KRS
сообщение Mar 14 2008, 12:20
Сообщение #2


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(aai_m @ Mar 14 2008, 13:02) *
Применяем вот такую функцию :
void WriteOCR3A( unsigned int i )
{
unsigned char sreg;
CLI();
sreg = SREG;
OCR3A = i;
SREG = sreg;
SEI();
}

а зачем сохранять sreg?
обычно всетки функция выгдядит так
Код
void WriteOCR3A( unsigned int i )
{
unsigned char sreg;
sreg = SREG;
CLI();
OCR3A = i;
SREG = sreg;
}


или под IAR это делается так
Код
unsigned char oldState;
oldState = __save_interrupt();
__disable_interrupt();
/* Critical section goes here */
__restore_interrupt(oldState);


Кроме того, если вы используете чтение/запись 16 разрядных регистров только в основном коде или только в прерывании можно не запрещать прерывания, потому что между записью/чтением первого байта и второго может пройти неограниченное время ( гглавное что бы не вклинилась другая операция доступа к 16 разрядному регистру этого же таймера)
Go to the top of the page
 
+Quote Post



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

 


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


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