SoloCodigo
Programación Específica => Microcontroladores => Mensaje iniciado por: iova en Viernes 17 de Noviembre de 2006, 16:36
-
hola gente, estoy haciendo un receptor y transmisor de x10. hasta ahora tengo el soft hecho para on/off pero no se como hacer para control de velocidades (parecido a un dimmer). El hardware utilizado es un PIC que en una salida controla un triac que me va a controlar la velocidad. Se me ocurrio lo sig: hacer tres rutinas de tiempos sincronizadas con los cruces de zero de los 220 v y asi variar el inicio del triac y asi que trabaje 3/4 ciclo, 1/2 ciclo o 1/4 ciclo y asi vario tension entregada y por lo tanto la velocidad de un ventilador de techo. Les adjunto el circuito y el soft q he hecho hasta el momento, si alquien se da maña de como puedo hacer control de velocidad por software que me avise ..gracias!!!
PD: en el codigo en la parte de poweron1 es donde deberia tener la primer rutina de dim, y ademas agregar dos mas para tener tres velocidades. Sino pasenme ejemplos de otros proyectos que hagan dimm o control de vel y veo como lo adapto al mio. Desde ya gracias!!!!
LIST P = PIC16F628
; Generic Definitions
W EQU H'0000' ; Destino W
F EQU H'0001' ; Destino F
; Standard Register Files
INDF EQU H'0000' ; Direccionamiento Ind
TMR0 EQU H'0001' ; Contador
PCL EQU H'0002' ; Contador Programa
STATUS EQU H'0003' ; Registro STATUS
FSR EQU H'0004' ; Registro File Select
PUERT_A EQU H'0005' ; Puerto A Input/Output
PUERT_B EQU H'0006' ; Puerto B Input/Output
PCLATH EQU H'000A' ; Contador Prog (bit mayor peso)
INTCON EQU H'000B' ; Registro Control Interrupciones
OCTION EQU H'0081' ; Option Register
TRISA EQU H'0085' ; Port A Data Direction Register
TRISB EQU H'0086' ; Port B Data Direction Register
;Bits STATUS
#define C STATUS, 0 ; Bit Carry
#define DC STATUS, 1 ; Bit Digit Carry
#define Z STATUS, 2 ; Bit Zero
#define NOT_PD STATUS, 3 ; Bit Power Down
#define NOT_TO STATUS, 4 ; Bit Watchdog TimeOut
#define RP0 STATUS, 5 ; Registro Page Select - direct
#define RP1 STATUS, 6 ; Registro Page Select - direct
#define IRP STATUS, 7 ; Register Page Select - indirect
;Bits OCTION
PS0 EQU .0 ; Preescalador
PS1 EQU .1 ;
PS2 EQU .2 ;
PSA EQU .3 ; Asigna preescalador 0=TMR0 1=WDT
T0SE EQU .4 ; Define Flanco Señal TMR0 (RA4) 0=Lo/Hi 1=Hi/Lo
T0CS EQU .5 ; TMR0 0=interno 1=RA4
INTEDG EQU .6 ; Define Flanco señal provoca interrupcion 0=desc 1=asc
NOT_RBPU EQU .7 ; Activa pull-up internas
; Bits INTCON
RBIF EQU .0 ; Bit indicador cambio de estado pines RB4,RB5,RB6,RB7
INTF EQU .1 ; Bit bandera cmbio flanco RB0/INT (INF=1 existio cambio flanco señal RB0)
T0IF EQU .2 ; Bit overflow TMR0 (llego a FF y paso a 0)
RBIE EQU .3 ; Bit de habilitacion para atender interrupcion RB4,RB5,RB6,RB7
INTE EQU .4 ; Bit de habilitacion para atender interrupcion RB0/INT
T0IE EQU .5 ; Bit de habilitacion para atender interrupcion cdo TMR0 desbordado
EEIE EQU .6 ; Bit de habilitacion para atender interrupcion cdo finalizo escritura de EEPROM
GIE EQU .7 ; Bit de habilitacion para atender todas las interrupcion en sus 4 modalidades
; Asignacion puertos entrada/salida
#define TRIAC PUERT_A, 0 ; Triac (RA0)
#define ZEROX PUERT_A, 1 ; Detector Cruce Cero (RA1)
#define CARRIER PUERT_A, 2 ; Detector Portadora X-10 (RA2)
#define Unid3 PUERT_B, 0 ; Unit/Function Code 3 (RB0)
#define Unid2 PUERT_B, 1 ; Unit/Function Code 2 (RB1)
#define Unid1 PUERT_B, 2 ; Unit/Function Code 1 (RB2)
#define Unid0 PUERT_B, 3 ; Unit/Function Code 0 (RB3)
#define Casa0 PUERT_B, 4 ; House Code 0 \
#define Casa1 PUERT_B, 5 ; House Code 1 | 0 to 15
#define Casa2 PUERT_B, 6 ; House Code 2 | re-assigned as
#define Casa3 PUERT_B, 7 ; House Code 3 / A to O
; Registros variables
FLAGS EQU H'0010' ; Registro usado como Bandera
CONTA EQU H'0011' ; Contador usado en rutinas de espera
CASA EQU H'0012' ; House code, 0 - 15 == A - P
UNIDAD EQU H'0013' ; Unit code, 0 - 15 == 1 - 16
RXCASA EQU H'0014' ; Codigo Casa Recibido, 0 - 15 == A - P
RXUNIDAD EQU H'0015' ; Codigo Unidad Recibido, 0 - 15 == 1 - 16
RXFUNC EQU H'0016' ; Codigo Funcion Recibido, 0 - 15 == 1 - 16
#define Carga FLAGS, 0 ; 0=Carga apagada, 1=Carga encendida
; Definicion de los Macros
TriacOn macro ;Poniendo 1 en RA0 tengo Corriente de Gate
BSF TRIAC
endm
TriacOff macro ;Poniendo 0 en RA0 no tengo Corriente de Gate
BCF TRIAC
endm
Buscar macro par1
CALL LeerBit
RLF par1, F
endm
; Comienzo de programa
Start
BSF RP0 ; Pone RP0=1 entonces Banco 1
MOVLW B'00001110'
MOVWF TRISA ; Seteo Puerto A con Ent/Sal
MOVLW B'11111111'
MOVWF TRISB ; Seteo Puerto B con Entradas
MOVLW B'00000111' ; Preescalador TMR0, Tiempo=(256-valor previo cargado en TMR0) x Predivisor x Reloj/4
MOVWF OCTION ;
BCF RP0 ; Pone RP0=0 entonces Banco 0
TriacOff ; Seteo Carga como apagada
CLRF FLAGS
CLRF CASA
CLRF UNIDAD
CLRF RXCASA
CLRF RXUNIDAD
CLRF CONTA
Main
CALL 500mSeg
1110A
CLRWDT
CALL LeerBit ; Esperar comienzo de trama 1110
BTFSS C ; 1
GOTO 1110A
CALL LeerBit ; Aqui de nuevo espera crucecero etc....y chequea carry..si hay entonces salta al otro Leerbit
BTFSS C ; 1
GOTO 1110A
CALL LeerBit ; Aqui de nuevo espera crucecero etc....y chequea carry..si hay entonces salta al otro Leerbit
BTFSS C ; 1
GOTO 1110A
CALL LeerBit ; Aqui de nuevo espera crucecero etc....y chequea carry..si hay entonces salta al otro Leerbit
BTFSC C ; 0
GOTO 1110A
Buscar RXCASA ; Leer primera direccion Casa
Buscar RXCASA
Buscar RXCASA ;Como son bits por cada semiciclo y X10 trabaja con complemento (bits 10==1 bits01==0) se debe
Buscar RXCASA ;tener en cuenta los valores de bits de los semiciclos impares tanto para RXCASA como RXUNIDAD
Buscar RXCASA
Buscar RXCASA
Buscar RXCASA
Buscar RXCASA ; Hasta aca hemos rellenado el registro RXCASA con los bits correspondientes de cada semiciclo
; luego de la trama de comienzo
Buscar RXUNIDAD ; Leer primera direccion Unidad
Buscar RXUNIDAD
Buscar RXUNIDAD
Buscar RXUNIDAD
Buscar RXUNIDAD
Buscar RXUNIDAD
Buscar RXUNIDAD ; Hasta aca hemos rellenado el registro RXUNIDAD con los bits correspondientes de cada semiciclo
Buscar RXUNIDAD ; luego de la trama de CASA
MOVLW D'0024' ; Esperar 24 cruces cero hasta
MOVWF CONTA ; comienzo del "gap"
Conteo1
CALL LeerBit
DECFSZ CONTA, F
GOTO Conteo1
MOVLW D'0011' ; Esperar un maximo de 10 cruces de cero
MOVWF CONTA ; hasta proximo comienzo de trama (start)
Conteo2
DECFSZ CONTA, F
GOTO 1110B
GOTO Main ; Abortar por problemas de Tx
1110B
CLRWDT
CALL LeerBit ;
BTFSS C ; 1
GOTO Conteo2
CALL LeerBit
BTFSS C ; 1
GOTO Conteo2 ;
CALL LeerBit
BTFSS C ; 1
GOTO Conteo2
CALL LeerBit
BTFSC C ; 0
GOTO Conteo2
MOVLW D'0008' ; Ignorar proximos 8 semiciclos
MOVWF CONTA ; Direccion Casa repetida
Conteo3
CALL LeerBit
DECFSZ CONTA, F
GOTO Conteo3
Buscar RXFUNC ; Leer comando funcion
Buscar RXFUNC
Buscar RXFUNC
Buscar RXFUNC
Buscar RXFUNC ; ignore last two bits of function
Buscar RXFUNC ; as always 1 0 == 1
Buscar RXFUNC
Buscar RXFUNC ; and ignore rest of data (22 bits)
CALL LeerDIPSW
MOVF CASA, W
SUBWF RXCASA, W
XORLW 0
BZ CasaOK
GOTO Main
CasaOK
MOVF UNIDAD, W ; Received House code matches DIP switch
SUBWF RXUNIDAD, W
XORLW 0
BZ UnidadOK
GOTO Main
UnidadOK ; Received Unit code matches DIP switch
MOVLW B'01011001' ; On function 0010 1
SUBWF RXFUNC, W
XORLW 0
BZ PowerOn1
MOVLW B'01011010' ; Off function 0011 1
SUBWF RXFUNC, W
XORLW 0
BZ PowerOff1
GOTO Main
PowerOn1
TriacOn
BSF LOAD
GOTO Main
PowerOff1
TriacOff
BCF LOAD
GOTO Main
LeerBit
CALL CruceCero ; Llama y vuelve cdo hay CruceCero
CALL 250uSeg ; Espera para darle tiempo a entrar portadora 120khz (total la vent de tiempo es de 1mSeg)
BTFSS CARRIER ; Chequea presencia de portadora 120khz (RA2)
GOTO GB1
BSF C ; Portadora presente entonces setear carry ©
RETLW 0
GB1
BCF C ; Portadora no presente entonces clear carry ©
RETLW 0 ; De aqui siempre vuelve a la proxima linea del CALL LeerBit correspondiente
CruceCero
BTFSC ZEROX ; Chequea estado 50Hz (en que semiciclo esta)(ZEROX = RA1)(salta si RA1 = 0)
GOTO Z1 ; power then wait for it to change
Z0
CLRWDT ; RA1 esta en 0
BTFSS ZEROX ; hace el lazo hasta que RA1 sea 1
GOTO Z0
RETLW 0
Z1
CLRWDT ; RA1 esta en 1
BTFSC ZEROX ; hace el lazo hasta que RA1 sea 0
GOTO Z1
RETLW 0
250uSeg
CLRF TMR0
W0
CLRWDT ; Measured at about 273uSecs
MOVF TMR0, W
BZ W0
RETLW 0
LeerDIPSW
SWAPF PUERT_B, W ; Leer DIP switch high nibble = Direccion CASA
MOVWF CASA ; y complementar para logica verdadera y
COMF CASA, W ; guardar en variable CASA, (aca habria q chequear bit Z por si da 0 luego del COMF ...casa P)
ANDLW H'000F' ; 0 -> 15 == A -> P (al hacer esto queda W con los valores solo de casa en los bits de menor
; peso, valores entre 0 - 15)
CALL TablaCasa ; Ver tabla
MOVWF CASA
MOVF PUERT_B, W ; Leer DIP switch low nibble = Direccion Unidad
ANDLW H'000F' ; Unscramble bits and complement for true-logic
CALL TablaUnidad ; Look up bit pattern & save in UNIT variable
MOVWF UNIDAD ; 0 -> 15 == 1 -> 16
RETLW 0
TablaCasa
ADDWF PC, F ; House Code Look-up table:
RETLW B'01101001' ; A = 0110 x-x-x-x-ON-OFF-OFF-OFF (posicion en switch 1-2-3-4-5-6-7-8)(1-4 Unidad; 5-8 Casa)
RETLW B'10101001' ; B = 1110 x-x-x-x-OFF-ON-OFF-OFF
RETLW B'01011001' ; C = 0010 x-x-x-x-ON-ON-OFF-OFF
RETLW B'10011001' ; D = 1010 x-x-x-x-OFF-OFF-ON-OFF
RETLW B'01010110' ; E = 0001 x-x-x-x-ON-OFF-ON-OFF
RETLW B'10010110' ; F = 1001 x-x-x-x-OFF-ON-ON-OFF
RETLW B'01100110' ; G = 0101 x-x-x-x-ON-ON-ON-OFF
RETLW B'10100110' ; H = 1101 x-x-x-x-OFF-OFF-OFF-ON
RETLW B'01101010' ; I = 0111 x-x-x-x-ON-OFF-OFF-ON
RETLW B'10101010' ; J = 1111 x-x-x-x-OFF-ON-OFF-ON
RETLW B'01011010' ; K = 0011 x-x-x-x-ON-ON-OFF-ON
RETLW B'10011010' ; L = 1011 x-x-x-x-OFF-OFF-ON-ON
RETLW B'01010101' ; M = 0000 x-x-x-x-ON-OFF-ON-ON
RETLW B'10010101' ; N = 1000 x-x-x-x-OFF-ON-ON-ON
RETLW B'01100101' ; O = 0100 x-x-x-x-ON-ON-ON-ON
RETLW B'10100101' ; P = 1100 luego del COMF se deberia chequear bit z status si da 0 entonces todo off casa P
; la otra es no usar COMF y armar tabla de acuerdo como hice abajo y asi tener todas
; posibilidades
TablaUnidad
ADDWF PC, F ;Unit Code Look-up table:
RETLW B'01100110' ; 7 = 0101 x-x-x-x-ON-ON-ON-OFF
RETLW B'01011010' ;11 = 0011 x-x-x-x-ON-ON-OFF-ON
RETLW B'01011001' ; 3 = 0010 x-x-x-x-ON-ON-OFF-OFF
RETLW B'01010101' ;13 = 0000 x-x-x-x-ON-OFF-ON-ON
RETLW B'01010110' ; 5 = 0001 x-x-x-x-ON-OFF-ON-OFF
RETLW B'01101010' ; 9 = 0111 x-x-x-x-ON-OFF-OFF-ON
RETLW B'01101001' ; 1 = 0110 x-x-x-x-ON-OFF-OFF-OFF
RETLW B'10010101' ;14 = 1000 x-x-x-x-OFF-ON-ON-ON
RETLW B'10010110' ; 6 = 1001 x-x-x-x-OFF-ON-ON-OFF
RETLW B'10101010' ;10 = 1111 x-x-x-x-OFF-ON-OFF-ON
RETLW B'10101001' ; 2 = 1110 x-x-x-x-OFF-ON-OFF-OFF
RETLW B'10011010' ;12 = 1011 x-x-x-x-OFF-OFF-ON-ON
RETLW B'10011001' ; 4 = 1010 x-x-x-x-OFF-OFF-ON-OFF
RETLW B'10100110' ; 8 = 1101 x-x-x-x-OFF-OFF-OFF-ON
RETLW B'01100101' ;15 = 0100 x-x-x-x-OFF-OFF-OFF-OFF
RETLW B'01101001' ;F>F>0 = 1 = 0110 0
-
Buenas como andan??? Finalmente creo q lo logre. Voy a postear mi programa completo y en base a que lo hice, primero por sim le sirve a alguien y segundo por si ven algun error q me corrijan. Este trabajo es un Receptor de protocolo X10 pensado para ser usado como un actuador de un ventilador de techo. Fue basado en el circuito echo por Abacus de la sig pagina :
http://www.cix.co.uk/~pplunkett/x10.htm (http://www.cix.co.uk/~pplunkett/x10.htm)
(bajarse archivo X10am1.zip)
Mi circuito llevara un moc3042 y el triac en la salida RA0 del PIC en vez del diodo invertido y el triac como sale alli (a todo esto creo que el diodo deberia estar al reves )y uso un pic 16F628. Lo demas del circuito es igual, pero en mi software le agregue un dimmer:
cdo llegue la trama de ON (X10) se prendera en Vel1A, con trama DIM en Vel2A y con BRIGHT en Vel3A. Tampoco tengo echo la parte de boton manual ya q pienso hacer el transmisor tambien.
Si conocen del protocolo X10 y de actuadores etc miren esto y agradezcan, modifiquen opinen etc a gusto. Si alguien sabe como hacer un transmisor X10 basandose en AN 236 de pagina microchip que me avise...eso voy a encarar ahora.
Saludos,
Iova.
-
Si te sirve, podría tomar la señal de la salida, del comando XOUT (Tx, de X-10), de un BASIC Stamp con el osciloscopio.
-
Creo haber terminado el receptor de X10 ...adjunto hardware y software hecho en assembler , armen , prueben et y si falla algo haganmelo saber..saludos.
PD : voy a hacer el Tx ahora basado en este Rx luego lo publico tambien.
-
ahora subo el soft en este mensaje ya que no me dejo anteriormente.