Aqui adjunto un poco de como llevo el proyecto.
-Problema de las interrupciones solventado en ASM
-Recepcion de los codigos RC5 mediante la siguiente rutina.( Modificada un poco pero con la misma extructura)
'// Philips RC5 IR decoder
DEFINE OSC 20
DEFINE LOADER_USED 1
DEFINE HSER_BAUD 2400
Y VAR WORD ' Holds 12-bit RC5 code
Loop VAR BYTE ' Loop variable
PIN VAR PORTB.0 ' RB.0 input pin reading data
TRISB.0=1 ' Set RB.0 direction to input
OPTION_REG.7 = 0 ' Internal pull-ups = on
Home:
IF PIN = 1 THEN Home ' Wait for low going pulse
PAUSEUS 100 ' Short delay
IF PIN = 1 THEN Home ' Was it noise?
PAUSEUS 1350 ' Pause to read 2nd half of 1st bit period
Y.0[13] = PIN ' Record 1st synch period bit value
FOR Loop = 12 to 0 STEP - 1 ' 13 pulses MSB to LSB
Y.0[Loop] = PIN ' Y.Bit.Loop = data bit
PAUSEUS 1800 ' Wait 1.8mS to read next RC5 bit
NEXT Loop ' in middle of 2nd bit period
IF Y.LowByte = $FF THEN Home ' Was it noise?
Y = ~Y & $003F ' Mask upper 10-bits to return 6-bit data
' in lower 6-bits of word result
HSEROUT ["Key Pressed = ",DEC Y,13,10]
Y=0 ' Clear key codes
PAUSE 250 ' Used for testing only
GOTO Home ' Return Home
- Por ultimo deciros que tengo algunos problemas de temporizacion en la rutina de recepcion debido a el tiempo que se pierde en ejecutar las interrupciones, pero esto creo que se solventara haciendo un ajuste mas fino de los pause de la rutina anterior.
Aqui os dejo el codigo fuente del proyecto asta el momento, espero que os guste.
DEFINE INTHAND Nucleo
@ device pic12F675, INTRC_OSC_NOCLKOUT, WDT_OFF, PWRT_ON, MCLR_OFF, protect_off
'
'
triac var gpio.5 ' Salida de disparo triac 0
mando var gpio.4 ' Entrada señal del mando 1
led var gpio.3 ' Salida led 0
cero var gpio.2 ' Entrada paso por cero 1
Verde var gpio.1 ' Salida led 0
Rojo var gpio.0 ' Salida led 0
symbol GIEN = INTCON.7
symbol PULSO = OPTION_REG.6
Ird VAR WORD ' Donde se guarda el dato de IR
Valor VAR BYTE ' Tiempo de disparo.
ciclo VAR BYTE
Retardo VAR BYTE ' Retardo para prueba
Temp0 VAR BYTE
Temp1 VAR BYTE
t var bit
' Variables para el restablecimiento del Pic
wsave VAR BYTE $20 system ' despues de producirse una interrupcion
ssave VAR BYTE bank0 system
psave VAR BYTE bank0 system
GOTO Inicializacion ' Saltamos las interrupciones
ASM ; Inicio del tratamiento de interrupciones
Nucleo bcf INTCON,GIE
movwf wsave ; Guarda W
swapf STATUS, W ; Swap STATUS to W
clrf STATUS ; Resetea STATUS
movwf ssave ; Guarda STATUS
movf PCLATH, W ; PCLATH to W
movwf psave ; Guarda PCLATH
btfsc INTCON,T0IF ; Salta si es paso por cero
goto Dispara ; Es elpaso por cero
movf _Valor,W ; Recargamos el valor de disparo
movwf TMR0 ; En el temporizador
btfss OPTION_REG,INTEDG ; Activa la int en el flando de
goto EsCero ; De subida
bcf OPTION_REG,INTEDG ; De bajada
Termina bcf INTCON,INTF ; Reseteamos INTF
goto Fin
EsCero bsf OPTION_REG,INTEDG
goto Termina
Dispara bsf _triac ; Disparamos el Triac
bsf _Rojo
bcf INTCON,T0IF ; Reseteamos el TMR0
movlw 30 ; Retardo para cebar el Triac
movwf _Retardo
Bucle decfsz _Retardo,1
goto Bucle
bcf _triac ; Fin del retardo
bcf _Rojo
Fin movf psave, W ; Dejar todo como estaba
movwf PCLATH
swapf ssave, W
movwf STATUS
swapf wsave, F
swapf wsave, W
bsf INTCON,GIE
retfie
ENDASM
Inicializacion:
TRISIO = %11010100 ' 1 = Entradas 0 = Salidas
OPTION_REG = %11000100 ' Phus pull desactivadas ,CLK interno, Preescaler CLK/32.
WPU = %00000000 ' Enable pull-ups on GP2
CMCON = %00000111 ' Disable analog comparator
ANSEL = %00000000 ' Disable analog converter
Valor = 100
' Configuramos las interrupciones
' ==============================
INTCON=%10110000 ' Habilitar interrupcion patilla INT y el TMR0
Inicio:
Temp0=0
IF mando = 1 THEN Inicio ' Esperamos a que llegue un pulso
PAUSEUS 100 ' Retardo de discriminacion
IF mando = 1 THEN Inicio ' Si cambio el pulso, es ruido
PAUSEUS 1350 ' Tiempo de espera para el siguiente bit
ird.0[13] = mando ' Guardamos el primer bit de recepcion
FOR ciclo = 12 to 0 STEP - 1 ' 13 pulsos MSB asta LSB
ird.0[ciclo] = mando ' Ird.Bit.ciclo = data bit
PAUSEUS 1800 ' Espera de 1.8mS para el siguiente RC5 bit
NEXT ciclo ' Siguiente bit
IF ird.LowByte = $FF THEN Inicio ' Es ruido
if ird.lowByte = 0 THEN Inicio ' Es ruido
Temp1=ird.LowByte ' Salvamos el dato recibido en Temp1
if ird.lowByte=Temp0 then
if t=0 then
GIEN=0
t=1
else
GIEN=1
t=0
endif
endif
GOTO Inicio ' Return Home
P.D. La temporizacion del disparo la realizo mediante la int del TMR0 configurado desde 0 uS asta 8100 uS que prcticamente es la semionda completa.
Un saludo centiane.