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

 
 
> Прерывание переполнения MEGA8535
karavaev
сообщение Oct 10 2005, 14:49
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 10-10-05
Пользователь №: 9 465



Уважаемые знатоки !
Разрешите задать ламерский вопрос. Мне надо генерить прерывание переполнения 8-битного таймера 0 на ATmega8535. Использую пару WinAVR( версия 20030913)+VMLab 3.11 текст такой:

SIGNAL(SIG_OVERFLOW0) {
TCNT0=56;

PORTB=!PORTB;
}

int main(void) {
cli();

DDRB=0xFF;
PORTB=0x00;

DDRC=0xFF;
PORTC=0xAA;

TCNT0=56;
TIMSK=0x01; // Разрешено только прерывание переполнения
TCCR0=0x02; // Делитель системного такта на 8

sei();

while(1);

}

Модифицировал Fuses: CKSEL=0x0F CKOPT=0, чтобы 16 МГц кварц можно было поставить (пока тестирую с 6МГц)

В VMLab видно, что прерывание ни разу не вызывается, более того, как только таймер переполняется, в регистре TIFR устанавливается в 1 бит №1 (Output compare) вместо бита №0 (Переполнение) и в таком состоянии TIFR остается вечно, после зашивки в MEGA8535, естественно, железка PB0 не меняет.
Если в проекте ".PRJ" заменить контроллер .MICRO "ATmega8535" на .MICRO "AT90S8535" программа требуемые действия выполняет, прерывание с требуемой частотой генерится и после зашивки в 90S8535 устройство работает корректно.

Я раньше с MEGA-ми дела не имел, подозреваю, что дело в каких-то их особенностях.
Подскажите, пожалуйста, в чем может быть дело.

С уважением, Анатолий
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
BlackJack
сообщение Oct 10 2005, 15:03
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 6-10-05
Пользователь №: 9 276



Пиши вот в таком духе, легче будет разбираться.
Это для меги88, но сути не меняет. работает.
А дергать ногой лучче так PORTx^=1<<PxX

void InitTimerDriver(void)

{//Настройка таймеров и счетчиков--------------------------

// счет по переполнению (1 мс)

TCCR0B=(1<<CS00)|(1<<CS01);// prescaler 64==172.8kHz
TCNT0=RELOAD_T0_VALUE; //=255-173
TIMSK0|=(1<<TOIE0);//|(1<<TOIE1) ;
// разрешить прерывания по переполнению
TIFR0|=(1<<TOV0);
//сбросим флаг, который мог появиться от маленьких зелененьких человечков
};

/*обработчик прерываний таймера*/
#pragma vector=TIMER0_OVF_vect
__interrupt void timer_interrupt(void)
{

// Вызов функции для обработки очереди таймеров
TimersHandler();
TCNT0=RELOAD_T0_VALUE;// 1мс ReloadTimer();

}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:13
Рейтинг@Mail.ru


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