Autor Tema: Problema con PIC12F675 para Protector de Voltaje  (Leído 3134 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado hurtadoluisalex

  • PIC10
  • *
  • Mensajes: 24
Problema con PIC12F675 para Protector de Voltaje
« en: 07 de Octubre de 2018, 21:52:38 »
Saludos desde Venezuela compañeros  ;-) :-/


Como dice en el título tengo un pequeño problema con un pequeño proyecto para la universidad, en el cual se me pide hacer un protector de tensión (o voltaje) con el PIC12F675, ya que es de los mas pequeños y económicos acá, el protector debe funcionar algo así como un comparador de ventana, es decir solo activara un pin (que enviara una señal a un relé con el cual se permitirá el paso de corriente) en caso de que el voltaje en sus entradas esté en el rango aceptado. Se me pidió que lo hiciera haciendo uso del conversor analógico-digital o cualquier otro método mientras se utilice el PIC indicado.


He realizado el código en Ensamblador con MPLab pero tengo un problema al momento de hacer la simulación y es que se me activa el pin que indica un voltaje por debajo del rango aceptado, siempre ocurre esto, no importa el si el valor de la señal esta en el rango indicado o por encima de éste.


Aun esta en la etapa de simulación pero como me esta dando este error, quiero estar seguro antes de pasar el programa al PIC para evitar inconvenientes con los componentes utilizados, como sabrán en mi país la economía esta grave y no estamos para quemar componentes  :mrgreen:


Dejare algunas fotos del problema en la simulación y el código a ver si alguien me puede ayudar, he tratado de hacer el código lo mas ordenado posible, disculpen si esta un poco desordenado, aun estoy muy novato en esto de los microcontroladores  :oops:  pero ya iremos aprendiendo  :o


El código tiene características como:

-Básicamente el programa consiste en convertir una señal acondicionada de la red ( 120 Vrms/60Hz) en un valor digital para compararlo con ciertos valores de referencia (guardados en  registros) y determinar si es mayor, menor o igual
-Un retardo de 5 segundos antes de la primera conversión
-En base a la comparación, el microcontrolador deberá señalar por medio de leds si hay un alta o baja tensión o si esta en el rango indicado y activar un relé


Acá van algunas fotos de la simulación


Se supone que acá el voltaje esta en el rango adecuado (95-130 Vrms) pero como verán se enciende el led que indica baja tensión





Acá esta la configuración del PIC





Finalmente acá esta el código, por si alguien quiere echarle un vistazo si hay algún error en cuanto a la programación


