// sem učitě půjde vložit definiční soubor mcu abys nemusel definovat registry a bity ručně jak to děláš níže... // kód potřebuje definice pro T2CON, TH2, TL2, RCAP2H, RCAP2L a TR2. Tak si je dopiš jesli ten definiční soubor nemáš. // Pro konkrétní mcu od sylabs a překladač keil to vypadalo takto: "#include " sbit IR_LED = P2^0; /* SFR for P1.0 - pin s diodou*/ #define LEN_PACKET 14 // pocet bitu paketu #define LEN_BURST 32 // delka burst (pocet vyslanych pulzu) #define LEN_PAUSE 32 // delka pauzy (pocet pulzu, kdy led nesviti) // počet tiků timeru na periodu 36kHz = 11.0529e6/36e3 = 307 // chyba nosné +0.065% // pokud by timer čítal 1/12 hodin, bylo by to 11.0592e6/(36e3 * 12) = 26 // -1.54% #define T2TICKS 307 #define T2REL (65536 - T2TICKS) #define T2CAPH ((unsigned char)(T2REL >> 8)) // autoreload hodnota #define T2CAPL ((unsigned char)(T2REL & 0xFF)) #define T2_30H ((unsigned char)((65536 - 184)) >> 8) // hodnota timeru po uplynuti 30% periody (60% zbyva do 0xFFFF, tedy 60% z T2TICKS) #define T2_30L ((unsigned char)((65536 - 184)) & 0xFF) void SendPacket(unsigned int p) { unsigned int packet = p; unsigned char i, j; IR_LED = 0; packet |= 0xF<<12; // nastaveni nejvyssich bitu (vcetne start bitů) na "1" packet <<= 16 - LEN_PACKET; // bity 15 a 14 vysunout RCAP2H = T2CAPH; // autoreload hodnota RCAP2L = T2CAPL; CP/RL2 = 0; // autoreload mode (tohle asi nepůjde přeložit, bit bude definován trochu jinak) TH2 = T2CAPH; TL2 = T2CAPL; // vysílání začne po prvním přetečení timeru, tak přednastavit abysme napoprvé nečekali než napočítá celých 16b TR2 = 1; // T2 start TF2 = 0; IR_LED = 0; //zhasnu for (i = 0; i < LEN_PACKET; i++){ //pro odeslani celeho paketu if (packet & (1 << 15)){ // osesílaný bit bude "1"; 32 x 27.7 = 889us (polovina odeslaneho bitu) for (j = 0; j < LEN_PAUSE; j++){ //32 puluzu pauza // dioda zhasnuta, jen cekam while(TF2 == 0); // pockat na preteceni TF2 = 0; // vynulovat priznak } for (j = 0; j < LEN_BURST; j++){ //32 puluzu burst 32 x 27.7 = 889us (2. polovina odeslaneho bitu) while(TF2 == 0); // pockat na preteceni TF2 = 0; // vynulovat priznak IR_LED = 1; // roznu while((TL2 < T2_30L) || (TH2 < T2_30H)); //pockat do 30% periody (oba registry větší než stanovaná mez) IR_LED = 0; // zhasnu } }else{ // osesílaný bit bude "0" for (j = 0; j < LEN_BURST; j++){ //32 puluzu burst while(TF2 == 0); // pockat na preteceni TF2 = 0; // vynulovat priznak IR_LED = 1; // roznu while((TL2 < T2_30L) || (TH2 < T2_30H)); //pockat do 30% periody IR_LED = 0; // zhasnu } for (j = 0; j < LEN_PAUSE; j++){ //32 puluzu pauza while(TF2 == 0); // pockat na preteceni TF2 = 0; // vynulovat priznak } } IR_LED = 0; // dioda zhasnuta, ale pro jistotu packet <<= 1; //posun na dalsi bit } TR2 = 0; // T2 stop } /*******************************************************************************/ /*******************************************************************************/ void main(){ unsigned int paket = 513; // adresa SAT1 a kod pro key1 SendPacket(paket); while(1){ } }