#include <18F458.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)


#define LCD_POWER  PIN_D7
#define	oszc_frek 		20000000


//#include "flex_lcd.c"
#include <stdlib.h>


int16	PPM_ms_05;			//a fél ms-nak megfelelő lépésszám
int32	PPM_ms_kitoltes;	//a fél ms után következő jel (0.5-1.5 ms)
int32	PPM_szinkr;			//a PPM jel végére maradt szinkron idő
int32	PPM_keret_ido;		//20ms, TMR1-hez
int16	PPM_ms_osztva;		//segedvaltozó, hogy ne kelljen annyiszor osztani
boolean cont;				//folytatva lett-e egy hosszabb jelkiadás (ha nem fort bele a timer1 16bitjébe)


byte	PPM[9];				//0-250 ig, 255 = kikapcsolva, a 9. a sync
boolean PPM_aktiv[9];		//be van-e kapcsolva az adott csatorna
int1	impulzus;			//hogy éppen 0,5 ms-os jelet adunk-e ki
byte	PPM_akt_csatorna;	//hogy épp melyik csatorna jelét adjuk ki a tömbből


//a Timer1-gyel mérjük, hogy milyen legyen a PPM jel, működési freki 1/4vel inkremetálódik

#INT_TIMER1
void ppm_timer() {
   
	if (cont)	//ha a timer-be nem fért volna bele a szinkron impulzus hossza
	{
		if (0xFFFF < PPM_szinkr)	//ha még mindig nem fér bele
			{
				cont = true;
				set_timer1(0);
				PPM_szinkr -= 0xFFFF;  
			}
		else
		{
			set_timer1(0xFFFF - PPM_szinkr);
			PPM_szinkr = PPM_keret_ido;
			cont = false;
			
		}
	}

	else {
		if (impulzus == 1) //ha eddig 0,5-ös jelet adtunk ki
		{	
			impulzus = 0;
			output_low(PIN_C5);
			

			if (PPM_aktiv[PPM_akt_csatorna])
			{
				PPM_ms_kitoltes = _mul(PPM[PPM_akt_csatorna],PPM_ms_osztva) + PPM_ms_05; 
	
				if (PPM_akt_csatorna == 8) //ha az utolsó (szinkron) jelnél járunk
				{
					PPM_akt_csatorna = 0;
					if (0xFFFF < PPM_szinkr)
					{
						cont = true;
						set_timer1(0);
						PPM_szinkr -= 0xFFFF;  
					}
		
					else
					{
						set_timer1(0xFFFF - PPM_szinkr);
						PPM_szinkr = PPM_keret_ido;
					}
				}
				else {
					while (!PPM_aktiv[PPM_akt_csatorna++]) ;
					PPM_szinkr -= PPM_ms_kitoltes;
					set_timer1(0xFFFF - PPM_ms_kitoltes);
				}

			}

		}
		else {
			impulzus = 1;
			
			
			while (!PPM_aktiv[PPM_akt_csatorna])	PPM_akt_csatorna++; //a következő aktív csatornára áll

		
			output_high(PIN_C5);

			PPM_szinkr -= PPM_ms_05;
			set_timer1(0xFFFF - PPM_ms_05);
		
			
		}
	}
	
}




void main() { 
	


	PPM[0] = 249;
	PPM[1] = 122;
	PPM[2] = 122;
	PPM[3] = 122;
	//PPM[4] = 255;
	PPM[5] = 200;	
	//PPM[6] = 255;
	//PPM[7] = 255;
	PPM[8] = 249; //csak a szinkron miatt

	PPM_aktiv[0] = 1;
	PPM_aktiv[1] = 1;
	PPM_aktiv[2] = 1;
	PPM_aktiv[3] = 0;
	PPM_aktiv[4] = 0;
	PPM_aktiv[5] = 0;
	PPM_aktiv[6] = 0;
	PPM_aktiv[7] = 0;
	PPM_aktiv[8] = 1;

	PPM_akt_csatorna = 0;
	//PPM_ms_05 =  (oszc_frek / 8000); 		//timer1hez: (oszcfrekv/4)/1000/2
	PPM_ms_05 = (oszc_frek / 8000);	
	PPM_ms_osztva = PPM_ms_05 / 125;	//mivel 250 kül jelszintet különböztetek meg (ezt változtatni kellett, hogy egész számra jöjjön ki a pontosság miatt)
	PPM_keret_ido = _mul(PPM_ms_05,40);	//20ms a TMR1hez
	PPM_szinkr = PPM_keret_ido;

	impulzus = 0;

	setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
	enable_interrupts(INT_TIMER1);
    enable_interrupts(GLOBAL);	
	
	

	while (true)
	{
		;
	}

}
