• Domingo 22 de Diciembre de 2024, 08:35

Autor Tema:  Como Hacer Dimmer Por Software  (Leído 5362 veces)

iova

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Como Hacer Dimmer Por Software
« en: Viernes 17 de Noviembre de 2006, 16:36 »
0
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
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

iova

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Como Hacer Dimmer Por Software
« Respuesta #1 en: Miércoles 22 de Noviembre de 2006, 21:39 »
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

(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.

Aristides Alvarez

  • Miembro MUY activo
  • ***
  • Mensajes: 111
    • Ver Perfil
    • http://www.todomicrostamp.com/parallax_argentina
Re: Como Hacer Dimmer Por Software
« Respuesta #2 en: Viernes 24 de Noviembre de 2006, 20:05 »
0
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.
“La experiencia sólo puede comenzar..... cuando termine la experimentación"

Un saludo, Aristides Alvarez,
Consultor de Parallax Inc. http],
[url=http://www.microsparallax.com.ar]http] ,
info@microsparallax.com.ar ,
TE (0223) 474 5058, CEL 155 63 50 58
Mar del Plata, Argentina.

iova

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Como Hacer Dimmer Por Software
« Respuesta #3 en: Sábado 2 de Diciembre de 2006, 00:30 »
0
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.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

iova

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Como Hacer Dimmer Por Software
« Respuesta #4 en: Sábado 2 de Diciembre de 2006, 00:32 »
0
ahora subo el soft en este mensaje ya que no me dejo anteriormente.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.