Podle mne by to mělo fungovat takto, ale nezkoušel jsem to v reálu.
[code]//osc. = 8 MHz
#include <mega8.h>
#include <delay.h>
#define LED1 PORTC.5 // LED na porte C5 a C4
#define LED2 PORTC.4
#define SIGNAL PIND.2 // riadiaci signál z prijímača - vstup
volatile unsigned char Servo;
volatile unsigned char off;
//--------------------------------------------------------------------
interrupt [EXT_INT0] void ext_int0_isr(void) // Externé prerušenie 0
{
if (SIGNAL) // L-H interrupt
TCNT0 = 0; // vynulovanie časovača 0
else // H-L interrupt
Servo = TCNT0; // Servo = hodnota časovača (délka kladného pulsu)
}
//--------------------------------------------------------------------
// Timer0 přeteče za 32 ms (musí být delší než perioda signálu)
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
off = 1;
}
//=====================================================================
void main(void)
{
PORTC = 0x00; // PC0 az PC5 = výstup
DDRC = 0b00111111;
TIMSK = 0x01; // povolenie prerušenia Timer0 overflow
TCCR0 = 5; // start timer0, presc 1024
GICR = (1<<6); // External Interrupt0 enable
MCUCR = (1<<2); // INT0 Mode: Any change
//test HW
PORTC = 255; //LED ON
delay_ms(100);
PORTC = 0; //LED OFF
//koniec testu
#asm("sei")
while (1) // nekonečná slučka
{
if(off) // no signal
{
off = 0;
LED2 = 1;
}
else
{
if(Servo > 12) {LED1=1;} // puls > 1.5 ms
else {LED1=0;} // puls < 1.5 ms
LED2 = 0;
}
}
}[/code]