Witam, Poszukuję osoby znającej się troszkę na programowaniu układów z serii PIC. Mam do wykonania adapter który odczytywał by i nadawał za pomocą interface'u podczerwieni a sterowany byłby lokalnego sterownika(PLC) poprzez port RS232. Nadawanie i odbieranie musi odbywać się w standardzie Manchester. (czyli jak w domowych pilotach). Niestety urządzenie którym chcę sterować nie nadaje w standardzie kodowania RC5 - miałbym gotowe rozwiązanie (AVT 519 i AVT5104). Potrzebuje tak zmienić poniższy listing aby nadajnik nadawał dokładnie to co zostanie mu wysłane przez port RS232 (9600,8,,1,). To samo tyczy się odbiornika musi dekodować system Manchester i dokładnie to co odbierze wysyłać do portu RS232 (9600,8,,1,). Za pomocą prostego odbiornika podczerwieni i programu Girder odebrałem kody wysyłane przez oryginalny nadajnik urządzenia. To jest jedna z nich 3C31F3333F860619 (wszystkie instrukcje zaczynają się na 3C31).
List. 1. Procedury służące do wystania dowolnego kodu w systemie RC5 // wysyła logiczne zero f=36kHz kwarc 20MHz // stan_0() {int i; led_ir=0; //wylacz diode for(i=32;i>0;i-) //powtorz 32 razy {led_ir=1; delay_us(13); //stan wysoki 13us delay_cycles(4); //+800ns=13,8us led_ir=0; delay_us(13); //stan niski 13us delay_cycles(1); //+200ns=13,2us+3cykle=13,8us } //13,2+(3*200)=13,8us delay_us(875); //875+13=888us } // wysyla logiczna jedynke f=36kHz kwarc 20MHz // stan_1() {int i; led_ir=0; delay_us(888); for(i=32;i>0;i-) //powtorz 32 razy {led_ir=1; //zapal diode delay_us(13); //czekaj 13us delay_cycles(4); //+800ns=13,8us led_ir=0; //zgas diode delay_us(13); //stan niski 13us+3cykle przez licznik delay_cycles(1); //+200ns+600ns=13,8us } //razem 2 *13 , 8 = 27 , 6us = 36 , 2khz } // Wysyla podana sekwencje w rc5 // // toggle=1 // // address 0-31 // RC5_send(int address, int command) { int ii; address | =0b11100000; command<<=2; for (ii = 0;ii< = 7;ii + +) //wysyla address + 2bity startu = 1, { //+ togglebit=1 address<< = 1; //przesunw lewo o j eden if(bit_test(status,0)) stan_1(); //jesli c=1 to stan_1() else stan_0(); //jesli 0 to stan_0() } for (ii = 0;ii< = 5;ii + +) //wysyla 5bitow command { command<<=1 ; //przesunw lewo o jeden if(bit_test(status,0)) stan_1(); //jesli c=1 to stan_1() else stan_0(); //jesli 0 to stan_0() } }
Jeżeli może ktoś pomóc proszę o kontakt.