Código: ASM
  1. ;****************************** CONFIGURACION *********************
  2. __CONFIG 0X3194
  3. #INCLUDE <P12F675.INC>
  4. LIST P=12F675
  5.  
  6.  
  7. CBLOCK 0X20
  8. PDel0
  9. PDel1
  10. PDel2
  11. CONTADOR
  12. REGISTROALTA
  13. REGISTROBAJA
  14. ENDC
  15. ;*********FIN DE CONFIGURACION Y DECLARACION DE REGISTROS *************
  16. ;*** CONFIGURACION DEL PIC ***
  17. INICIO
  18. BCF STATUS,5                    ;***COMPARADORES ***
  19. CLRF GPIO
  20. MOVLW B'00000111'
  21. MOVWF CMCON
  22. BSF STATUS,5                    ;***ENTRADAS Y SALIDAS ***
  23. MOVLW B'00001001'               ;SEGUN EL DATASHEET EL PIN 3
  24. MOVWF TRISIO                    ;SOLO FUNCIONA COMO ENTRADA
  25. MOVLW B'00010001'
  26. MOVWF ANSEL                             ;*** ADC CONVERSOR ***
  27. BCF STATUS,5
  28. MOVLW B'10000001'
  29. MOVWF ADCON0                   
  30. CALL DEMORA30U                  ;*** DEMORA DE 30 MICROSEGUNDOS ***
  31. BCF STATUS,5
  32. MOVLW D'5'
  33. MOVWF CONTADOR
  34. BSF ADCON0,GO_DONE
  35. CALL DEMORA30U
  36.  
  37.  
  38. ESPERA                                  ;*** ESPERA INICIAL DE 5 SEGUNDOS APROX. ***
  39. BSF GPIO,4
  40. CALL DEMORA500M                 ;*** DEMORA DE 500 MILISEGUNDOS ***
  41. BCF GPIO,4
  42. CALL DEMORA500M
  43. DECFSZ CONTADOR
  44. GOTO ESPERA
  45. MOVLW D'5'
  46. MOVWF CONTADOR
  47.  
  48.  
  49.  
  50.  
  51. CONVERSION                      ;*** CONVERSION DE ANALOGICO A DIGITAL ***
  52. BTFSC ADCON0,GO_DONE
  53. GOTO CONVERSION
  54. MOVLW B'11000011'               ;*** COMPARACION DE REGISTROS ***
  55. MOVWF REGISTROALTA              ;PARA SABER SI EL VALOR INGRESADO
  56. MOVF ADRESL,0                   ;ES ALTA O BAJA TENSION
  57. SUBWF REGISTROALTA,0
  58. BTFSC STATUS,Z                  ;SON DIFERENTES?
  59. GOTO  ALTATENSION               ;NO, VE A ALTA TENSION
  60. BTFSS STATUS,C                  ;SI, PREGUNTA SI W ES MAYOR QUE REGISTROALTA
  61. GOTO ALTATENSION                ;SI, VE A ALTA TENSION
  62. MOVLW B'10001110'               ;NO, HACE LA COMPRACION
  63. MOVWF REGISTROBAJA
  64. MOVF ADRESL,0
  65. SUBWF REGISTROBAJA,0
  66. BTFSC STATUS,Z                  ;SON DIFERENTES?
  67. GOTO  BAJATENSION               ;NO, VE A BAJA TENSION
  68. BTFSS STATUS,C                  ;SI, PREGUNTA SI W ES MAYOR QUE REGISTROBAJA
  69. GOTO ENCENDIDO                  ;SI, VE A ENCENDIDO
  70. GOTO BAJATENSION                ;NO, VE A BAJA TENSION
  71.  
  72.  
  73. ALTATENSION                             ;*** ENCIENDE UN LED ROJO ***
  74. MOVLW B'000010'
  75. MOVWF GPIO
  76. BSF ADCON0,GO_DONE
  77. CALL DEMORA30U
  78. GOTO CONVERSION                 ;*** HACE DE NUEVO LA CONVERSION ADC Y COMPARA ***
  79.  
  80.  
  81. BAJATENSION                             ;*** ENCIENDE UN LED AMARILLO ***
  82. MOVLW B'000100'
  83. MOVWF GPIO
  84. BSF ADCON0,GO_DONE
  85. CALL DEMORA30U
  86. GOTO CONVERSION                 ;*** HACE DE NUEVO LA CONVERSION ADC Y COMPARA ***
  87.  
  88.  
  89. ENCENDIDO                               ;*** ENCIENDE UN LED VERDE ***
  90. MOVLW B'110000'
  91. MOVWF GPIO
  92. BSF ADCON0,GO_DONE
  93. CALL DEMORA30U
  94. GOTO CONVERSION                 ;*** HACE DE NUEVO LA CONVERSION ADC Y COMPARA ***
  95.  
  96.  
  97. ;*** RETARDOS ***
  98.  
  99.  
  100. DEMORA500M  movlw     .239      ; 1 set numero de repeticion  (B)
  101.         movwf     PDel2     ; 1 |
  102. PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
  103.         movwf     PDel1     ; 1 |
  104. PLoop2  clrwdt              ; 1 clear watchdog
  105. PDelL1  goto PDelL2         ; 2 ciclos delay
  106. PDelL2  goto PDelL3         ; 2 ciclos delay
  107. PDelL3  clrwdt              ; 1 ciclo delay
  108.         decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
  109.         goto      PLoop2    ; 2 no, loop
  110.         decfsz    PDel2,  1 ; 1 + (1) es el tiempo 0  ? (B)
  111.         goto      PLoop1    ; 2 no, loop
  112. PDelL4  goto PDelL5         ; 2 ciclos delay
  113. PDelL5  goto PDelL6         ; 2 ciclos delay
  114. PDelL6  goto PDelL7         ; 2 ciclos delay
  115. PDelL7  clrwdt              ; 1 ciclo delay
  116.         return              ; 2+2 Fin.
  117.  
  118.  
  119. DEMORA30U
  120. movlw     .6        ; 1 set numero de repeticion
  121. movwf     PDel0     ; 1 |
  122. PLoop0  
  123. clrwdt              ; 1 clear watchdog
  124. decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
  125. goto      PLoop0    ; 2 no, loop
  126. clrwdt              ; 1 ciclo delay
  127. return              ; 2+2 Fin.
  128.  
  129.  
  130. END


