Solicitud urgente: Microcontrolador de control remoto por infrarrojos, diagrama de circuito de recepción y transmisión y diseño de programa. El programa está escrito preferiblemente en lenguaje C.
//Creador de aplicaciones ICC-AVR: 12/05/2010 PM 5:48:11
// Objetivo: M8
// Cristal: 8.0000 Mhz
#include
#include
#include
#include
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define xtal 8 p>
#define select_a_low (PORTD &=~(1<<7))
#define select_b_hi (PORTD |=(1<<4))
#define select_b_low (PORTD &=~(1<<4))
#define in_result (PINC )
#define ráster (PINB y 0x08)
#define ir (PIND & 0x04)
#define pluse_hi (PORTB |=(1<<1))
#define pluse_low (PORTB &=~(1<<1))
#define presionar (PINB & 0x01)
extern int _textmode;
uchar key_code=0;
uchar new_code=0;
uint buf_key_code=0;
uchar key_bit_count=0;
uint count=0;
uint buf_count=0;
uchar common_code_count=0;
uchar ir_status=0;
uint total[50];
uchar temp=0;
uchar mm=0;
uchar tp1=0;
unsigned long full=0;
uint all=0;
uchar n=0;
proceso nulo(uchar ak);
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFE;
PORTC = 0x7F; //solo salida m103
DDRC = 0x7F;
PORTD = 0xFF ;
DDRD = 0x00;
}
retraso nulo_1
0us(uchar y)
{
uchar x;
for(x=y;x>0;x--)
;
}
//Inicializar vigilancia
// preescala: 2048K
void watchdog_init(void)
{
WDR (); //esto evita un tiempo de espera al habilitar
WDTCR |= (1< WDTCR = 0x0F; //WATCHDOG HABILITADO - no olvides emitir WDR } //TIMER0 inicializar - preescala:8 // valor deseado: 50uSec // valor real: 50.000uSec (0.0%) void timer0_init(void) { TCCR0 = 0x00; //detener TCNT0 = 0xCE; //establecer recuento TCCR0 = 0x02; p>} #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void) { //uint a; p> contar++; /* a=cuenta%2; si(a==0) pluse_low; else pluse_hi; */ TCNT0 = 0xCE //recargar valor del contador } //UART0 inicializar // velocidad en baudios deseada: 9600 // real: velocidad en baudios: 9615 (0,2%) void uart0_init(void) { UCSRB = 0x00; //deshabilitar al configurar la velocidad en baudios UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x33; //establecer velocidad en baudios baja UBRRH = 0x00; //establecer velocidad en baudios alta UCSRB = 0x18; } int putchar(char c) { if (_textmode && c == ' \n') putchar('\r'); while (!(UCSRA & (1< ; UDR = c; return c; } void all_zero(void) { uchar i; for(i=0;i<48;i++) { total[i]=0; } } void inicialize_eeprom(void) { all_zero(); timer0_init() ; count=0; } visualización vacía(void) { uint i, k,m,w; uchar s,r,t; /* for(i=0;i<35;i++) p> printf("total[%d]=%d\r\n",i,total[i]); */ m=15; for(i=0;i<10;i++) { si(total[i]>230) { m=i; i=12; } } k=0; if(0) { for(i=0;i<35;i++) printf("total[ %d]=%d\r\n",i,total[i]); } //printf("m=%d\r\n", m); if(m<10) { for(i=(m+1);i<(17+m);i++ ) { if(total[i]>18 && total[i]<25) k>>=1; if(total[i]>39 && total[i]<45) { k>>=1; k|=0x8000 ; } } w=0;/* for(i=(m+17);i<( 27+m);i++) { if(total[i]>18 && total[i]<25) w>>=1 ; if(total[i]>39 && total[i]<45) { w>>=1; w|=0x8000; } } w>>=6; printf("K=0x% X total[1]=%d w=0x%x\r\n",k,total[1],w); */ s=0; for( i=(m+17);i<(25+m);i++ ) { if(total[i]>18 && total[i]<25) s>>=1; if(total[i]>39 && total[i]<45) { s>>=1; s|=0x80 ; } } r=0; for(i=(m+25);i<(33+ m);i++) { if(total[i]>18 && total[i]<25) r>>=1; if(total[i]>39 && total[i]<45) { r>>=1; r|=0x80; } } t=255-r; n=0; if(t==s) { printf("s=ox%x, r=0x%x, t=0x%x\r\n", s,r,t); tp1=12; interruptor(es) { caso 0x43: n=0x12; ruptura; caso 0x47: n=0x16; ruptura; caso 0x42: n=0x01; ruptura; caso 0x41: n=0x02; p> ruptura; caso 0x40: n=0x03; ruptura; caso 0x46: n=0x04; ruptura; caso 0x45: n=0x05; ruptura; caso 0x44: n=0x06; ruptura; caso 0x4a: n=0x07; p> ruptura; caso 0x49: n=0x08; ruptura; caso 0x48: n=0x09; ruptura; caso 0x4e: n=0; ruptura; caso 0x4d: n=0x0; ruptura; caso 0x4c: n=0x1a; p> ruptura; caso 0x14: n=0x13; ruptura; caso 0 x16: n=0x17; ruptura; caso 0x1d: n=0x14; descanso; caso 0x11: n=0x10; descanso; caso 0x15: n =0x0e; descanso } } } } #pragma interrupt_handler int0_isr:iv_INT0 void int0_isr(void) { if(temp==56) { if(count>240) { total[0]=count; count=0; temp=57; mm=1; } } más { total[mm]=cuenta; cuenta=0; mm++; si(mm>34) { CLI(); display(); temp=0; mm=0; p> CLI(); all_zero(); } } } //TIMER1 inicializar - preescala:8 // WGM: 0) Normal, TOP=0xFFFF // valor deseado: 50uSeg // real valor: 50.000uSeg (0.0%) void timer1_init(void) { TCCR1B = 0x00 //detener TCNT1H; = 0xFF; //configuración TCNT1L = 0xCE; OCR1AH = 0x00; OCR1AL = 0x32; OCR1BH = 0x00; OCR1BL = 0x32; ICR1H = 0x00; ICR1L = 0x32; TCCR1B = 0x02; //iniciar temporizador } #pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF void timer1_ovf_isr(void) { //TIMER1 se ha desbordado TCNT1H = 0xFF; //recarga el valor alto del contador TCNT1L = 0xCE //recarga el valor bajo del contador p> completo++; } // Inicializar TIMER2 - preescala:8 // WGM: Normal // valor deseado: 108uSec // valor real: 108.000uSec (0.0%) void timer2_init(void) { TCCR2 = 0x00; //detener ASSR = 0x00; /p> TCNT2 = 0x94; //configuración OCR2 = 0x6C; TCCR2 = 0x02; //inicio } #pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF void timer2_ovf_isr(void) { TCNT2 = 0x94 //recargar valor del contador all++; } //llama a esta rutina para inicializar todos los periféricos void init_devices(void) { p> //detiene las interrupciones erróneas hasta que se configuran CLI(); //deshabilita todas las interrupciones port_init(); //watchdog_init (); timer0_init(); uart0_init(); MCUCR = 0x02; GICR = 0x40; TIMSK = 0x45; //fuentes de interrupción del temporizador SEI(); //reactivar interrupciones //todos los periféricos ahora están inicializados } void full_delay(unsigned long b) { full=0; timer1_init(); mientras(1) { si(full>=b) { completo=0; p> p> TCCR1B = 0x00; //detener el temporizador1 pausa; } } } p> void timer2_delay(uint b) { while(1) { if(all>( b- 1)) { all=0; TCCR2 = 0x00; //detener el temporizador2 pausa; p> } } } void zero_one(uint a) { uint b ; if(!a) { pluse_hi; b=69 6/50; full_delay(b); pluse_low; b=348/50; full_delay(b); } más { pluse_hi; b=696/50; full_delay(b); pluse_low; b=1409/50; full_delay(b); } } proceso nulo(uchar ak) { uint b,m,i,a,k; uchar ok; SEI(); TCCR1B = 0x00; //detener temporizador1 full=0; all=0; pluse_hi; b=8344/50; timer2_init(); full_delay(b); pluse_low; b=3915/50; full_delay(b); m=0x611c; for(i=0;i<16;i++) { a=m & 0x0001; zero_one(a); m>>=1; } m=0x3dc; for(i=0;i<10;i++) p> { a=m & 0x0001; zero_one(a); m>>=1; } ok=255-ak; k=ok; k<<=8; k|=ak ; m=k; //printf("k=%x\r\n",k); for(i=0; i<16;i++) { a=m & 0x0001; zero_one(a); m>>= 1; } pluse_hi; b=696/50; full_delay(b); pluse_low; timer2_delay(978); pluse_hi; b=8344/50; full_delay(b); /p> pluse_low; b=3915/50; full_delay(b); pluse_hi; b =696/50; full_delay(b); pluse_low; mientras(!press) { ; } CLI(); } void main(void) { uint a,b,m; uint k,msg; init_devices(); delay_10us(1000); printf("count1=%d\r\n",count); timer0_ovf_isr (); CLI(); b=0; m=0; pluse_low; tp1=0; mientras(1) { if(!ir && temp==0 && a==12) { a=0; inicialize_eeprom(); temp=56; count=0; mm=0; TCCR2 = 0x00; //detener TIMER2 TCCR1B = 0x00; //detener temporizador1 //printf ("game_start\r\n"); SEI(); } if(tp1==12) { printf("n=%x\r\n",n); proceso(n); all_zero(); CLI(); tp1=0; } if(ir) a=12; k++; if(k>30000) { msg++; k=0; } if(!ir) { msg=0; } if( msg>10) { all_zero(); msg=0; temp=0; CLI(); printf("tiempo de espera\r\n"); } if(!press ) { proceso(0x08); } } }