Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы

Atmega162 Timer1 и Timer3 работаю по разному

Непрочитано 27.06.2014, 13:32  
qweentet
Частый гость
 
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
qweentet на пути к лучшему
По умолчанию 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.
qweentet вне форума  
Непрочитано 27.06.2014, 19:08  
niXto
Почётный гражданин KAZUS.RUN
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

Сообщение от qweentet Посмотреть сообщение
Одинаково инициализирую 16-ти битные таймеры в Atmega162
Инициализируешь неодинаково
niXto вне форума  
Непрочитано 27.06.2014, 20:34  
qweentet
Частый гость
 
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
qweentet на пути к лучшему
По умолчанию 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.
qweentet вне форума  
Непрочитано 28.06.2014, 00:38  
vynt
Почётный гражданин KAZUS.RUN
 
Аватар для vynt
 
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
vynt на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

У разных таймеров могут быть разные значения (регистров) для делителя на одну и туже частоту. И инфа на будущее, у разных камней они опять же могут отличаться (можете столкнуться при очередной переделки проекта). Внимательно перечитайте Datasheet, и уберите #asm("sei") из функций инициализации. Инициализация каждого в отдельности прерывания, должна производится при отключенном глобальном разрешении всех прерываний. Иначе значения регистров могут отличаться от желаемого...
должно быть примерно так:
PHP код:
void main(void)
{
 //запрет всех прерываний "cli"
 //инициализация прерывания 1
 //инициализация прерывания 2
 //инициализация прерывания n
 //разрешение всех прерываний "sei"
 while(1) //бесконечный цикл
 {
   //сброс вачдога
   //вызов каких то процедур (не длительных)
 }
} 

Последний раз редактировалось vynt; 28.06.2014 в 01:11.
vynt вне форума  
Непрочитано 28.06.2014, 11:22  
SPKostenko
Частый гость
 
Регистрация: 08.08.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
SPKostenko на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

Как Вы определили, что Т3 срабатывает в 2-раза чаще?
SPKostenko вне форума  
Непрочитано 28.06.2014, 11:29  
qweentet
Частый гость
 
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
qweentet на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

Сообщение от vynt Посмотреть сообщение
У разных таймеров могут быть разные значения (регистров) для делителя на одну и туже частоту. И инфа на будущее, у разных камней они опять же могут отличаться (можете столкнуться при очередной переделки проекта). Внимательно перечитайте Datasheet, и уберите #asm("sei") из функций инициализации. Инициализация каждого в отдельности прерывания, должна производится при отключенном глобальном разрешении всех прерываний. Иначе значения регистров могут отличаться от желаемого...
должно быть примерно так:
PHP код:
void main(void)
{
 //запрет всех прерываний "cli"
 //инициализация прерывания 1
 //инициализация прерывания 2
 //инициализация прерывания n
 //разрешение всех прерываний "sei"
 while(1) //бесконечный цикл
 {
   //сброс вачдога
   //вызов каких то процедур (не длительных)
 }
} 
По поводу #asm("cli"\"sei") сделал по вашим рекомендациям
По поводу CSXX, я в первую очередб проверил это по DS:
Миниатюры:
Нажмите на изображение для увеличения
Название: Presc.jpg
Просмотров: 58
Размер:	125.5 Кб
ID:	66402  
qweentet вне форума  
Непрочитано 28.06.2014, 11:45  
qweentet
Частый гость
 
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
qweentet на пути к лучшему
По умолчанию 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;   
};
Миниатюры:
Нажмите на изображение для увеличения
Название: otladka.jpg
Просмотров: 76
Размер:	216.6 Кб
ID:	66403  
qweentet вне форума  
Непрочитано 28.06.2014, 11:58  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

Опять выводы через протез? Только реальный камень даст реальный результат, остальное - выводы через ...опу.
Не ходите по граблям, хоть там и тропинка.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 28.06.2014, 12:02  
qweentet
Частый гость
 
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
qweentet на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

Сообщение от akegor Посмотреть сообщение
Опять выводы через протез? Только реальный камень даст реальный результат, остальное - выводы через ...опу.
Не ходите по граблям, хоть там и тропинка.
Ок, закажу реальный камень...
qweentet вне форума  
Непрочитано 28.06.2014, 19:48  
kosmos440o
Заблокирован
 
Регистрация: 23.09.2007
Сообщений: 761
Сказал спасибо: 84
Сказали Спасибо 352 раз(а) в 151 сообщении(ях)
kosmos440o на пути к лучшему
По умолчанию Re: Atmega162 Timer1 и Timer3 работаю по разному

Может ещё прерывания занимают слишком много времени, и тогда то, у которого приоритет меньше, будет гаситься.
kosmos440o вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 12:53.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.