/***************************************************** CodeWizardAVR V2.03.4 Standard Project : NEC,JVC,Samsung IR Coder Version : debug Date : 27.05.2009 Author : Goodefine Comments: Только для эмуляции ИК-образных протоколов в Протеусе (НЕ ОПТИМИЗИРОВАННО) (для отладки декодера). Посылки разные, в зависимости от того, однократное нажатие, или удержание - как в реале... ПРИСОЕДИНЯТЬ К ПРИЕМНИКУ ЧЕРЕЗ ИНВЕРТОР Chip type : ATmega16 Program type : Application Clock frequency : 4,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include #include //--------------------ТУТ ВЫБИРАЕМ СИСТЕМУ КОДИРОВАНИЯ---------------------// //#define NEC_SYSTEM /*Генерация обычного nec сигнала*/ #define SAMS_SYSTEM /*Вариация на тему Самсунга*/ //#define JVC_SYSTEM /*Урезанный nec, как его понимает JVC*/ //=========================================================================// //---------------------------ТУТ ЗАДАЕМ ЛАПЫ-------------------------------// #define BUTTON_TEST PINA.1 #define OUT_PIN PORTA.0 #define OUT_LEVEL PINA.0 //=========================================================================// //---ТУТ ЗАДАЕМ АДРЕС И КОМАНДУ, КОТОРАЯ ОТПРАВЛЯЕТСЯ ПО НАЖАТИЮ КНОПКИ----// unsigned long adress =27; //0b10111000; unsigned long command=36; //0b01100110; //=========================================================================// //----------Все переменные глобальные, чтоб видны были в симуляторе-------// unsigned long inv_adress; unsigned long inv_command; unsigned char fl_start_ir; unsigned char fl_start_fire; unsigned char fl_start_code; unsigned char fl_repeate; unsigned char fl_transmit_ir; unsigned char fl_stop; unsigned char sct_rep; unsigned long code; #ifndef JVC_SYSTEM unsigned long maska=0x80000000; #else unsigned long maska=0x8000; #endif unsigned char i; //=====================================================================================// //-----------------Обработчик переполнения таймера-------------------------------------// interrupt [TIM0_OVF] void timer0_ovf_isr(void) { #ifndef JVC_SYSTEM if(fl_start_ir) { fl_transmit_ir=1; fl_start_fire=1; fl_start_ir=0; i=1; OUT_PIN=1; } if(fl_repeate) { if(sct_rep==220){OUT_PIN=1;} if(sct_rep==238){OUT_PIN=0;} if(sct_rep==242){OUT_PIN=1;} if(sct_rep==243) { i=0;OUT_PIN=0; if(BUTTON_TEST) { fl_repeate=0; TCCR0=0x00; fl_transmit_ir=0; sct_rep=0; }else sct_rep=42; } } if(fl_stop) { OUT_PIN=0; #ifdef NEC_SYSTEM if(!BUTTON_TEST){fl_repeate=1;}else{sct_rep=0; fl_transmit_ir=0;TCCR0=0;} #endif #ifdef SAMS_SYSTEM TCCR0=0x00; fl_transmit_ir=0; #endif i=0; fl_stop=0; } if(fl_start_code) { if(!OUT_LEVEL) { if(code&maska) { if(i==2) { OUT_PIN=1;maska>>=1;i=0; }else i++; } else { OUT_PIN=1;maska>>=1; } if(maska==0){maska=0x80000000;fl_start_code=0;fl_stop=1;} }else {OUT_PIN=0;} } if(fl_start_fire) { i++; if(i==18){OUT_PIN=0;} if(i==26){i=0;fl_start_fire=0;OUT_PIN=1;fl_start_code=1;} } sct_rep++; #else //------------------------------------------------------------------------------- if(fl_start_ir) { fl_transmit_ir=1; fl_start_fire=1; fl_start_ir=0; i=1; OUT_PIN=1; } if(fl_stop) { OUT_PIN=0; if(!BUTTON_TEST){fl_repeate=1;}else{sct_rep=0; fl_transmit_ir=0;TCCR0=0;} i=0; fl_stop=0; } if(fl_start_code) { if(!OUT_LEVEL) { if(code&maska) { if(i==2) { OUT_PIN=1;maska>>=1;i=0; }else i++; }else { OUT_PIN=1;maska>>=1; } if(maska==0){maska=0x8000;fl_start_code=0;fl_stop=1;} }else {OUT_PIN=0;} } if(fl_repeate) { if(sct_rep==100) { i=0; if(BUTTON_TEST) { fl_repeate=0; TCCR0=0x00; fl_transmit_ir=0; sct_rep=0; OUT_PIN=0; }else {sct_rep=0;OUT_PIN=1;} fl_start_code=1; } } if(fl_start_fire) { i++; if(i==18){OUT_PIN=0;} if(i==26){i=0;fl_start_fire=0;OUT_PIN=1;fl_start_code=1;} } sct_rep++; #endif } //====================================================================================// void main(void) { PORTA=0x06; DDRA=0x01; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 500,000 kHz // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x02; TCNT0=0x00; OCR0=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x01; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; inv_adress=(~adress)&0xff; inv_command=(~command)&0xff; #ifndef JVC_SYSTEM code=(adress<<24)|(inv_adress<<16)|(command<<8)|inv_command; #else code=(adress<<8)|command; #endif // Global enable interrupts #asm("sei") for (;;) {#asm("wdr") if(!fl_transmit_ir) { if(!BUTTON_TEST){fl_start_ir=1;TCCR0=0x02;} } delay_ms(100); } }