/****************************************************************************/ /* */ /* Project : Decodierung des Fernsteuersignals */ /* Author : Otmar Schmid */ /* Homepage: http://oschmid.home.solnet.ch */ /* Licence : GNU General Public License (GPL) */ /* Tools : Keil C V3.2 */ /* */ /* Module : RCDECOD.C */ /* HW : CPU 87C751 mit 12MHz Quarz */ /* Purpose : Decodierung des Fernsteuersignals */ /* P00: Puls Eingang */ /* 1. Puls 2ms -> Synchronisations Puls (> 1.75ms) */ /* 20ms Pause */ /* 2. und weitere (max 8) Pulse */ /* P10, P11 : Ausgänge für Puls 1 */ /* P12, P13 : Ausgänge für Puls 2 */ /* P14, P15 : Ausgänge für Puls 3 */ /* P16, P17 : Ausgänge für Puls 4 */ /* P30, P31 : Ausgänge für Puls 5 */ /* P32, P33 : Ausgänge für Puls 6 */ /* P34, P35 : Ausgänge für Puls 7 */ /* P36, P37 : Ausgänge für Puls 8 (in HW nicht ausgeführt) */ /* | | */ /* | +--- low für Puls < 1.125ms */ /* +-------- low für Puls > 1.375ms */ /* 20ms Pause */ /* P01: Configirations Eingang */ /* P01 == 0 -> keine Wirkung, Init 2 * Blink */ /* P01 == 1 -> keine Wirkung, Init 1 * Blink */ /* P02: LED Ausgang */ /* low für Synchronisations Puls */ /* high für Daten Puls */ /* */ /* History : */ /* 18.08.98 - Start 'RCDECOD2' ausgehend von 'RCDECOD' */ /* 27.03.99 - Version 1.1 */ /* - Ausgang P10, P12 pegelabhängig */ /* Ausgang P11, P13 - P35 flankenabhängig */ /* */ /****************************************************************************/ /* Register für 87C751 */ /* BYTE Register */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P3 = 0xB0; /* BIT Register P0 */ sbit P02 = 0x82; /* Sync LED */ sbit P01 = 0x81; /* Configirations Eingang */ sbit P00 = 0x80; /* Puls Eingang */ /* BIT Register P1 */ sbit P17 = 0x97; /* Digitale Ausg„nge */ sbit P16 = 0x96; sbit P15 = 0x95; sbit P14 = 0x94; sbit P13 = 0x93; sbit P12 = 0x92; sbit P11 = 0x91; sbit P10 = 0x90; /* BIT Register P3 */ sbit P37 = 0xB7; /* Digitale Ausg„nge */ sbit P36 = 0xB6; sbit P35 = 0xB5; sbit P34 = 0xB4; sbit P33 = 0xB3; sbit P32 = 0xB2; sbit P31 = 0xB1; sbit P30 = 0xB0; /*--------------------------------------------------------------------------*/ typedef enum {e_stop, e_zurueck, e_vor} Tzust; unsigned char index; /* index fr Servoausgang (0 .. 7) */ unsigned char p11cnt; /* alter Zustand fr Port xx */ unsigned char p13cnt; unsigned char p14cnt; unsigned char p15cnt; unsigned char p16cnt; unsigned char p17cnt; unsigned char p30cnt; unsigned char p31cnt; unsigned char p32cnt; unsigned char p33cnt; unsigned char p34cnt; unsigned char p35cnt; /*--------------------------------------------------------------------------*/ void delay(unsigned int del) { unsigned int n; n = del; while(n > 0) { n--; } /* while */ } /* delay */ /*--------------------------------------------------------------------------*/ void init() { unsigned int k; P1 = 0xFF; P3 = 0xFF; P02 = 0; /* LED ein */ index = 10; /* warten auf Sync Puls dann wird index auf 0 gesetzt */ p11cnt = 0; p13cnt = 0; p14cnt = 0; p15cnt = 0; p16cnt = 0; p17cnt = 0; p30cnt = 0; p31cnt = 0; p32cnt = 0; p33cnt = 0; p34cnt = 0; p35cnt = 0; delay(4000); if (P01 == 0) { P02 = 1; /* LED aus */ delay(8000); P02 = 0; /* LED ein */ delay(4000); } /* if */ P02 = 1; /* LED aus */ } /* init */ /*--------------------------------------------------------------------------*/ unsigned int puls_lesen() { unsigned int cnt; cnt = 0; /* positive Flanke erkennen */ while(P00 == 0) { /* warten bis pos. Flanke */ } /* while */ /* z„hlen bis negative Flanke kommt */ while(P00 == 1) { cnt++; } /* while */ return cnt; } /* puls_lesen */ /*--------------------------------------------------------------------------*/ void ausgabe_Bits(unsigned int num, Tzust zust) { switch(num) { case 0 : switch(zust) { case e_stop : P10 = 1; /* Port ausschalten */ p11cnt = 0; break; case e_zurueck : if (p11cnt == 1) { if (P11 == 0) P11 = 1; /* Port ausschalten */ else P11 = 0; /* Port einschalten */ } /* if */ if (p11cnt > 100) { p11cnt = 100; } /* if */ p11cnt++; break; case e_vor : P10 = 0; /* Port einschalten */ break; } /* switch */ break; case 1 : switch(zust) { case e_stop : P12 = 1; /* Port ausschalten */ p13cnt = 0; break; case e_zurueck : if (p13cnt == 1) { if (P13 == 0) P13 = 1; /* Port ausschalten */ else P13 = 0; /* Port einschalten */ } /* if */ if (p13cnt > 100) { p13cnt = 100; } /* if */ p13cnt++; break; case e_vor : P12 = 0; /* Port einschalten */ break; } /* switch */ break; case 2 : switch(zust) { case e_stop : p14cnt = 0; p15cnt = 0; break; case e_zurueck : if (p15cnt == 1) { if (P15 == 0) P15 = 1; /* Port ausschalten */ else P15 = 0; /* Port einschalten */ } /* if */ if (p15cnt > 100) { p15cnt = 100; } /* if */ p15cnt++; break; case e_vor : if (p14cnt == 1) { if (P14 == 0) P14 = 1; /* Port ausschalten */ else P14 = 0; /* Port einschalten */ } /* if */ if (p14cnt > 100) { p14cnt = 100; } /* if */ p14cnt++; break; } /* switch */ break; case 3 : switch(zust) { case e_stop : p16cnt = 0; p17cnt = 0; break; case e_zurueck : if (p17cnt == 1) { if (P17 == 0) P17 = 1; /* Port ausschalten */ else P17 = 0; /* Port einschalten */ } /* if */ if (p17cnt > 100) { p17cnt = 100; } /* if */ p17cnt++; break; case e_vor : if (p16cnt == 1) { if (P16 == 0) P16 = 1; /* Port ausschalten */ else P16 = 0; /* Port einschalten */ } /* if */ if (p16cnt > 100) { p16cnt = 100; } /* if */ p16cnt++; break; } /* switch */ break; case 4 : switch(zust) { case e_stop : p30cnt = 0; p31cnt = 0; break; case e_zurueck : if (p31cnt == 1) { if (P31 == 0) P31 = 1; /* Port ausschalten */ else P31 = 0; /* Port einschalten */ } /* if */ if (p31cnt > 100) { p31cnt = 100; } /* if */ p31cnt++; break; case e_vor : if (p30cnt == 1) { if (P30 == 0) P30 = 1; /* Port ausschalten */ else P30 = 0; /* Port einschalten */ } /* if */ if (p30cnt > 100) { p30cnt = 100; } /* if */ p30cnt++; break; } /* switch */ break; case 5 : switch(zust) { case e_stop : p32cnt = 0; p33cnt = 0; break; case e_zurueck : if (p33cnt == 1) { if (P33 == 0) P33 = 1; /* Port ausschalten */ else P33 = 0; /* Port einschalten */ } /* if */ if (p33cnt > 100) { p33cnt = 100; } /* if */ p33cnt++; break; case e_vor : if (p32cnt == 1) { if (P32 == 0) P32 = 1; /* Port ausschalten */ else P32 = 0; /* Port einschalten */ } /* if */ if (p32cnt > 100) { p32cnt = 100; } /* if */ p32cnt++; break; } /* switch */ break; case 6 : switch(zust) { case e_stop : p34cnt = 0; p35cnt = 0; break; case e_zurueck : if (p35cnt == 1) { if (P35 == 0) P35 = 1; /* Port ausschalten */ else P35 = 0; /* Port einschalten */ } /* if */ if (p35cnt > 100) { p35cnt = 100; } /* if */ p35cnt++; break; case e_vor : if (p34cnt == 1) { if (P34 == 0) P34 = 1; /* Port ausschalten */ else P34 = 0; /* Port einschalten */ } /* if */ if (p34cnt > 100) { p34cnt = 100; } /* if */ p34cnt++; break; } /* switch */ break; case 7 : switch(zust) { case e_stop : P36 = 1; /* Port ausschalten */ P37 = 1; /* Port ausschalten */ break; case e_zurueck : P36 = 1; P37 = 0; break; case e_vor : P37 = 1; P36 = 0; break; } /* switch */ break; } /* switch */ } /* ausgabe_Bits */ /*--------------------------------------------------------------------------*/ void ausgabeDigital(unsigned int dauer) { /* dauer = 113 -> 1 ms -> 113 Inc/ms */ /* dauer = 137 -> 1.125 ms */ /* dauer = 150 -> 1.25 ms -> 120 Inc/ms */ /* dauer = 162 -> 1.375 ms */ /* dauer = 186 -> 1.5 ms -> 124 Inc/ms */ /* dauer = 224 -> 1.75 ms -> 128 Inc/ms */ /* Input Impuls 1.0ms .. 1.25ms (Schwelle bei 1.125ms) */ /* Input Impuls 1.25ms .. 1.5ms (Schwelle bei 1.375ms) */ if (dauer < 137) { ausgabe_Bits(index, e_vor); } else { if (dauer > 162) { ausgabe_Bits(index, e_zurueck); } else { ausgabe_Bits(index, e_stop); } /* if */ } /* if */ } /* ausgabeDigital */ /*--------------------------------------------------------------------------*/ void synchronisieren(unsigned int dauer) { /* Synchronisations Impuls > 1.75ms */ if (dauer > 224) { P02 = 0; /* LED ein */ index = 0; } else { P02 = 1; /* LED aus */ if (index < 8) { ausgabeDigital(dauer); } /* if */ index++; } /* if */ } /* synchronisieren */ /*--------------------------------------------------------------------------*/ void main() { unsigned int dauer; init(); while(1) { dauer = puls_lesen(); synchronisieren(dauer); } /* while */ } /* main */