Version de 7 canales
Por Sebastian Smuraglia
El decodificador que se presenta a continuacion es un magnifico desarrollo de Sebastian Smuraglia; donde se utiliza un PIC16F628 que lo que hace es utilizar el PORTB:0 como entrada de señal. Y monitorear el flanco de bajada para generar una interrupcion; se atiende dicha interrupcion y se libera un pulso del ancho correspondiente en uno de los pines del resto del puerto B. el cual seria desde el B:1 hasta el B:7; quedando un decodificador hasta 7 canales.
El circuito simplemente consiste en un microcontrolador PIC16F628 con la entrada de señal por B0 y las 7 salidas correspondientes en el resto del puerto B. Utiliza el oscilador interno de 4 MHZ -hay que configurarlo así desde el propio grabador del PIC (IC-Prog, por ejemplo)-, sin MasterClear (también se configura desde el grabador de PIC).
Archivo ASM
Código: Seleccionar todo
; Receptor de RadioControl de 7 canales
#include <p16f628a.inc>
Channel equ 20h
Flags equ 21h
TimeOut equ 0h
org 00h
goto Start
org 04h
btfsc INTCON,INTF
goto NextChannel
btfss PIR1,TMR2IF
goto FinishInterrupt
bcf T2CON,TMR2ON
bsf Flags,TimeOut
bcf PIR1,TMR2IF
goto FinishInterrupt
NextChannel
btfss Flags,TimeOut
goto OtherChannel
movlw b'00000010'
movwf Channel
movwf PORTB
bcf Flags,TimeOut
bsf T2CON,TMR2ON
goto FinishInterrupt
OtherChannel
bcf T2CON,TMR2ON
bcf STATUS,C
rlf Channel,F
movf Channel,W
movwf PORTB
bsf T2CON,TMR2ON
FinishInterrupt
movf CMCON,F
bcf PIR1,CMIF
bcf INTCON,INTF
retfie
Start
clrf PORTA
clrf PORTB
movlw b'00000111'
movwf CMCON
bsf STATUS,RP0
movlw b'00000111'
movwf TRISA
movlw b'00000001'
movwf TRISB
movlw b'11000111'
bcf STATUS,RP0
btfss PORTA,0
movlw b'10000111'
bsf STATUS,RP0
movwf OPTION_REG
movlw b'01000010'
movwf PIE1 ; Habilito las interrupciones del Timer2
movlw .23
movwf PR2 ; Llevo el valor decimal 195 al registro PR2
bcf STATUS,RP0 ; Paso al banco de memoria 0
movlw b'11010000'
movwf INTCON ; Habilito las interruciones
movlw b'01111011' ; Pre y Pos Scaler del Timer2 en 16
movwf T2CON ; Configuro el Timer2
bsf T2CON,TMR2ON ; Activo el Timer2
MainLoop
nop
nop
goto MainLoop ; Ciclo cerrado, que no hace nada
end
Archivo HEX (Compilado)
Código: Seleccionar todo
:020000040000FA
:020000001E28B8
:080008008B180C288C1C1A282F
:10001000121121148C101A28211C14280230A0005F
:100020008600211012151A2812110310A00D2008A5
:10003000860012159F080C138B100900850186019C
:1000400007309F0083160730850001308600C730D7
:100050008312051C87308316810042308C001730D4
:1000600092008312D0308B007B309200121500007A
:04007000000037282D
:00000001FF
Esta es la ultima version del decodificador de Sebastian Smuraglia, el cual tiene una salida mas y la forma en la que esta programado el firmware del PIC varia sustancialmente respecto al de 7 canales.
En este circuito la entrada de señal es por RA1/AN1, Utilizando el comparador de tension interno y usando una tension de referencia de aproximadamente 150mV para la deteccion de un estado alto y uno bajo en la señal de entrada.
Se usan muy pocos pines del circuito y con tan pocos componentes extra, es muy liviano
Para hacerle unas pruebas al prototipo, se le inyecto una señal de radio corresponde a la salida de una ESky de 4 canales (0404) y está tomada de la salida de puerto de trainner (pasando por un divisor resistivo para bajarla). Como puede apreciarse la radio tiene 5 canales sólo que el quinto no tiene comando exterior. El osciloscopio se configuro con 2V/div y el trazo de arriba muestra la señal decodificada por el canal 3 y la base de tiempo es 1ms/div.
Hay que tener en cuenta que el decodificador funciona bien para un tipo de señal PPM estandard, con pulsos de canal que varian desde 1ms a 2ms con un tiempo de sincronismo no menor a 3ms. Si la señal tiene menos canales el decodificador detecta el fin del tren de pulsos de la señal PPM y solo habilita las salidas correspondientes. Si la señal que viene del decodificador tiene el pulso de sincronismo en estado bajo, se puede invertir con un transistor.
Archivo ASM
Código: Seleccionar todo
; Receptor de RadioControl de 8 canales
#include <p16f628a.inc>
Channel equ 20h
org 00h
goto Start
org 04h
bcf INTCON,GIE
btfsc PIR1,CMIF
goto NextChannel
btfss PIR1,TMR2IF
goto FinishInterrupt
clrf PORTB
movlw b'00000001'
movwf Channel
bcf T2CON,TMR2ON
bcf PIR1,TMR2IF
bsf T2CON,TMR2ON
goto FinishInterrupt
NextChannel
bcf T2CON,TMR2ON
btfss CMCON,C2OUT
goto $+7
movf Channel,W
movwf PORTB
bcf STATUS,C
rlf Channel,F
goto $+2
bcf PORTA,3
bsf T2CON,TMR2ON
movf CMCON,W
bcf PIR1,CMIF
FinishInterrupt
retfie
Start
clrf PORTA
clrf PORTB
movlw b'00000101'
movwf CMCON
movlw .1
movwf Channel
bsf STATUS,RP0
movlw b'00000111'
movwf TRISA
movlw b'00000000'
movwf TRISB
movlw b'11000111'
movwf OPTION_REG
movlw b'01000010'
movwf PIE1 ; Habilito las interrupciones del Timer2
movlw .12
movwf PR2
bcf STATUS,RP0 ; Paso al banco de memoria 0
movlw b'11000000'
movwf INTCON ; Habilito las interruciones
movlw b'01111011' ; Pre y Pos Scaler del Timer2 en 16
movwf T2CON ; Configuro el Timer2
clrf PIR1
bsf T2CON,TMR2ON ; Activo el Timer2
MainLoop
nop
nop
goto MainLoop ; Ciclo cerrado, que no hace nada
end
Código: Seleccionar todo
/*
RC Decoder hasta 8 canales
*/
#include "16f628a.h"
#use delay (clock=4000000)
#byte CMCON=0x1F
#byte PORTB=0x6
int8 contador;
#int_timer2
void timer2interrupt()
{
contador = 1;
output_b (0);
set_timer2 (0);
clear_interrupt (int_timer2);
}
void main ()
{
contador = 1;
set_tris_a (0b00000110);
set_tris_b (0);
output_b (0);
setup_timer_2 (T2_DIV_BY_16,12,16);
clear_interrupt (int_timer2);
setup_comparator (nc_nc_a1_a2);
set_timer2 (0);
enable_interrupts (int_timer2);
enable_interrupts (global);
while (true)
{
while (bit_test(CMCON,7) == 0)
{
}
if (bit_test (PORTB,7) ==0)
output_b (contador);
else
output_b (0);
set_timer2 (0);
shift_left (&contador,1,0);
while (bit_test (CMCON,7) ==1)
{
}
}
}
Código: Seleccionar todo
:020000040000FA
:020000001D28B9
:080008008B130C1B10288C1C4B
:100010001C2886010130A00012118C1012151C281A
:1000200012119F1F1928200886000310A00D1928FF
:10003000851112151F080C13090085018601053072
:100040009F000130A0008316073085000030860035
:10005000C730810042308C000C3092008312C030D7
:100060008B007B3092008C011215000000003528B7
:00000001FF