Цитата(starter48 @ Dec 5 2005, 01:33)

Цитата(KiCom @ Dec 4 2005, 21:02)

Сегодня на доосуге проводил опыт, была составлена простейшая программа с помощью APPBuilder вот ее код:
...
Потом она была просимулирована на симуляторе VML все мигало как надо потом это было прошито на МК, в МК я прошил фьюзы на использоваие внутренего кварца с частотой 4 МГЦ но вместо положеных 16 МГЦ мигания светодиода я получил 30 миганий за 25 секунд, тоесть примерно 0.8 Гц, потом я прошил фьзы МК на использование встроенного кварца с цастотой 8Мгц получил частоту 1.8 гц. Где я мог допустить косяк допустил косяк?
Вообще я в этом деле новичок может допустил какуето глупую ошибку, подскажите если не трудно
1) На частоте кварца 1МГц мигать должно с частотой 2Гц, т.к. прерывание вызывается с частотой 4Гц, а в нём ты инвертируешь состояние выхода - получается дополнительный делитель на 2.
2) 30 вспышек за 25 сек = 1.2Hz
Сейчас на всякий случай зашью твою прогу в железо и проверю что она выдаёт.
Под рукой не оказалось 2313, проверил на меге64. Программу адаптировал для компилятора iar320D.
Мигает с частотой 16Гц. Контроллер работает на внутреннем генераторе 8МГц. Т.е. на 1МГц будет мигать с частотой 2Гц.
Так что программа рабочая. Вполне возможно, что твой компилятор ICC не добавляет пустой цикл в конце main(), тогда solidreg прав. Компилятор IAR это сам добавляет
for(;;) __sleep(); в конце main(), если программист этого не сделал.
Код
static void port_init(void)
{
PORTB = 0x80;
DDRB = 0xFF;//all pins to OUTPUT
PORTD = 0x00;
DDRD = 0xFF;
}
//TIMER0 initialize - prescale:1024
// desired value: 4Hz
// actual value: 4,002Hz (0,1%)
static void timer0_init(void)
{
TCNT0 = 0x0C; //set count
TCCR0 = 0x07; //start timer (change value to 5 for 90S2313)
}
#pragma vector=TIMER0_OVF_vect
__interrupt void timer0_ovf_isr(void)
{
PORTB_Bit7 ^= 1;//complement bit7
TCNT0 = 0x0C; //reload counter value
}
//call this routine to initialize all peripherals
static void init_devices(void)
{
//stop errant interrupts until set up
port_init();
timer0_init();
TIMSK = 1<<TOIE0;
__enable_interrupt(); //enable interrupts
//all peripherals are now initialized
}
//
void main(void)
{
init_devices();
for(;;) {
MCUCR |= (1<<SE);
__sleep();
}
}