Muchas gracias por tomarse el tiempo de leer y sus respuestas  :-/


PD: Si este post no va acá en esta sección, sepan perdonarme ya que soy nuevo acá en el foro.


PD2: Si necesitan mas información estaré gustoso de darla  :-)
« Última modificación: 07 de Octubre de 2018, 22:33:12 por hurtadoluisalex »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema con PIC12F675 para Protector de Voltaje
« Respuesta #1 en: 08 de Octubre de 2018, 12:28:35 »
Bueno no hay muchos problemas pero se prodia reformular el programa para que sea mas legible.

Un problema que encontre la alineacion... A pesar que escribiste ADRESL al estar en el banco 0 estas accediendo a ADRESH. Asi que lo considero "correcto". pero poco claro, pienso que deberias cambiar por ADRESH

Pero para que sea correcto y bien correcto, debes justificar la salida del ADC correctamente. Si usas alineado a la derecha ( bit7 del ADCON0 en 1) vas a tener los 2 mas significativos en ADRESH y los otros 8 en ADRESL. Para poder comparar correctamente vas a tener que rotar ADRESH y ADRESL hasta que quede solo 8 bits. Otra forma de hacer esto sin complicarse es justificarlo a la izquierda Ahora SI los valores mas importantes van a estar en ADRESH y podes compararlo directamente, sin importar lo que posea ADRESL.

Entonces tu problema era el justificado, al estar mal justificado el maximo que puede alcanzar ADRESH es 0b11 = 3, y por ende siemrpe va a ser baja tension.

Para solucionarlo solo debes cambiar el bit7 por un 0 en el ADCON0 (cuando se lo asignas al comienzo)

Cambia el ADRESL por ADRESH que es el nombre correcto, a pesar que ambos accedan al mismo lugar (Al seguir en el banco 0). Solo para que sea mas legible.


----------------------------------------------------------------------------------------------------------------------------------

Por otro lado te quiero hacer una propuesta y una posible correccion.

La propuesta es cambiar lo siguiente:
Código: ASM
  1. MOVLW B'11000011'               ;*** COMPARACION DE REGISTROS ***
  2. MOVWF REGISTROALTA              ;PARA SABER SI EL VALOR INGRESADO
  3. MOVF ADRESL,0                   ;ES ALTA O BAJA TENSION
  4. SUBWF REGISTROALTA,0
  5. BTFSC STATUS,Z                  ;SON DIFERENTES?
  6. GOTO  ALTATENSION               ;NO, VE A ALTA TENSION
  7. BTFSS STATUS,C                  ;SI, PREGUNTA SI W ES MAYOR QUE REGISTROALTA
  8. GOTO ALTATENSION                ;SI, VE A ALTA TENSION

No tiene sentido hacer todo eso... El registro "REGISTROALTA" lo unico que haces es comparar con el ADRESH y depositarle siempre el mismo valor, valor que NO cambia. Entonces... para que usar un registro para eso ? Directamente hago un SUBLW 0b11000011. Me explico:

Hacer esto:

Código: ASM
  1. MOVLW B'11000011'               ;*** COMPARACION DE REGISTROS ***
  2. MOVWF REGISTROALTA              ;PARA SABER SI EL VALOR INGRESADO
  3. MOVF ADRESL,0                   ;ES ALTA O BAJA TENSION
  4. SUBWF REGISTROALTA,0
