Od pewnego czasu próbuje się uporać z programem jak poniżej. Zasadniczo program składa się z dwóch części generatora 36kHz na Timer0 i z PWM na Timer1. Osobno programy działają w 100 procentach. Jednak po złączeniu jak poniżej generator 36kHz jest nie aktywny natomiast PWM działa. Próbowałem różnych sztuczek, i nic ... Gdzie popełniam błąd. Podejrzewam że coś z przerwaniami jest sknocone. Programowaniem AVR-ów zajmuję się od nie dawna, może popełniam jakiś żłobkowy błąd.
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char Licz_50 ;
SIGNAL(SIG_OVERFLOW0)
{
TCNT0 = 163 ; //f=36kHz
Licz_50++ ;
if(Licz_50 < 50)
{
PORTB = PORTB ^ (1 << PB0);
}
else if((Licz_50 >= 50) && (Licz_50 < 100))
{
PORTB = 0x00 ;
}
else if(Licz_50 >= 100)
{
Licz_50 = 0 ;
}
}
int main(void)
{
Licz_50 = 0 ;
DDRD = 0x40 ;
PORTD = 0xA0 ;
DDRB = 0x01;
TCCR0 = 0x01; //Prescale = clk / 1
DDRB = (1 << PB2) ; //PB2 = output
TCCR1A = (1 << WGM10) | (1 << WGM11) | (1 << COM1B0) | (1 << COM1B1); //Tryb 15
TCCR1B = (1 << WGM12) | (1 << WGM13) | (1 << CS10) | (1 << CS11) ;
OCR1AH = 0x0A ;
OCR1AL = 0x40 ; //rozdzielczość 21ms
OCR1BH = 0x09 ;
OCR1BL = 0xC3 ; //wypelnienie 20ms - '0'; 1ms - '1'
TCNT0 = 163;
sei();
while(1)
{
}
return 0 ;
}