kyrogaz
Mar 21 2006, 18:05
Помогите начинающему. Изучаю прерывания и таймеры. Простая "программа-мигалка" - ничерта не работает, помогите найти ошибку, сто раз проверил - все должно работать...
Микроконтроллер ATmega8, тактовая частота 7.3728Mhz, использую 16-битный TIMER_COUNTER_1, светодиод прицеплен к PD5, IDE - CodeVisionAVR
#include <mega8.h>
unsigned char ctr = 1;
void timer1_init(void)
{
TCCR1B = 0x00; //stop timer1
TCNT1H = 0x0;
TCNT1L = 0x0;
TCCR1B = 0x05; //частота переключения Ft/1024=7200; 7200/2^16=0.10986; 1/0.10986=9.1cek
TIMSK = 0x04; // TOIE1=0x4 ДЛЯ ATmega8
}
//согласно даташиту 9-е прерывание TIMER1_OVF
interrupt [0x9] void timer0_ovf(void)
{
if (ctr) {
PORTD=0xFF;
ctr=0x0;
}
else {
PORTD=0x00;
ctr=0x1;
}
TCNT1H = 0x0;
TCNT1L = 0x0;
}
void main (void)
{
DDRD = 0xff;
PORTD = 0x0;
timer1_init();
while(1);
}
Спасибо
В CV компилятор можно не указывать адрес прерывания при следующей конструкции
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{....}
поробуйте так.Насколько я помню,у CV есть такая собственная фича,сам напарывался,у него адреса
векторов прерывания в его"представлении"то-ли на 1 меньше(помоему),то-ли больше,чем в АВРоских
шитах.Ну и по общему стилю-много лишнего и "некрасивого",но работать должно.
kyrogaz
Mar 21 2006, 19:01
Цитата
В CV компилятор можно не указывать адрес прерывания при следующей конструкции
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{....}
Перепробовал - не помогает. Со схемотехникой все правильно - когда меняю в
main начальную установку PORTD (PORTD = 0xFF) - светодиод постоянно светится.
Согласно файлу
mega8.h, TIM1_OVF равно 9, но пробовал 8 и 0xA. Также менял установки таймера:
TCNT1H = 0x80; TCNT1L = 0x0;...Хоть с бубном танцуй
А может кроме
TIMSK = 0x04 еще какое разрешение нужно поставить? Или раскидать
#asm("wdr") по программе?
а фьюзы правильно выставлены на работу от внешнего кварца?
Ljubitel
Mar 21 2006, 19:19
А где глобальное разрешение прерываний ?
в CV это
#asm ("sei")
kyrogaz
Mar 21 2006, 19:20
Сначала набросал программку-мигалку с функцией delay_ms - все работало, а фьюзы вообще не трогал...
Гм:
CKSEL0=1, CKSEL1-CKSEL3=0
По даташиту это вроде Calibrated Internal RC Oscillator??? Получается, работаю от внутреннего осциллятора?
Ок, уменьшаю период переключения, ставлю TCNT1H = 0xF0; TCNT1L = 0x0;
Без результата
kyrogaz
Mar 21 2006, 19:31
#asm ("sei")
Помогло!!! Спасибо!!!
Судя по морганию тактовая частота все-таки от внутреннего осциллятора
eXeC001er
Mar 21 2006, 20:21
Это не судя по частоте мигания, это судя по даташиту внутренний RC работает.
Там написано что камень поставляется с прошитыми фузами на работу от внутреннего RC.
#asm ("sei") - сильная весчь! Решает все проблемы.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.