Witam,
Chciałem zrobić opóźnienia w programie dla Atmega8. Wykorzystałem przerwania, ale przy symulacji programu w AVR Studio okazuje się że program po około 260 mikro sekundach resetuje się(wraca do funkcji main() ). Nie jet to spowodowane raczej watchdogiem bo jest on wyłączony. Czy ktoś potrafi mi powiedzieć dlaczego tak się dzieje? Aha, oczywiście skompilowany program nie działa poprawnie także na "fizycznym" procesorze.
Program:
Chciałem zrobić opóźnienia w programie dla Atmega8. Wykorzystałem przerwania, ale przy symulacji programu w AVR Studio okazuje się że program po około 260 mikro sekundach resetuje się(wraca do funkcji main() ). Nie jet to spowodowane raczej watchdogiem bo jest on wyłączony. Czy ktoś potrafi mi powiedzieć dlaczego tak się dzieje? Aha, oczywiście skompilowany program nie działa poprawnie także na "fizycznym" procesorze.
Program:
#include <inttypes.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//----------------------------------------------
uint8_t podtryb;
volatile uint16_t time;
//-------------------------------------------
void opoznienie8ms(uint16_t t);
void podlacz_koncowke_pwm(void); //podłącza odłącza końcówkę OC0A do PORTU
void odlacz_koncowke_pwm(void); //odłącza końcówkę OC0A od PORTU
//--------------------------------------------
void opoznienie8ms(uint16_t t)
{
time = t;
for(;time != 0;)
{
PORTD |= 1<<7; //Po kilku przebiegach pętli for następuje reset (skok do funkcji main() ) !!!!!!!!!!!!!!!!!
PORTD &= ~(1<<7);
}
}
void podlacz_koncowke_pwm()
{
TCCR1A |= 1<<COM1A1;
}
void odlacz_koncowke_pwm()
{
TCCR1A &= ~(1<<COM1A1) & ~(1<<COM1A0);
}
int main (void)
{
//Konfiguracja portów
DDRB = 0b00000110;
DDRD = 0b11100000;
//Konfiguracja PWMa
TCCR1A |= 1<<WGM10;// FastPWM 8BIT
TCCR1B |= 1<<WGM12;
TCCR1B |= 1<<CS11; //Divide 8
TIMSK |= 1<<OCIE1A;
OCR1A = 120;
//Konfiguracja przerwania przepełnienia licznika
TCCR0 |= 1<<CS02; // divide 256
TIMSK |= 1<<TOIE0; // odblokowanie przerwania przepełnienia
sei(); //Globalne odblokowanie przerwań
//=============== PROGRAM WŁAŚCIWY =====================
for(;;)
{
PORTB &= ~(1<<2);
podlacz_koncowke_pwm();
opoznienie8ms(100);
odlacz_koncowke_pwm();
PORTB &= ~(1<<1);
PORTB |= 1<<2;
opoznienie8ms(100);
}
return 0;
}
//Przerwanie występujące co około 8,1ms; jest to przerwanie generujące opóźnienia
SIGNAL(SIG_OVERFLOW0)
{
if(time != 0) --time;
}