Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите, где есть примеры для ATmega162
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Vladimir_T
С учетом рекомендаций и литературы от ATMEL, заменил 8515 на 162. Переопределил необходимую периферию и биты конфигурации (есть различия между ними), но Timer0 не запускается! Посмотрите, в чем есть ошибка. Сделал простую тестовую программку, а она не запускается. Может есть где-нибуть есть сайт с исходниками тестовых программ, как это есть у Texas Instrumens для MSP?

#define START_SYSTEM_TIMER() (TCCR0 |= (1 << CS01); TIMSK |= (1 << TOIE0))

//------------------------------------------------------------------------------
int main()
{
GICR = 1 << IVCE;
GICR = 1 << IVSEL;
// GICR |= (1 << INT1);
// MCUCR |= (1 << SE); // enable sleep mode

EECR |= (1 << EEMWE);
EECR |= (1 << EERIE);

DDRD |= 0x30;

START_SYSTEM_TIMER();

__enable_interrupt ();

for(;;)
{
PORTD ^= 0x20; // For test control from free pins

}


}

#pragma vector = TIMER0_OVF_vect
__interrupt void System_Timer(void)

{

PORTD ^= 0x10; // For test control from free pins

} // System_Timer
at90
Нужно записать занчение интервала таймера в регистр TCNT0 при инициализации. И в прерывании по переполнению его нужно постоянно усанавливать.

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{

TCNT0=0x10;<----------------------
// Place your code here

}
vmax
Цитата(Vladimir_T @ Nov 21 2006, 06:59) *
С учетом рекомендаций и литературы от ATMEL, заменил 8515 на 162. Переопределил необходимую периферию и биты конфигурации (есть различия между ними), но Timer0 не запускается! Посмотрите, в чем есть ошибка. Сделал простую тестовую программку, а она не запускается. Может есть где-нибуть есть сайт с исходниками тестовых программ, как это есть у Texas Instrumens для MSP?

#define START_SYSTEM_TIMER() (TCCR0 |= (1 << CS01); TIMSK |= (1 << TOIE0))

//------------------------------------------------------------------------------
int main()
{
GICR = 1 << IVCE;
GICR = 1 << IVSEL;
// GICR |= (1 << INT1);
// MCUCR |= (1 << SE); // enable sleep mode

EECR |= (1 << EEMWE);
EECR |= (1 << EERIE);

DDRD |= 0x30;

START_SYSTEM_TIMER();

__enable_interrupt ();

for(;;)
{
PORTD ^= 0x20; // For test control from free pins

}


}

#pragma vector = TIMER0_OVF_vect
__interrupt void System_Timer(void)

{

PORTD ^= 0x10; // For test control from free pins

} // System_Timer


В АТМЕГА162 для ТС0 появилась возможность использовать не только прерывание по переполнению (ТО), но и по совпадению (ОС). ИМХО, это более правильный метод. Вот, например, как это работает у меня:

//инициализация ТС0:
TCCR0 = (1<<WGM01) | (1<<CS00) | (1<<CS02); //prescaler=1024
OCR0 = 78; //100 Hz @ 8MHz
TIMSK |= (1<<OCIE0);

//обработчик прерывания ТС0
#pragma vector=TIMER0_COMP_vect
__interrupt void TC0_comp()
{
//обработка прерывания
}
Vladimir_T
Никак не хочет запускаться таймер ни по одному из предложенных вариантов. Может нужно еще запускать внешний кварц 8МГц спец. командой? Приведите, пожалуйста пример инициализации системы тактирования системы, но вроде я все учел.
defunct
Цитата(Vladimir_T @ Nov 21 2006, 16:47) *
Никак не хочет запускаться таймер ни по одному из предложенных вариантов. Может нужно еще запускать внешний кварц 8МГц спец. командой? Приведите, пожалуйста пример инициализации системы тактирования системы, но вроде я все учел.

Fuse M161C уберите.

пример в ответе #3 - рабочий, сам также инициализирую:

TIMSK |= (1 << OCIE0);
OCR0 = 0x55; // <-- число при достижении которого будет сгенерировано прерывание + сброс таймера
TCCR0 = (1 << WGM01) | 5; // запуск таймера

Никаких исключений для T0 M162 относительно других таймеров нет.



Цитата
Нужно записать занчение интервала таймера в регистр TCNT0 при инициализации. И в прерывании по переполнению его нужно постоянно усанавливать.

Ой? Зачем это?
zorromen
Извеняйте..а ты работаешь с Jtagом? Просто ты работал 8515 и может нема жтага. Если есть то с его помощью в студии прекрасно можно програмить фьюзы...что особо приятно трудно перепутать где запрограмировано а где нет...........
defunct
Цитата
GICR = 1 << IVCE;
GICR = 1 << IVSEL;

Вы бутлоадер пишете?
В простой тестовой программке перенос таблицы векторов в область бутлоадера смотрится весьма странно. Для начала не трогайте GICR.
Vladimir_T
Программируется процессор с помощью AS2M, по SPI.
JTAGa на плате нет, о чем сожалею.
В 8515 была задействована область BOOT секции. Для 162 это, действительно не актуально стало, не буду переносить вектора прерываний.
Vladimir_T
Спасибо, г-н defunct, действительно FUSE M161C установлен по умолчанию и убрать его у меня нет возможности, тогда меня устраивает 162-ой в режиме совметимости со 161-м.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.