Es hacer:
REGISTROALTA - W, Donde W = ADRESH. Entonces el resultado total es lo mismo que hacer REGISTROALTA - ADRESH,
REGISTROALTA = 0B11000011, por lo tanto finalemente tenemos que: 0b11000011 - ADRESH

Y que es lo mismo que hacer:
Código: ASM
  1. MOVF ADRESH, W
  2. SUBLW 0B11000011

Que es 0B11000011 - ADRESH

Por otro lado, estas comparando por este numero: '11000011' = 195. Y comparas por si es igual y mayor a ese numero, tenes que usar 2 comparaciones, primero usar la bandera Z y luego la bandera C... Pero si usas el valor 194 solo necesitas comparar por si es mayor nomas (Solo la bandera C ). Lo mismo ocurre para la baja tension. Entonces un solo BTFSS/C STATUS, C es suficiente para ambos casos.

Y finalmente la corrección que quería hacerte:

Luego de detectar la tension correcta, la mayoria de los protectores espera supongamos 5 segundos, hasta que este la tension normal.
Peeeeeeero.... Quiere decir que por 5 segundos la tension DEBE estar normal. Si ocurre un bajon cuando van 3 segundos y vuelve a normal, tiene que volver a iniciar los 5 segundos desde que se puso normal.
Tu codigo no hace esto, detectado el bajo voltaje, activa el led, pero a los 5s recien se fija si la tension esta normal, y puede que siga bajando y subiendo la luz en ese trayecto de los 5s y no va a tener problemas, pero si a los 5s la tension esta bien, va a mostrarte que esta normal y puede llegar a conectar un pequeño ratito.

Otro problema es que al iniciar el programa, inicias la conversion, esperas 5s, revisas la conversion.
Lo cual quiere decir que tu primera muestra en realidad es la de hace 5 segundos atras!!! Y no la actual. Las demas no hay problemas por el delay de 30us que tampoco deberia estar...

Desconectado hurtadoluisalex

  • PIC10
  • *
  • Mensajes: 24
Re:Problema con PIC12F675 para Protector de Voltaje
« Respuesta #2 en: 08 de Octubre de 2018, 21:34:31 »
Bueno no hay muchos problemas pero se prodia reformular el programa para que sea mas legible.

Un problema que encontre la alineacion... A pesar que escribiste ADRESL al estar en el banco 0 estas accediendo a ADRESH. Asi que lo considero "correcto". pero poco claro, pienso que deberias cambiar por ADRESH

Pero para que sea correcto y bien correcto, debes justificar la salida del ADC correctamente. Si usas alineado a la derecha ( bit7 del ADCON0 en 1) vas a tener los 2 mas significativos en ADRESH y los otros 8 en ADRESL. Para poder comparar correctamente vas a tener que rotar ADRESH y ADRESL hasta que quede solo 8 bits. Otra forma de hacer esto sin complicarse es justificarlo a la izquierda Ahora SI los valores mas importantes van a estar en ADRESH y podes compararlo directamente, sin importar lo que posea ADRESL.

Entonces tu problema era el justificado, al estar mal justificado el maximo que puede alcanzar ADRESH es 0b11 = 3, y por ende siemrpe va a ser baja tension.

Para solucionarlo solo debes cambiar el bit7 por un 0 en el ADCON0 (cuando se lo asignas al comienzo)

Cambia el ADRESL por ADRESH que es el nombre correcto, a pesar que ambos accedan al mismo lugar (Al seguir en el banco 0). Solo para que sea mas legible.


----------------------------------------------------------------------------------------------------------------------------------

Por otro lado te quiero hacer una propuesta y una posible correccion.

La propuesta es cambiar lo siguiente:
Código: ASM
  1. MOVLW B'11000011'               ;*** COMPARACION DE REGISTROS ***
  2. MOVWF REGISTROALTA              ;PARA SABER SI EL VALOR INGRESADO
  3. MOVF ADRESL,0                   ;ES ALTA O BAJA TENSION
  4. SUBWF REGISTROALTA,0
  5. BTFSC STATUS,Z                  ;SON DIFERENTES?
  6. GOTO  ALTATENSION               ;NO, VE A ALTA TENSION
  7. BTFSS STATUS,C                  ;SI, PREGUNTA SI W ES MAYOR QUE REGISTROALTA
  8. GOTO ALTATENSION                ;SI, VE A ALTA TENSION

