AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
27.06.2014, 13:32
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Atmega162 Timer1 и Timer3 работают по разному
Одинаково инициализирую 16-ти битные таймеры в Atmega162, но, почему-то Timer3 срабатывает в-2ва раза чаще, смотрел доку, прескаллеры вроди бы одинаково настраиваются...
Где я мог накосячить?
Код:
|
interrupt[TIM1_COMPA] void TIM1_COMPA_INT(void){
//CCNET_WAIT_FOR_PACK=0;
PORTB|=0x1‹‹0;
PORTB&=~(0x1‹‹0);
return;
};
interrupt[TIM3_COMPA] void TIM3_COMPA_INT(void){
//ID003_WAIT_FOR_PACK=0;
PORTB|=0x1‹‹1;
PORTB&=~(0x1‹‹1);
return;
};
void TIM1_Init(void){
TCCR1B|=(1‹‹CS10)|(1‹‹CS11); //Устанавливаем предделитель 64
TCCR1B|=(1‹‹WGM12);
#asm("sei");
}
void TIM3_Init(void){
TCCR3B|=(1‹‹CS30)|(1‹‹CS31); //Устанавливаем предделитель 64
TCCR3B&=~(1‹‹CS32); //Устанавливаем предделитель 64
TCCR3B|=(1‹‹WGM32);
#asm("sei");
}
//Установка часов
void TIM1_Set(unsigned short ms){
unsigned short OCRCalc;
OCRCalc=ms*125;
OCR1AH = (unsigned char)(OCRCalc››8);
OCR1AL = (unsigned char)(OCRCalc);
TCNT1H = 0;
TCNT1L = 0;
TIMSK|=(1‹‹OCIE1A); //Включить прерывание при совпадение на компараторе A
};
//Установка часов
void TIM3_Set(unsigned short ms){
unsigned short OCRCalc;
OCRCalc=ms*125;
OCR3AH = (unsigned char)(OCRCalc››8);
OCR3AL = (unsigned char)(OCRCalc);
TCNT3H = 0;
TCNT3L = 0;
ETIMSK|=(1‹‹OCIE3A); //Включить прерывание при совпадение на компараторе A
};
void TIM1_Reset(void){
TCNT1H = 0;
TCNT1L = 0;
};
void TIM3_Reset(void){
TCNT3H = 0;
TCNT3L = 0;
}; |
Последний раз редактировалось qweentet; 27.06.2014 в 17:03.
|
|
|
|
27.06.2014, 19:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от qweentet
|
Одинаково инициализирую 16-ти битные таймеры в Atmega162
|
Инициализируешь неодинаково
|
|
|
|
27.06.2014, 20:34
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от niXto
|
Инициализируешь неодинаково
|
void TIM3_Init(void){
TCCR3B|=(1‹‹CS30)|(1‹‹CS31); //Устанавливаем предделитель 64
TCCR3B&=~(1‹‹CS32); //Устанавливаем предделитель 64
TCCR3B|=(1‹‹WGM32);
#asm("sei");
}
Если Вы имеете ввиду то что выше, то ето контрольный в голову, который я дописал, после обнаружения проблемы. По документу:
------------------------
CS10(CS30) - 1
CS11(CS31) - 1
CS12(CS32) - 0
-------------------------
предделитель 64.
Или Вы о чем-то другом?
Последний раз редактировалось qweentet; 27.06.2014 в 20:37.
|
|
|
|
28.06.2014, 00:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
У разных таймеров могут быть разные значения (регистров) для делителя на одну и туже частоту. И инфа на будущее, у разных камней они опять же могут отличаться (можете столкнуться при очередной переделки проекта). Внимательно перечитайте Datasheet, и уберите #asm("sei") из функций инициализации. Инициализация каждого в отдельности прерывания, должна производится при отключенном глобальном разрешении всех прерываний. Иначе значения регистров могут отличаться от желаемого...
должно быть примерно так:
PHP код:
|
void main(void) { //запрет всех прерываний "cli" //инициализация прерывания 1 //инициализация прерывания 2 //инициализация прерывания n //разрешение всех прерываний "sei" while(1) //бесконечный цикл { //сброс вачдога //вызов каких то процедур (не длительных) } }
|
Последний раз редактировалось vynt; 28.06.2014 в 01:11.
|
|
|
|
28.06.2014, 11:22
|
|
Частый гость
Регистрация: 08.08.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Как Вы определили, что Т3 срабатывает в 2-раза чаще?
|
|
|
|
28.06.2014, 11:29
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от vynt
|
У разных таймеров могут быть разные значения (регистров) для делителя на одну и туже частоту. И инфа на будущее, у разных камней они опять же могут отличаться (можете столкнуться при очередной переделки проекта). Внимательно перечитайте Datasheet, и уберите #asm("sei") из функций инициализации. Инициализация каждого в отдельности прерывания, должна производится при отключенном глобальном разрешении всех прерываний. Иначе значения регистров могут отличаться от желаемого...
должно быть примерно так:
PHP код:
|
void main(void)
{
//запрет всех прерываний "cli"
//инициализация прерывания 1
//инициализация прерывания 2
//инициализация прерывания n
//разрешение всех прерываний "sei"
while(1) //бесконечный цикл
{
//сброс вачдога
//вызов каких то процедур (не длительных)
}
}
|
|
По поводу #asm("cli"\"sei") сделал по вашим рекомендациям
По поводу CSXX, я в первую очередб проверил это по DS:
|
|
|
|
28.06.2014, 11:45
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от SPKostenko
|
Как Вы определили, что Т3 срабатывает в 2-раза чаще?
|
Код:
|
interrupt[TIM1_COMPA] void TIM1_COMPA_INT(void){
//CCNET_WAIT_FOR_PACK=0;
PORTB|=0x1‹‹0;
PORTB&=~(0x1‹‹0);
return;
};
interrupt[TIM3_COMPA] void TIM3_COMPA_INT(void){
//ID003_WAIT_FOR_PACK=0;
PORTB|=0x1‹‹1;
PORTB&=~(0x1‹‹1);
return;
}; |
|
|
|
|
28.06.2014, 11:58
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,856
Сказал спасибо: 2,532
Сказали Спасибо 11,771 раз(а) в 5,896 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Опять выводы через протез? Только реальный камень даст реальный результат, остальное - выводы через ...опу.
Не ходите по граблям, хоть там и тропинка.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
28.06.2014, 12:02
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от akegor
|
Опять выводы через протез? Только реальный камень даст реальный результат, остальное - выводы через ...опу.
Не ходите по граблям, хоть там и тропинка.
|
Ок, закажу реальный камень...
|
|
|
|
28.06.2014, 19:48
|
|
Заблокирован
Регистрация: 23.09.2007
Сообщений: 761
Сказал спасибо: 84
Сказали Спасибо 352 раз(а) в 151 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Может ещё прерывания занимают слишком много времени, и тогда то, у которого приоритет меньше, будет гаситься.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:41.
|
|