No tiene sentido hacer todo eso... El registro "REGISTROALTA" lo unico que haces es comparar con el ADRESH y depositarle siempre el mismo valor, valor que NO cambia. Entonces... para que usar un registro para eso ? Directamente hago un SUBLW 0b11000011. Me explico:

Hacer esto:

Código: ASM
  1. MOVLW B'11000011'               ;*** COMPARACION DE REGISTROS ***
  2. MOVWF REGISTROALTA              ;PARA SABER SI EL VALOR INGRESADO
  3. MOVF ADRESL,0                   ;ES ALTA O BAJA TENSION
  4. SUBWF REGISTROALTA,0
Es hacer:
REGISTROALTA - W, Donde W = ADRESH. Entonces el resultado total es lo mismo que hacer REGISTROALTA - ADRESH,
REGISTROALTA = 0B11000011, por lo tanto finalemente tenemos que: 0b11000011 - ADRESH

Y que es lo mismo que hacer:
Código: ASM
  1. MOVF ADRESH, W
  2. SUBLW 0B11000011

Que es 0B11000011 - ADRESH

Por otro lado, estas comparando por este numero: '11000011' = 195. Y comparas por si es igual y mayor a ese numero, tenes que usar 2 comparaciones, primero usar la bandera Z y luego la bandera C... Pero si usas el valor 194 solo necesitas comparar por si es mayor nomas (Solo la bandera C ). Lo mismo ocurre para la baja tension. Entonces un solo BTFSS/C STATUS, C es suficiente para ambos casos.

Y finalmente la corrección que quería hacerte:

Luego de detectar la tension correcta, la mayoria de los protectores espera supongamos 5 segundos, hasta que este la tension normal.
Peeeeeeero.... Quiere decir que por 5 segundos la tension DEBE estar normal. Si ocurre un bajon cuando van 3 segundos y vuelve a normal, tiene que volver a iniciar los 5 segundos desde que se puso normal.
Tu codigo no hace esto, detectado el bajo voltaje, activa el led, pero a los 5s recien se fija si la tension esta normal, y puede que siga bajando y subiendo la luz en ese trayecto de los 5s y no va a tener problemas, pero si a los 5s la tension esta bien, va a mostrarte que esta normal y puede llegar a conectar un pequeño ratito.

Otro problema es que al iniciar el programa, inicias la conversion, esperas 5s, revisas la conversion.
Lo cual quiere decir que tu primera muestra en realidad es la de hace 5 segundos atras!!! Y no la actual. Las demas no hay problemas por el delay de 30us que tampoco deberia estar...

Muchas gracias, has solucionado mi problema, efectivamente si era un error de mi parte al intentar tomar el registro ADRESL cuando estaba en banco 0.. he lo grado solucionarlo haciendo algo un poco diferente pero me fue muy útil lo que me dijiste

También cambie un el código en la parte de la comparación que me sugeriste y funciona de maravilla y hace el programa mucho mas corto

Entiendo lo que me dices al final, esa parte aun no la he implementado ya que estaba tratando de lograr un programa que al menos cumpla la función requerida, ya mismo me pondré a trabajar para hacer las mejoras. Gracias de nuevo   :-/

Desconectado akira_ve

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 342
Re:Problema con PIC12F675 para Protector de Voltaje
« Respuesta #3 en: 11 de Mayo de 2022, 12:09:32 »
buenos dias amigo quisas es algo tarde para responderte pero en el año 2010 yo publique un corto trabajo respecto a ese tema aqui en la paguna

http://www.todopic.com.ar/foros/index.php?topic=31573.msg263637#msg263637
Si conocemos bien lo que tenemos y lo sabemos usar......se haran hasta cosas que e veces aseguran son imposibles

Venezuela


 

anything