TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: dogflu66 en 13 de Diciembre de 2008, 21:52:16

Título: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 21:52:16
Esta es una sección dedicada especialmente al microcontrolador de Microchip PIC12F675 que se inaugura con un automatismo práctico. Usaremos este componente como temporizador, a la vez que veremos cómo controlar la línea de 220AC.
 
El PIC12F675 es un microcontrolador, que como todos sus hermanos incorpora una serie de periféricos en su interior. Estos módulos son circuitos especializados. En sucesivos artículos iremos viendo con que módulos cuenta y como hacer uso de ellos, lo que nos dará  una idea de sus posibles aplicaciones.

Al igual que el resto de los PIC´s, están diseñados siguiendo la arquitectura Harvard, donde la memoria de datos está separada de la de programa. Y también son RISC (Reduced Instruction Set Computer), por lo que tienen un juego reducido de instrucciones, compuesto por solo 35 de ellas. Este valor puede variar, dependiendo de la familia a la que pertenezca un PIC en particular

El 12F675 pertenece a la familia de micros “enanos” de Microchip. Tiene solo 8 pines, 1024 Word de memoria Flash (también llamada memoria de programa), 64 Bytes de memoria RAM, 128 Bytes de memoria EEPROM y se puede conseguir en distintos encapsulados. Es económico, y aunque  solo tiene 6 pines aprovechables, se le puede sacar buen partido para usarlo como descarga de procesos de un microcontrolador más grande o como “cerebro” de distintos automatismos simples.
Título: Re: 12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 21:53:19
En este proyecto utilizaremos los siguientes módulos internos del PIC:

-El reloj interno trabajando a 4Mhz.
-El modulo de entradas y salidas (I/O).
-El modulo Watchdog (Perro Guardián), este modulo lo nombraremos como WDT.
-El Timer1.

Al utilizar su generador de reloj interno nos ahorramos el cristal de cuarzo y sus dos condensadores asociados.

Con su modulo I/O programado especialmente podremos setear la entrada de 220AC, controlar el encendido de dos testigos indicadores (diodos LED) y además activar un rele.

Los pines del modulo I/O se pueden configurar como entrada o salida digital, exceptuando el pin 4 (llamado GP3), que solo funciona como entrada. Como no lo usamos, lo conectaremos al plano de masa (GND). El resto de los pines que queden sin usar serán configurados como salidas y los dejaremos sin conexión o “al aire”. Y como seguramente habrán visto en la hoja de datos, las patitas del micro además del numero de orden del pinout también tiene nombre especifico (“GP” seguido de un numero). En este caso hay que tener especial cuidado ya que en esta familia se les da un nombre distinto al resto de familias de microprocesadores PIC.

Utilizando el modulo WDT nos aseguramos que se generará un RESET interno del PIC en caso de que se produzca algún bloqueo del programa causado por efectos desconocidos (normalmente ruido eléctrico). El modulo WDT necesita contar tiempo y lo hace reservándose para él el Timer0. Cuando el Timer0 se desborda, el WDT nos genera un RESET, así que para que esto no ocurra durante el funcionamiento normal del programa tenemos que borrar el WDT. Esto a su vez reiniciará el Timer0. Ésta operación tenemos que procurar hacerla antes que termine de contar el tiempo que se le programó.
Título: Re: 12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 21:54:27
Para refrescar el WDT se siguen tres sencillas reglas, y son las siguientes:

1)  Se comenzará a refrescarlo en la rutina principal del programa.
2)  A lo largo del programa se refrescará el menor número de veces posible.
3) Siempre se evitará refrescarlo en la rutina de interrupciones (si las hay).

El Timer1 lo utilizaremos para generar unas bases de tiempos que nos servirán para controlar el parpadeo de los led, refrescar las salidas y controlar cada cuanto tiempo se ejecutan las rutinas del programa en general.
 
Objetivos:
El propósito general de este automatismo es el de controlar un ventilador, usado como extractor para el cuarto de baño. El circuito tiene que cumplir tres requisitos básicos:

1º Cuando está en reposo, el automatismo no puede tener consumo alguno.
2º El circuito será controlado por un PIC “enano”, el PIC12F675
3º Deberá ser capaz de controlar un ventilador de 220AC o 12V/<180mA.

La función que realizará el circuito se llevara a cabo de la siguiente forma:

En el estado inicial, con el interruptor que controla la lámpara principal del baño en la posición de “abierto”,  el rele se encuentra en estado de reposo, tal como se ve en el esquema.

Al energizar la lámpara mediante el interruptor de la pared, queda también alimentado el circuito. El rele no se activa hasta pasados 30 segundos,  por lo que durante ese tiempo el circuito dependerá del interruptor de encendido de la lámpara del WC.

Pasados estos primeros 30 segundos queda en modo de lectura de la alimentación por la entrada GP2. Cuando el programa detecta que la alimentación cae, activa el rele aprovechando la carga de C6. De este modo todo el circuito pasa a estar alimentado directamente de la línea de 220VAC a través de los contactos del rele, comenzando un periodo de temporización de 2 minutos de duración.

Cuando este tiempo ha transcurrido, el PIC corta la alimentación del rele, y este pasa al estado de reposo. Si el interruptor de la pared que controla la lámpara está abierto, el circuito pierde la alimentación y todo queda sin energía. En caso de que el interruptor siga cerrado, el circuito espera 1 segundo y luego pasa de nuevo al modo de seteado de la alimentación, quedando en este estado de monitorización de la red eléctrica esperando a que esta desaparezca para comenzar una nueva temporizacion.
Título: Re: 12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 21:55:17
El funcionamiento del circuito:

Los conectores CN1 y CN2 se utilizan para alimentar el circuito desde la toma de la lámpara y para alimentar la lámpara respectivamente, para no tener que hacer modificaciones en la instalación eléctrica de la casa. El conector CN3 es una toma de corriente de 220 AC directa de red.

Cuando se activa el rele, sus contactos suministran la energía tanto al circuito como al ventilador 220VAC conectado al CN5, quedando todo alimentado desde la red de forma directa. R9 es un varistor de 275V, y es un estupendo filtro de red.

Después del puente rectificador pueden verse los condensadores C4 y C1, que son el filtro de la fuente. Siguiendo con el circuito del ventilador de CC, es muy importante colocar el condensador C3/10nF  para disminuir el ruido que genera el motor eléctrico y que es inyectado en la fuente. Este condensador tiene que estar lo mas cerca posible de los contactos del CN4.

Para que el PIC pueda comprobar la perdida de alimentación se usa un divisor de tensión compuesto por  R4 y R5, mas la capacidad C7 para dar algo de estabilidad a la señal. También nos aprovechamos del diodo interno limitador que tiene este pin y que nos limita la tensión (5.5v) que le llega desde el exterior. D1 y C6 nos permiten prolongar la alimentación del PIC frente a caídas de la alimentación. C4 tiene que ser de menor capacidad que  C6, y se añade R2 que ayuda a la descarga de C4, para hacer que en el caso de ausencia de tensión el PIC pueda detectar esta caída antes de quedarse sin alimentación. Sobre todo en el caso de no utilizar un ventilador de 12VDC.

IC2 es un conocido estabilizador de tensión de 5V/1A (7805CV),  que es complementado por C5.

Q1 se encargan de suministrar la corriente necesaria para alimentar el rele, ya que el microcontrolador no tiene suficiente potencia para hacerlo directamente.

D2 absorbe los picos inversos de corriente que se producen al alimentar la bobina del rele, no se puede suprimir del esquema, ya que el transistor seria destruido con el tiempo.

C2 es el condensador de desacople del PIC. Este condensador es tan valioso como el mismo PIC así que no se puede suprimir y ha de estar lo mas cerca posible de los pines de alimentación del integrado.

Los LEDs solo se utilizan para saber en que estado se encuentra el circuito (a la hora de programar esto nos ayuda mucho para encontrar errores en el código del programa), se pueden suprimir ya que el circuito estará oculto.
Título: Re: 12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 21:56:00
El calculo de las resistencias (R8, R7) limitadoras de los diodos LED se hará de la siguiente forma:

R = (5V-1.2V) /0.015A,

Este es un cálculo genérico, siendo 5V la tensión de alimentación, 1.2V el voltaje de la unión del diodo LED (que varía según su color), y por ultimo 0.015A es el la corriente que deseamos atraviese el LED.

Para calcular la resistencia (R1) de polarización del transistor se utiliza una formula también genérica:

R1 =  (5V-0.6V) / 0.001A,

Debemos  recordar que el valor de 0.001A solo es aproximado. Para estar seguros que el transistor estará trabajando en saturación, el proceso es tan simple como multiplicar el valor de la corriente de polarización (en este caso 1mA) por la ganancia en corriente del transistor (presente en su hoja de datos). 5V es la alimentación, y los 0.6V corresponden a la caída de tensión entre los extremos de la unión base/emisor de un transistor de silicio.

La resistencia limitadora R3 de 1/2W en serie con el motor limita los picos de tensión durante el arranque. Es recomendable colocarla cuando se trabaja con motores y las fuentes de alimentación están demasiado justas de corriente. Se encarga de limitar la corriente del motor durante el arranque ya que esta es muy elevada con respecto a la corriente de trabajo indicada en el ventilador por el fabricante.
Título: Re: 12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 22:01:45
El esquema:

(http://img183.imageshack.us/img183/8672/twc131foroze3.png)
Título: Re: 12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Diciembre de 2008, 22:04:41
El programa:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x318c
  2. Define CLOCK_FREQUENCY = 4
  3.  
  4. '*********************************************************************************************
  5. 'NOMBRE: Temporizador_WC_11
  6. 'MICRO: PIC12F675
  7. 'DESCRIPCION: Automatismo para el control de un ventilador de WC, deteccion por entrada digital
  8. 'FECHA/AUTOR: By COS, 09/06, 10/06, 05/08
  9. 'version 1.2, Se añade el calibrado del clock mediante el registro osccal
  10. 'version 1.1 soft, version 1.1 hard, compatible version 1.0 de soft con version 1.1 de hard
  11. 'Cambio del soft para emplear una entrada que detecta perdida de alimentacion en la lampara
  12. 'simplificacion del disparo del rele
  13. 'modificacion del sistema de control de las salidas
  14. 'se activa el WDT
  15. 'Version 1.0
  16. 'oscilador interno
  17. '**********************************************************************************************
  18. '************************ Declaracion de variables ******************
  19. DIM timer_base AS Word  'base patron para los timer
  20. DIM timer_base_aux AS Word  'establece el tiempo en mSeg, en el que se basaran los timer
  21. DIM contador AS Byte  'variable que controla la fase en la que se encuentran las temporizacines
  22. DIM timer1_sg AS Word  'primera base de tiempos, para el control de rutinas
  23. DIM timer1 AS Word  'indica el tiempo para la base timer_sg
  24. DIM led_flash_verde AS Byte  'permite que se ejecute la rutina que se
  25.                                                         'encarga del parpadeo del led verde
  26. DIM led_flash_rojo AS Byte  'permite que se ejecute la rutina que se
  27.                                                         'encarga del parpadeo del led rojo
  28. DIM flash_verde AS Byte  'indica dentro de la rutina si el proximo
  29.                                                         'estado del led apagado o encendido, verde
  30. DIM flash_rojo AS Byte  'indica dentro de la rutina si el proximo
  31.                                                         'estado del led apagado o encendido, rojo
  32. DIM rele AS Bit  'controla el estado del rele
  33. DIM ledverde AS Bit  'controla el estado del led verde
  34. DIM ledrojo AS Bit  'controla el estado del led rojo
  35. '************************* Asignacion de valores de las variables *******
  36. timer_base = 0  'inicializa el timer_base
  37. timer_base_aux = 1000  'establece el desbordamiento de timer_base, 1Seg
  38. contador = 0  'establece la fase cero del programa main
  39. timer1_sg = 0  'inicializa el timer1_sg
  40. timer1 = 30  'establece el desbordamiento de timer1_sg, 30Seg
  41. led_flash_verde = 1  'flash del led verde habilitado
  42. led_flash_rojo = 0  'flash del led rojo deshabilitado
  43. flash_verde = 0  'estado incial del flash del led verde
  44. flash_rojo = 0  'estado incial del flash del led rojo
  45. rele = 0  'estado inicial del rele, off
  46. ledverde = 1  'estado inicial del led verde, on
  47. ledrojo = 0  'estado incila del led rojo, off
  48. '************************ Inicializacion de registros generales y de E/S *********
  49. vrcon = 0x00  'vref off(power off the comparator voltage)
  50. ANSEL = 0x00  'off ADC
  51. trisio = 0x00  'tri-state pins, are outputs
  52. gpio = 0x00  'clear port
  53. gpio.5 = 1  'pin a 1, maniobra invertida, activa a cero
  54. gpio.4 = 1  'pin a 1, maniobra invertida, activa a cero
  55. gpio.1 = 1  'para mantener la compatibilidad con la ver. 1.0 de hard
  56. trisio.2 = 1  'GP2 pin, is input
  57. CMCON = 0x07  'comparator off
  58. GOSUB microchip_osccal
  59. WaitMs 10  'pausa de 10mSeg.
  60. '*********** habilitacion de interrupciones y programacion del timer1 ****
  61. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  62. T1CON.TMR1ON = 1  'bit de habilitacion del temporizador timer1
  63. T1CON.TMR1CS = 0  'bit de seleccion de reloj para el timer1, interno Fosc/4
  64. PIE1.TMR1IE = 1  'bit de habilitacion de interrupcion de TMR1 por rebose
  65. T1CON.T1CKPS0 = 0  'bit de seleccion del prescaler para el reloj del timer1
  66. T1CON.T1CKPS1 = 0  'bit de seleccion del prescaler para el reloj del timer1
  67. TMR1H = 0xfc  'carga el byte alto del registro del tiemr1 (1mSeg)
  68. TMR1L = 0x18  'carga el byte bajo del registro del timer1 (1mSeg)
  69. PIE1.TMR1IE = 1  'activa la interrupcion del timer1
  70. OPTION_REG.T0CS = 0  'selecciona reloj interno para el WDT
  71. OPTION_REG.PSA = 1  'asigna el prescales al WDT
  72. OPTION_REG.PS0 = 1  'bit de la seleccion del factor de division para el WDT
  73. OPTION_REG.PS1 = 1  'bit de la seleccion del factor de division para el WDT
  74. OPTION_REG.PS2 = 1  'bit de la seleccion del factor de division para el WDT
  75. INTCON.t0ie = 0  'deshabilito interrupcion por el trm0
  76. Enable  'INTCON.GIE habilita las interrupciones generales
  77. '************* Rutina del programa ***************************************
  78. main:
  79.         ASM:        clrwdt  'reinicializa el WDT
  80.         IF contador = 0 THEN  'primera fase del control de tiempos y maniobras
  81.                 IF timer1_sg >= timer1 THEN  'si pasan los primeros 30Seg.
  82.                         contador = 1  'permite la siguiente fase
  83.                         timer1 = 0  'configuara la base de tiempos con un nuevo valor 0Seg
  84.                         timer1_sg = 0  'activa la base de tiempos
  85.                         led_flash_verde = 0  'desconecta el parpadeo del led verde
  86.                         led_flash_rojo = 1  'conecta el parpadeo del led rojo
  87.                         ledverde = 0  'apaga el led verde
  88.                         ledrojo = 1  'prende el led rojo
  89.                         rele = 0  'desconecta el rele
  90.                 Endif
  91.         Endif
  92.         IF contador = 1 THEN  'segunda fase del control de tiempos y maniobras
  93.                 IF timer1_sg >= timer1 THEN  'cuando termina la base de tiempos
  94.                                                                         'segun el ultimo valor del timer1
  95.                         IF gpio.2 = 0 THEN  'comprueba que hay alimentacion en la fuente
  96.                                 contador = 2  'permite la siguiente fase
  97.                                 timer1 = 120  'carga la base de tiempos para que cuente 2minutos
  98.                                 timer1_sg = 0  'activa la base de tiempos
  99.                                 flash_verde = 1  'sincroniza el destello con el led rojo
  100.                                 flash_rojo = 1  'sincroniza el edestello con el led verde
  101.                                 led_flash_verde = 1  'permite el parpadeo del led verde
  102.                                 led_flash_rojo = 1  'permite el parpadeo del led rojo
  103.                                 ledverde = 1  'prende el led verde
  104.                                 ledrojo = 1  'prende el led rojo
  105.                                 rele = 1  'energiza la bobina del rele
  106.                         Endif
  107.                 Endif
  108.         Endif
  109.         IF contador = 2 THEN  'tercera fase del control de tiempos y maniobras
  110.                 IF timer1_sg >= timer1 THEN  'cuando pasan los 120seg.
  111.                         contador = 1  'se cambia de fase
  112.                         timer1 = 1  'se prepara la base de tiempos timer1_sg, para que cuente 1Seg.
  113.                         timer1_sg = 0  'activa el contaje de la base de tiempos timer1_sg
  114.                         rele = 0  'desconecta el rele
  115.                         flash_verde = 1  'encendido alternativo del led verde con respecto al rojo
  116.                         flash_rojo = 0  'encendido alternativo del led rojo con respecto al verde
  117.                         led_flash_verde = 1  'permite el parpadeo del led verde
  118.                         led_flash_rojo = 1  'permite el parpadeo del led rojo
  119.                         ledverde = 1  'activa el led verde
  120.                         ledrojo = 1  'activa el led rojo
  121.                 Endif
  122.         Endif
  123. GOTO main
  124. END                                              
  125. microchip_osccal:  'Carga OSCCAL con el valor de microchip, microchip lo graba en la ultima posicion flash
  126.         ASM:        bsf status,rp0
  127.         ASM:        CALL 3ffh
  128.         ASM:        movwf osccal
  129.         ASM:        bcf status,rp0
  130. RETURN  'Acota la rutina y retorna despues del salto
  131. ON Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
  132.         Save SYSTEM  'Guarda los valores del sistema
  133. '--------------------------------------RUTINA TIMER_1-----------------------------------------
  134.         IF ledverde = 1 THEN  'controla el estado de la salida del led verde
  135.                 gpio.5 = 0  'prende led verde
  136.         ELSE
  137.                 gpio.5 = 1  'apaga led verde
  138.         Endif
  139.         IF ledrojo = 1 THEN  'controla la salida del led rojo
  140.                 gpio.4 = 0  'prende led rojo
  141.         ELSE
  142.                 gpio.4 = 1  'apaga led rojo
  143.         Endif
  144.         IF rele = 1 THEN  'controla la salida del rele
  145.                 gpio.0 = 1  'energiza rele
  146.                 gpio.1 = 0  'energiza rele, compatibilidad con la ver. 1.0 de hard
  147.         ELSE
  148.                 gpio.0 = 0  'desconecta el rele
  149.                 gpio.1 = 1  'desconecta el rele, compatibilidad con la ver. 1.0 de hard
  150.         Endif
  151.         IF PIR1.TMR1IF = 1 THEN  'comprueba que es esta la interrupcion activa
  152.                                                                 '(por costumbre, en este caso solo hay una)
  153.                 timer_base = timer_base + 1  'se incrementa con cada desbordamiento del timer1
  154.                 IF timer_base >= timer_base_aux THEN  'control del numero de desbordamientos
  155.                                                                                                 'segun el valor de timer_base_aux
  156.                         IF timer1_sg < timer1 THEN timer1_sg = timer1_sg + 1  'base de tiempos timer1
  157.                         IF led_flash_verde > 0 THEN  'se encarga de hacer el led verde intermitente
  158.                                 IF flash_verde = 0 THEN  'controla el parpadeo del led verde
  159.                                         ledverde = 0  'conecta el verde
  160.                                         flash_verde = 1  'variable de control, permite que se conecte el verde
  161.                                 ELSE
  162.                                         ledverde = 1  'desconecta el verde
  163.                                         flash_verde = 0  'variable de control, controla el parpadeo
  164.                                 Endif
  165.                         Endif
  166.                         IF led_flash_rojo > 0 THEN  'se encarga de hacer el led rojo intermitente
  167.                                 IF flash_rojo = 0 THEN  'controla el parpadeo del rojo
  168.                                         ledrojo = 0  'conecta el led rojo
  169.                                         flash_rojo = 1  'variable de control, permite que se conecten los led
  170.                                 ELSE
  171.                                         ledrojo = 1  'desconecta el led rojo
  172.                                         flash_rojo = 0  'variable de control, controla el parpadeo
  173.                                 Endif
  174.  
  175.                         Endif
  176.                         timer_base = 0  'se reinicializa el valor de la base de tiempos patron
  177.                 Endif
  178.         Endif
  179.         TMR1H = 0xfc  'carga el registro del timer1, para que desborde cada 1mSeg.
  180.         TMR1L = 0x18
  181.         PIR1.TMR1IF = 0  'borra el flag de salto del tmr1
  182. RESUME  'activa las interrupciones y retorna al programa
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: xocas en 16 de Diciembre de 2008, 16:54:12
me encanta que hayas creado este tema porque entre otras cosas es el pic con el que más aprendí y con el que más agradecido me siento. no tengo duda de que con tu forma de ver las cosas, de programar y de enfrentarte a lo que pueda ir surgiendo más aprenderé  8) 8)

un saludo

pd: esto es un comentario, una opinión -la mía- que no aporta nada al tema, de manera que lo puedes borrar sin contemplaciones y nos centramos en lo que si importa...
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 20:43:35
Aún que quisiera (cosa que no quiero) no podría borrarlo porque no tengo privilegios especiales en este subforo. De todas formas como ya dijo alguien “no solo de pan y PIC vive el hombre”... también necesita alimentarse de un poco de “ego”, así que gracias amigo. :mrgreen:
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:36:06
Seguidamente podremos construir y practicar con una mini-entrenadora de muy bajo coste basada en el PIC12F675 o similares. Será una excelente herramienta para comenzar a experimentar con estas pequeñas maravillas de la técnica moderna.

.Descripción del circuito

Con el capitulo anterior pudimos ver una utilidad practica para el PIC12F675 y con este circuito tendremos una mini-entrenadora de reducidas dimensiones y de muy bajo coste pero esto no restara interés a sus posibilidades. Con ella podemos practicar sobre PWM, I/O, ADC y RS232.

La placa esta compuesta de varios puertos de entrada salida: El CN2 que nos permite descargar nuestros programas al micro directamente sin necesidad de extraerlo de su zócalo (ICSP, In Circuit Serial Programming), esto nos aportara una gran comodidad y un gran ahorro de tiempo. Por otro lado podremos conectar un servomotor Futaba S3003 en CN1 y de esta forma aprenderemos a controlarlo por modulación de ancho de pulso PWM (pulse-width modulation en inglés), también podremos colocar un sensor de temperatura LM35 entre otros dispositivos. El puerto serie RS232 trabajará en modo Tx, de esta forma se enviara información serial al PC lo que nos facilitara la tarea de depurado del programa o enviar datos para poder ser procesados por nuestro ordenador como puede ser mostrar una grafica de temperatura. La entrenadora tiene incorporado un diodo led que junto con la tecla miniatura alojada en la placa nos permitirá hacer practicas con el modulo de entradas y salidas digitales (I/O) del Pic y por supuesto una resistencia ajustable que nos permite interactuar con el convertidor analógico digital que es un modulo interno que lo llamaremos ADC (analogic to digital converter).
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:36:46
.Fundamentos, breve introducción antes de continuar:

Memoria:
Antes de seguir haremos un pequeño recordatorio a la memoria de programa (flash) del PIC, este PIC tiene una capacidad de flash de 1024 posiciones con una longitud cada una de 14Bit, cada posición de memoria contendrá  una instrucción completa en código nemotécnico, y esta instrucción necesita cuatro ciclos de reloj para poder ser procesada, exceptuando la de salto que necesita el doble. Pasando esto a números obtenemos lo siguiente: OSC/4, siendo OSC la velocidad del oscilador principal, en este caso el interno trabajando a 4Mhz, 4.000.000Hz/4=1.000.000Hz y, pasando a tiempo la frecuencia obtenida nos queda: 1/1.000.000Hz=0.000001Seg. = 1uSeg., esto significa que nuestro microcontrolador ejecutara 1 instrucción maquina por cada uSeg. Y para terminar con la memoria, indicaremos que el Pic12F675 es un microprocesador de 8bit, ya que generalmente se clasifican según la longitud de dato que maneja su juego de instrucciones maquina.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:38:09
Lenguajes de programación:
Para que nuestro hardware basado en el PIC12F675 pueda hacer alguna función predefinida por nosotros, tendremos que utilizar un lenguaje de programación en el que confeccionaremos una lista de instrucciones a ejecutar por el procesador interno de nuestro PIC y, que posteriormente volcaremos en su memoria flash, quedando residente en ella incluso después de desconectar la alimentación a nuestro circuito, en este caso nuestra placa entrenadora. Así que generalizando dividiremos los lenguajes de programación en dos grupos:

Lenguajes de bajo nivel o código maquina llamado “Assembler” (assembly language), que es el lenguaje natural del microcontrolador, es el lenguaje mas rápido y los programas ocupan menos memoria, pero la opinión general es que es el mas difícil de aprender, con el tiempo se pueden preparar bloques de rutinas especializadas para insertar en los programas y, facilitar el trabajo pero a partir de cierta longitud de programa no se suele utilizar o se mezcla con otro lenguaje de alto nivel, ya que el tiempo de programación y depuración a ciertas longitudes de programa lo hacen solo factible para verdaderos expertos en el. Como opinión personal recomiendo, que todo aquel que este interesado en el desarrollo de hardware basado en microcontroladores o miprocesadores lo estudie, sino a nivel experto si por lo menos a nivel básico, ya que implica comprender el modo de funcionamiento del micro y sus módulos internos de una forma muy eficaz y, que luego se podrá reflejar en nuestros diseños.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:38:42
Lenguaje de alto nivel, el lenguaje de alto nivel al contrario del assembler se aleja del lenguaje nativo del procesador y se acerca mas al nuestro, así que cuanto mas se parece en su sintaxis al nuestro de mas alto nivel es. En general el lenguaje aceptado por los programadores para los microcontroladores es el “C”, es un lenguaje cuyo compilador nos genera un código rápido y compacto, aunque su estructura puede crearnos alguna dificultad al principio. Es aceptado por la mayoría de los programadores para uso profesional aunque hay otros lenguajes no menos importantes. Y por ultimo llegamos al siempre polémico Basic, aunque la mayoría de los modernos lenguajes Basic (hay muchos dialectos), no tienen nada que ver con sus antiguas versiones de apenas  una década o menos, ha quedado clasificado como lenguaje de segundo orden. La característica principal del lenguaje Basic es que tiene una sintaxis muy similar a la nuestra, por lo que es rápido de aprender y de depurar su código, aunque esto se paga con unos programas algo mas lentos con algo también de mayor longitud al ser compilados.

En este caso usare el Basic del PIC Simulator IDE que nombrare como Basic PSI, el PSI es un entorno de trabajo que nos permite trabajar tanto en Basic como Assembler y, además contiene una serie de herramientas y componentes que nos permiten simular la mayoría de los programas generados con sus dos lenguajes. Una característica que lo hace interesante es que genera un código bastante compacto, por lo que permite trabajar con cierta libertad con micros de menos de 1024 Word de memoria de programa. El compilador Basic del PSI no tiene bug conocidos, por lo que no tenemos que preocuparnos de que se produzcan fallos en nuestras rutinas, y por ultimo la mas importante en este caso para el carácter didáctico de la revista, ya por experiencia después de llevar 5 años publicando los programas que controlan mis proyectos con él, tiene un carácter universal que lo hace comprensible por aficionados y profesionales, no importando el lenguaje usado habitualmente.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:39:30
Programadores:
Para poder continuar necesitamos unos conocimientos básicos sobre programadores de PIC, ya que necesitaremos de hacernos con uno de ellos, para poder volcar nuestros programas desde el PC a nuestra placa entrenadora. El programador o también conocido como “quemador”, esta compuesto generalmente de dos partes, de un hardware que contiene la circuiteria necesaria para poder conectarse a nuestro PIC y, poder transferir nuestro programa a el, el “hard” del programador se complementa con un software que se ejecuta en nuestro ordenador, este software nos transfiere el archivo generado por el compilador de nuestro lenguaje respetando un protocolo determinado, este archivo pasa por el “hard” del programador que lo convierte a señales comprensibles por nuestro PIC. Así que para transferir nuestro programa tenemos que conectar el programador físicamente al PIC. Esto se puede hacer de varias formas, ya sea que el programador tenga un zócalo en su circuito impreso para poder insertar el PIC para ser programado y, vuelto a colocar en nuestro circuito, o por ejemplo, como la entrenadora que tratamos en este capitulo. En ella conectamos el programador mediante un cable de cinta plana con unos conectores, y de esta manera no tenemos que extraer el micro de nuestra placa. El “soft” de nuestro programador tiene que ser configurado, para indicarle que modelo de PIC estamos utilizando, y la configuracion de pin del hard del mismo, en el caso de ser un programador paralelo. Hay muchos programadores completos de uso libre que circulan por la red,  por lo que no suele ser un grave problema de fabricar o comprar alguno.
Por comodidad utilizo una versión adaptada por mí de uno de los varios que se pueden obtener en la pagina del PSI (http://www.oshonsoft.com/picprog.html). Desde el software del programador puedo activar o desactivar la alimentación del micro de la entrenadora, así como enviarle un Reset. Por supuesto que hay que tener en cuenta, que hay muchos tipos de programadores ya estén integrados en la misma placa de nuestro proyecto, o ya sean programadores de un nivel mas profesional que suelen llevar un gran numero de funciones, que están gobernados por un microcontrolador ellos mismos, de todas formas a saber, tanto si utilizamos un tipo u otro, ambos nos programaran nuestro PIC.
Nuestra placa entrenadora se conecta al “hard” de nuestro programador mediante 5 hilos, dicha conexión se realiza mediante CN2 que corresponde: Vpp (5Vdc) esta tensión de alimentación la controla el programador y, para esto cambiaremos de posición JP2 (uniones 2 y 3) en la placa (no es necesario para todos los programadores), tenemos Vss que corresponde a GND del circuito, Data por donde se transfieren los datos al PIC, Clock que sincroniza la información que fluye entre programador y PIC, por ultimo y no menos importante, la señal de un relativo alto voltaje (en este caso superior a 13V, en otros programadores puede ser inferior, a partir de 11V). Indica a nuestro micro que entre en modo programación y, siendo controlándola por nosotros desde el PC provoca un bloqueo del PIC y Reset.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:48:32
Recreacion 3D de un programador:

(http://img168.imageshack.us/img168/3448/imagen1nu7.png)
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 21:54:10
La mini-controladora montada:

(http://img385.imageshack.us/img385/4978/imagen2ft7.png)

El esquema de la MiniEbasic:

(http://img509.imageshack.us/img509/4282/imagen3foropd6.png)
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Javicho en 16 de Diciembre de 2008, 22:01:52
Buena iniciativa amigo dogflu66, aprovechando queria preguntarte según el esquema que colocaste, parece que D1 viene despues del puente rectificador por tal ya no seria muy necesario colocarlo no? y en el pin GP2 hay un divisor de tensión partiendo de 12V entonces al pic le llegan 6v?

Este buen hilo será bien acogido por todos los interesados, adelante dogflu66.

Javicho.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 22:15:44
Estamos hablando del primer circuito:

D1 es necesario, permite que se descargue primero C1 antes que C6, esto permite que el PIC siga funcionan durante unos instantes aun que no haya alimentación. "Esto es fundamental para que funcione el circuito"

GP2 esta conectado a un divisor de tensión, en realidad con solo una resistencia en serie es suficiente, ya que el PIC tiene dos diodos internos conectados en antiparalelo que evitan que suba el voltaje por encima de 5.5V

PD. "Cuidado", no todos los pin del pic tienen estos diodos internos.

Otro PD. En la practica se podria conectar este pin a 220V a travéz de una R de 2M.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 22:22:37
.Descripción general del circuito:

Comenzaremos con la descripción del circuito, desde la fuente de alimentación. Esta compuesta por un jack de alimentación para circuito impreso J1 por donde entra la alimentación de 9Vdc, pasando en serie por el puente JP1 y D1, JP1 hace de interruptor y D1 nos protege de una posible inversión de polaridad de la misma, los condensadores C2 y C3 ayudan al filtrado de la alimentación, R8 es la resistencia limitadora del LED1  de color verde 3mm trabajando como testigo de la alimentación, seguidamente pasamos al popular estabilizador de 1Amp. LM7805CV (U2) que nos reduce y estabiliza la tensión de entrada a 5Vdc y, estando su salida filtrada por C4 y C5 además C5 igual que C3 ayuda a la demanda de corriente instantánea de nuestra placa. El resto de componentes van asociados directamente al microcontrolador PIC12F675, siendo D1 la protección contra inversión de polaridad proveniente del conector CN2, que es el encargado de dar conexión a nuestro micro con el programador. JP2 permite seleccionar si la alimentación de nuestro circuito será suministrado por el programador o por la fuente interna de nuestra placa. La R3 y R2 polarizan las líneas de Datos y Clock del PIC, podrían eliminarse del esquema, siempre y cuando programásemos como salidas sus respectivos pin del micro en nuestros programas, sin embargo R1 no puede ser eliminada del circuito, porque el pin del Pic asociado a Vpp no puede ser programado como salida digital. Y siempre aplicando la norma de no dejar sin conexión o al aire ninguna entrada CMOS. C1 es el condensador de desacople de la alimentación del PIC. Para trabajar con el ADC usaremos el RAJ2 con el que podremos variar la tensión en el pin asociado, mediante R4 y C7 constituimos un circuito atenuador de las pequeñas variaciones de resistencia inherentes a la película de carbón de RAJ2, hay que tener en cuenta que otra función importante de R4 es la de proteger al micro, en el caso que olvidemos de configurar este pin (GP2) como entrada, ya que si lo configuramos como salida este tendrá que estar en estado alto o bajo y, hay que tener en cuenta que el cursor de RAJ2 puede llegar también a estar en uno de estos dos estados, y si se diera la coincidencia de que el cursor quedara en un estado contrario, habría una lucha de niveles entre RAJ2 y el Pic, llegando seguramente al deterioro de uno de los dos componentes, claro esta que esto llegaría a pasar si no estuviera R4 para impedirlo. S1 es una tecla miniatura para soldar directamente en circuito impreso. Comparte pin con R4 y C7 mediante R10, en este caso la función de R10 es similar a la de R4, tanto para atenuar la lucha de niveles entre GP2 (en caso de ser programada como salida en estado alto y, al mismo tiempo S1 estando pulsado) y, además otra función añadida, la de atenuar la descarga de C7 a través de S1. Otra utilidad de RAJ2 es la de polarizar a estado alto al micropulsador, llevando su cursor a positivo para que de esta forma al ser pulsado S1, pueda variar el estado de su pin asociado y que programaremos como entrada. Pasando a otra parte del circuito tenemos R9 que es la resistencia limitadora del LED2, de color rojo 3mm, al que podremos encender o apagar a voluntad en nuestros experimentos. El pin que lo controla esta compartido con CN1, donde podremos conectar directamente un servomotor Futaba 3003, entre otros dispositivos. C6 nos permitirá atender las demandas instantáneas de corriente del servomotor. Pasando finalmente a la descripción de nuestro adaptador optoacoplado, de señal TTL a niveles de RS232 funcionando solo como Tx. R5 es la resistencia limitadora del led interno al U3 el cual mediante GP5 controla al transistor también interno al U3, que se encarga de acoplar nuestro Pic al puerto serie RS232 de nuestro ordenador. R7 suministra el estado alto RS232 desde el mismo puerto serie (DTR) del ordenador y, R6 suministra el estado bajo RS232 desde GND_RS del ordenador, quedando el puerto total mente aislado de nuestro circuito.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Javicho en 16 de Diciembre de 2008, 22:34:54
GP2 esta conectado a un divisor de tensión, en realidad con solo una resistencia en serie es suficiente, ya que el PIC tiene dos diodos internos conectados en antiparalelo que evitan que suba el voltaje por encima de 5.5V

Has comprobado con multimetro que efectivamente hay 5.5V ahi?

Javicho.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 16 de Diciembre de 2008, 22:45:48
Pues esto es un dato de libro, pero creo recordar que si lo he comprobado.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:50:56
.Tema

Seguidamente aprenderemos como configurar el puerto serial RS232 (solo Tx) de la entrenadora para de esta forma poder transferir información a nuestro ordenador, como pueden ser datos de temperatura que posteriormente podremos procesar en el PC si lo deseamos. En principio la función principal del puerto RS232 (Tx) de nuestra entrenadora será la utilidad de depurado de nuestros programas. Para poder poner en marcha este puerto antes debemos conocer unos detalles técnicos de este microcontrolador. El PIC12F675 no contiene modulo interno UAR (UAR por Hardware) por lo que el puerto será emulado por Software. La utilización de esta emulación de UAR por “Soft” es muy fácil y rápida de implementar en este lenguaje ya que solo basta con utilizar un par de funciones del propio lenguaje, una para indicar si los datos serán de entrada “Rx” y la otra de salida “Tx” (en este caso) , seguidos del PIN que se utilizará como línea de datos de Tx, velocidad en baudios del puerto y a continuación los datos a ser enviados. Otro punto a tener en cuenta cuando se utiliza la emulación UAR es que se generan BIT  de una duración determinada, esto requiere poder medir tiempo con una precisión que el oscilador interno del PIC  no tiene. Por suerte para nosotros lo ha tenido en cuenta el fabricante del chip que lo a dotado de un registro interno para la compensación del error.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:52:46
El error puede llegar a ser de +/-200Khz. El registro que nos permite calibrar el oscilador interno del PIC se llama OSCCAL y, hay que tener presente que para otra familia de PIC el nombre del registro será distinto e incluso puede que no exista. El registro de calibrado OSCCAL tiene una longitud de 8 BIT pero solo utiliza los 6 de mayor peso, siendo el estado de los dos de menor peso indiferente. Microchip, que es el fabricante del microcontrolador que utilizamos, nos suministra el valor de calibrado del registro en el propio “micro”, este valor lo graba en la ultima posición de memoria de la FLASH (memoria de programa) del PIC y es distinto para cada microcontrolador. El valor de calibración no es cargado por el propio “micro”, por lo que si se quiere utilizar el usuario tendrá que ocuparse de esta operación añadiendo una rutina en el programa que realice este trabajo. El propio fabricante indica en el Datasheet del PIC como hacerlo y también indica que el margen de error con este valor queda <2%.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:54:10
.Finalizando con el registro OSCCAL
La localización del valor de OSCCAL es guarda por el fabricante en la ultima dirección de la memoria FLASH 0x3FF del PIC, como ya se indico anteriormente pertenece a la memoria de programa y es la ultima dirección que contiene una instrucción ejecutable, la longitud de cada una de las 35 instrucciones que tiene este “micro” es de 14 BIT. Los 6 BIT  más significativos de cada instrucción corresponden al código equivalente en nemotécnico y los 8 restantes menos significativos contienen el valor del dato, en este caso el valor de calibración. La instrucción que nos encontraremos en la posición 0x3FF es “RETLW xx” (34xx Hex.) donde xx es el valor de calibración expresado en hexadecima
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:54:41
Si el programa de control de nuestro programador permite configurarlo para que nos salvaguarde este valor cada vez que hacemos una operación que afecte a la memoria de programa, activaremos la opción en él, o en su defecto, hacer como primera operación con el PIC una lectura de su memoria Flash y una vez localizado el valor imprimir y pegarlo en el PIC. Paso seguido visualizaremos un programa en lenguaje Assembler que se encargará de ejecutar la ultima instrucción de la FLASH y guardar el valor en el registro OSCCAL.

Lenguaje en código maquina que recomienda Microchip en el Datasheet del PIC12F675:

BSF STATUS, RP0 ;Selecciona Banco 1.
CALL 0x3FF ;Leer el valor de calibración.
MOVWF OSCCAL ;Mover el valor al registro de calibración.
BCF STATUS, RP0 ;Retornamos al Banc
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:55:17
.PERIFERICO (comparador de tensión)

Como ya dijo alguien en alguna ocasión “No solo de PIC vive el hombre”, y para seguir con el carácter didáctico de la revista supondremos que hemos perdido el valor de calibración del oscilador y construiremos un periférico que nos permitirá recuperar el valor con una desviación aproximada del 0.15% inferior a la de Microchip. En este caso construiremos un generador de onda cuadrada de frecuencia conocida, basado en la red eléctrica española a 50Hz. Al utilizar la red no necesitaremos ajuste alguno en nuestro generador. Por supuesto se puede utilizar cualquier otro dispositivo que tengamos ya sea un generador comercial o simplemente un circuito astable basado en el popular 555, pero en este ultimo necesitaremos un instrumento para su calibrado.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:55:59
.Medición  del ancho de pulso de una señal de onda cuadrada de 50Hz

Mediante un comparador construido con un amplificador operacional (lo nombraremos como OP) CA3140 que permite operar con simple tensión. La señal se extrae de la red domestica 220VAC aislada y reducida mediante un pequeño transformador 220VAC a 12VAC. La tensión es convertida y acondicionada por el OP siendo suministrada por este a la entrada del PIC con valores TTL.

El comparador de tensión es un detector, estos circuitos se suelen usar para detectar una determinada tensión. Esta tensión es fijada por nosotros. La señal de salida solamente tiene dos valores posibles según el voltaje que se compare sea mayor o menor al de referencia. En este caso la referencia es masa o cero, y al estar el OP trabajando con simple tensión los dos valores de tensión suministrados serán de 0V y <+5V.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 19:56:29
En este caso la finalidad del comparador es tan solo la de convertir una senoidal en onda cuadrada con niveles TTL. Como se ha mencionado el circuito es simplemente un detector. Así que el terminal negativo del OP se conecta a través de una resistencia de 100K a un pin del secundario del transformador y el otro pin del Transf. será conectado a masa, quedando la señal de 50Hz unida a nuestro circuito. La entrada positiva del OP se unirá directamente a masa o negativo. Siempre que la señal de entrada sea mayor que masa, la salida será el voltaje de saturación negativo (en este caso 0V). Si la entrada es cero o menor, la salida es la saturación positiva del amplificador (en este caso <+5V). De igual forma se puede transformar cualquier tipo de señal periódica en una onda cuadrada de la misma frecuencia. Como este tipo de transformadores tienden a dar un nivel de tensión mucho más elevado del indicado por el fabricante cuando trabajan en vacío y, teniendo en cuenta que el consumo de la entrada del OP es despreciable, R1 limita la corriente y los diodos D1 y D2 limitan el voltaje quedando el pin 2 del OP protegido de sobretensiones provenientes del transformador.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 20:07:09
Recreación 3D del generador de frecuencia 50Hz:

(http://img509.imageshack.us/img509/4241/mebasiccalibradoosccal3qf6.png)
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 20:15:38
El esquema del circuito:

(http://img136.imageshack.us/img136/5050/mebasicosccalesquemafornb1.png)
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 20:17:40
Nota: Es fudamental proteger la parte inferior de nuestro circuito generador por lo menos con una lamina dieléctrica de cierto grosor para no recibir  descarga eléctrica peligrosas de la red.

.El programa:

Código: QBasic/QuickBASIC
  1. Define CONF_WORD = 0x31c4  'Palabra de configuración Bit (Fuses)
  2. Define CLOCK_FREQUENCY = 4  'Frecuencia del reloj 4 Mhz
  3. '**********************************************************************
  4. 'NOMBRE: 12F675_OSCCAL_TIMER1_RS232_ICSP
  5. 'MICRO: PIC12F675, 4Mhz Interno
  6. 'DESCRIPCION: Circuito para la calibración del oscilador interno OSCCAL
  7. 'FECHA/AUTOR: By COS, 01/08
  8. 'Versión 1.1
  9. 'Lectura de una entrada digital
  10. 'Uso del timer1 como contador
  11. 'Habilitación de un puerto RS232 optoacoplado, por software (simulación)
  12. 'Configuración del hyperterminal del PC: Bit por segundo -> 2400, Bits de datos -> 8,
  13. 'Paridad ->Ninguna, Bits de parada -> 1, Control de flujo -> Ninguno
  14. 'Programación del microcontrolador en placa (ICSP)
  15. '**********************************************************************
  16. Define SEROUT_DELAYUS = 0  'Serout sin demoras entre bytes
  17. '************************ Declaración de variables *************************
  18. DIM db_timer1 AS Word  'Tiempo en uSeg., periodo de la señal 50hz/2
  19. DIM timer1 AS Word  'Contendrá el valor de los registros del timer1
  20. DIM m_timer1 AS Word  'Variable auxiliar
  21. DIM m1_timer1 AS Word  'Variable auxiliar
  22. DIM vosccal AS Byte  'Valor a programar en el registro OSCCAL
  23. DIM m_vosccal AS Byte  'Variable auxiliar
  24. DIM flag AS Byte  'Variable auxiliar
  25. '******************* Asignación de valores a las variables *******************
  26. db_timer1 = 10000  'Periodo/2
  27. vosccal = 0  'Valor inicial de OSCCAL
  28. flag = 0  'según su valor cambia el flujo del programa
  29. '**************** Configuración módulos generales (E/S) *******************
  30. CMCON = 0x07  'comparator off
  31. VRCON = 0x00  'vref off, comparador
  32. ANSEL = %00000000  'pin digitales
  33. OSCCAL = vosccal  '91  'calibración del oscilador interno
  34. TRISIO = 0xff  'tri-state pins, entradas
  35. TRISIO.4 = 0  'GP4 pin, como salida, Tx puerto serie
  36. TRISIO.5 = 1  'GP5 pin, como entrada
  37. '********************* Configuración del Timer1 **************************
  38. T1CON.TMR1CS = 0  'bit de selección de reloj para el timer1, interno Fosc/4
  39. T1CON.T1CKPS0 = 0  'bit de selección del prescaler para el reloj del timer1
  40. T1CON.T1CKPS1 = 0  'bit de selección del prescaler para el reloj del timer1
  41. T1CON.TMR1ON = 0  'parado el contador del TMR1
  42. PIE1.TMR1IE = 0  'desactiva las interrupciones del timer1
  43. '--------------------------------------Main Programa ------------------------------
  44. WaitMs 5000  'espera 5Seg.
  45. main:  'Rutina del programa principal (inicio)
  46.         IF GPIO.2 = 0 THEN GOSUB microchip_osccal  'Si pulsa tecla salto y retorno
  47.         TMR1H = 0x00  'borro el registro alto del timer1
  48.         TMR1L = 0x00  'borro el registro bajo del timer1
  49.         'Sincronizamos la señal externa con la rutina de lectura del programa___
  50.         WHILE GPIO.5 = 1  'mientras GPIO.5 este en estado alto no hago nada
  51.         WEND  'Acota el bucle While, anterior
  52.         WHILE GPIO.5 = 0  'mientras GPIO.5 este en estado bajo no hago nada
  53.         WEND  'Acota el bucle While, anterior
  54.         '_______________________________________________________________
  55.         T1CON.TMR1ON = 1  'activa el contador del TMR1
  56.         WHILE GPIO.5 = 1  'mientras GPIO.5 esta en estado alto no hacemos nada.
  57.         WEND  'Acota el bucle While, anterior
  58.         T1CON.TMR1ON = 0  'para el contador del TMR1
  59.         timer1.HB = TMR1H  'Carga byte alto con valor alto del registro del timer1
  60.         timer1.LB = TMR1L  'Carga byte bajo con valor byte low del reg. timer1
  61.         GOSUB ser_out  'Salto con retorno a la subrutina ser_out
  62.         IF flag > 1 THEN WaitMs 1000  'Lento prog. cuando conoce valor OSCCAL
  63.         IF flag < 2 THEN  'Permite paso 2 del calculo de OSCCAL
  64.                 IF timer1 > db_timer1 THEN
  65.                         flag = 2  'Indica que termina el paso 2
  66.                         timer1 = timer1 - db_timer1  'Se almacena el error del timer1
  67.                         IF timer1 > m_timer1 THEN vosccal = vosccal - 1  'comprar. errores últimos
  68.                         IF timer1 <= m_timer1 THEN vosccal = vosccal  'comparan errores últimos
  69.                 Endif  'Acota if, según tabulado
  70.         Endif  'Acota if, según tabulado
  71.         IF flag < 1 THEN  'Paso uno del calculo de OSCCAL
  72.                 IF timer1 < db_timer1 THEN  'Si se da la condición
  73.                         vosccal = vosccal + 1  'incrementamos vosccal
  74.                         m_timer1 = db_timer1 - timer1  'Se almacena el error del timer1
  75.                 Endif  'Acota if, según tabulado
  76.         Endif  'Acota if, según tabulado
  77.         OSCCAL = vosccal  'Escribe el valor de la variable vosccal en el registro OSCCAL
  78. GOTO main  'Redirecciona el flujo del programa al inicio
  79. END  'Fin del programa                            
  80. '****************************************************************************
  81. ser_out:  'Simulación de puerto serie por software
  82.         'Envía los datos al puerto serie (literales, variables y carácter de control)
  83.         Serout GPIO.4, 2400, CrLf, "Timer1: ", #timer1, " OSCCAL: ", #vosccal, CrLf
  84.         'CrLf, Avance de línea y retorno de carro para el hyperterminal del PC
  85. RETURN  'Acota la rutina y retorna después del salto
  86. microchip_osccal:  'Carga OSCCAL con el valor de microchip
  87.         ASM:        bsf status,rp0
  88.         ASM:        CALL 3ffh
  89.         ASM:        movwf vosccal
  90.         ASM:        bcf status,rp0
  91.         OSCCAL = vosccal  'Carga el registro con el valor de vosccal
  92.         flag = 2  'Indica que se encontró el valor de OSCCAL
  93. RETURN  'Acota la rutina y retorna después del salto
  94. END  'Fin de subrutinas
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 17 de Diciembre de 2008, 20:18:41
Con el programa anterior obtendremos los siguientes resultados:

El programa va midiendo el ancho de pulso previamente conocido de la señal de onda cuadrada, a la vez  que se producen incrementos de una unidad del registro OSCCAL  partiendo este desde de cero. Su valor es enviado por el puerto serie en base decimal hasta el hyperterminal u otro programa terminal serie que dispongamos. Al principio lo más normal es no divisar ningún dato hasta que el error entre dentro del margen de tolerancia permitido de la UAR del ordenador para 2400Baudios. El valor terminará parándose en el más próximo, muy por de bajo del 1% aproximadamente un 0.15%. Si pulsamos la tecla (para que la tecla sea leída correctamente por el PIC, previamente la resistencia ajustable estará a su máximo recorrido en sentido del movimiento de las agujas del reloj) del mini entrenador (MnEBasic) veremos en la pantalla del PC el valor para OSCCAL que nos suministra el fabricante, siempre y cuando no lo perdiéramos previamente.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Chrisbaf en 19 de Diciembre de 2008, 03:50:44
Gracias por tomaar la iniciativa y tomarte tiempo para que todos sigamos aprendiendo , felicitaciones por
que esta muy claro todo lo que vas exponiendo y muy didactico ..gracias. :lol:
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 20 de Diciembre de 2008, 23:11:39
Gracias Chrisbaf

Dejo el enlace al video en el que se ve los resultados del programa anterior.
Al principio la mini entrenadora esta bloqueada por la señal Vpp que nos genera el programador, cuando se desactiva esta tensión la placa mini entrenadora se pone a trabajar y podemos ver un tiempo en el que el hyperterminal no muestra nada, esto es porque los valores que se van cargando en el registro OSCCAL todavía no permiten que el reloj interno trabaje dentro del margen de tolerancia de la UAR del PC. A los pocos segundos ya podemos ver información en la pantalla mostrándonos valores validos para el registro. Podremos ver que al final queda estabilizado en el mejor valor, en este caso 84 en decimal (54h).

Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Chrisbaf en 13 de Enero de 2009, 00:30:01
no se si continuaras  con proyectos para este micro.. saludos
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 13 de Enero de 2009, 16:24:42
no se si continuaras  con proyectos para este micro.. saludos

Por supuesto que voy a seguir el tema, tengo ya varios artículos medio armados a ver si puedo dedicarle un poco de tiempo. Gracias por el interés.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Chrisbaf en 13 de Enero de 2009, 17:34:19
gracias por tu pronta respuesta :o
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: willie_rosario_salsa en 13 de Febrero de 2009, 12:42:17
Hola estimado dogflu
Ante todo gracias por tus interesantes aportes, de verdad quiero que me ayudes con una duda que tengo, es la primera vez que tranbajo con el 12F675 y aque por cuestiones de diseño he tenido que optimizar espacio y me vi obligado a utilizar el baby pic..
Las lineas de configuración creo que están bien ya que en Proteus esto va de maravilla como lo he programado y en realidad es la primera vez que tengo problemas con 1 pic, debe ser porque es la primera vez que lo uso y es un poco diferente a los 877..

La configuración es la siguiente:
Setear
               BCF            RP_0
      BCF      RP_1
            clrf            GPIO       ;Inicio GPIO
      movlw    07h               ;Set GP<2:0> to
      movwf    CMCON       ;digital IO
      BSF            RP_0              ;bank_1
      clrf            ANSEL       ;Digital I/O
      movlw    b'00001000'       ;
      movwf    TRISIO       ;set solo el mclr ya que el resto las necesito como salidas
        movlw   b'11001111'
      movwf   OPTION_REG   ;programación para WDT y pull ups
      call            3FFh               ;Agarra el valor para
      movwf    OSCCAL       ;Calibrar el oscilador interno (segun las notas de este pic)
               BCF            RP_0              ;bank_0

De veras este programa lo he analizado :ni) hasta la saciedad y lo he configurado de muchas maneras, inclusive quitando el osc int y colocando el RC, pero nada.. No se si sea 1 detalle que se me escape o algo así..

Agradeceré millón sus valiosísimos comentarios..
Con SaLsa,


 
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Chrisbaf en 13 de Febrero de 2009, 17:59:24
disculpa la pregunta, que tiene que hacer tu programa,pues solo miro el principio.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: willie_rosario_salsa en 13 de Febrero de 2009, 18:29:56
En realidad estoy haciendo un reseteador, el cual arranca con una lampara de encendido (bsf  lamp_on) que no es mas que un indicador que nos dice si esta vivo el pic y luego hace la rutina normal que funciona correctamente en el simulador(Reset general de una red de pics) pero el problema es que no enciende, el bit de configuración que estoy metiendo es el 3F84 al grabar el pic pero no me funca esa vaina..

Alguna sugerencia especial para este pic agradecera su ayuda!!!!!!!! :-/
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 18 de Febrero de 2009, 21:27:10
El código maquina no es precisamente mi lenguaje favorito, pero le estoy echando un vistazo a ver. Es que estos últimos días voy con muy poco tiempo.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 06 de Marzo de 2009, 20:07:23
Hola estimado dogflu
Ante todo gracias por tus interesantes aportes, de verdad quiero que me ayudes con una duda que tengo, es la primera vez que tranbajo con el 12F675 y aque por cuestiones de diseño he tenido que optimizar espacio y me vi obligado a utilizar el baby pic..
Las lineas de configuración creo que están bien ya que en Proteus esto va de maravilla como lo he programado y en realidad es la primera vez que tengo problemas con 1 pic, debe ser porque es la primera vez que lo uso y es un poco diferente a los 877..

La configuración es la siguiente:
Setear
               BCF            RP_0
      BCF      RP_1
            clrf            GPIO       ;Inicio GPIO
      movlw    07h               ;Set GP<2:0> to
      movwf    CMCON       ;digital IO
      BSF            RP_0              ;bank_1
      clrf            ANSEL       ;Digital I/O
      movlw    b'00001000'       ;
      movwf    TRISIO       ;set solo el mclr ya que el resto las necesito como salidas
        movlw   b'11001111'
      movwf   OPTION_REG   ;programación para WDT y pull ups
      call            3FFh               ;Agarra el valor para
      movwf    OSCCAL       ;Calibrar el oscilador interno (segun las notas de este pic)
               BCF            RP_0              ;bank_0

De veras este programa lo he analizado :ni) hasta la saciedad y lo he configurado de muchas maneras, inclusive quitando el osc int y colocando el RC, pero nada.. No se si sea 1 detalle que se me escape o algo así..

Agradeceré millón sus valiosísimos comentarios..
Con SaLsa,


 

A ver si te sirve algo de esto:

; oscilador interno a 4Mhz
   BSF STATUS,RP0
   MOVLW 0x38
   MOVWF 0x10
; vref off (power off the comparator voltage)
   CLRF 0x19
; Pin digitales
   CLRF 0x1F
; comparator off
   BCF STATUS,RP0
   MOVLW 0x07
   MOVWF 0x19
; Enable PORT pullups
   BSF STATUS,RP0
   BCF 0x01,7
; tri-state pins, are inputs
   MOVLW 0xFF
   MOVWF 0x05
; GP4 pin, is output
   BCF 0x05,4
; GP5 PIN, is output
   BCF 0x05,5
; maniobra invertida, activa a cero
   BCF STATUS,RP0
   BSF 0x05,5
; GPIO.4 = 0 'Uart por soft
   BCF 0x05,4
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: xocas en 14 de Marzo de 2009, 15:13:57
amigo dogflu hace tiempo, mucho tiempo, que no te pregunto nada, y ya lo echaba de menos  8) 8)

nunca he llegado a saber con certeza la influencia del bandgap y nunca encontré información que me lo aclarara lo suficiente. según el datasheet son bits preprogramados de fábrica y no se deben alterar, y también se dice en el datasheet que sirven como configuración para BOD y POR... y ahí me quedo.

y la pregunta:
- leyendo un 12F675 'virgen' con el GTP-USB+ y Winpic800 me da un valor de bandgap '00 = Lowest'
- configuro el registro Configuration Word con las mismas opciones que usas y me da un valor de 0x01C4 ( %00000111000100 )

sin embargo, y creo que lo hace siempre, PSI escribe el valor 0x31C4 en este registro con las mismas opciones seleccionadas, correspondiente a un valor de bandgap '11 = Highest' ( %11000111000100 ) y me gustaría saber que influencia puede tener y porqué lo hace así

GTP-USB+ y Winpic800 se encargan de guardar este valor (al igual que el valor del oscilador local) para restaurarlos posteriormente al PIC cuando se graba.

y eso es todo y no es poco.

un saludo
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 18 de Marzo de 2009, 20:56:41
Perdona Joaquin, pero di como leídos los hilos el otro dia sin querer y no me di cuenta que estabas por aqui.
La verdad es que no me he planteado nada de esto, pero voy a ver que averiguo.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: xocas en 19 de Marzo de 2009, 14:52:22
no te preocupes...

es como una espina que tengo clavada y no doy con la información que me ayude a quitarla  8) 8)

un cordial saludo
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Chrisbaf en 19 de Julio de 2009, 21:48:45
una pregunta dogflu, como utilizo los comparadores en el pic, no como los habilito si no como puedo utilizarlos dentro de un programa..gracias :)
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 20 de Julio de 2009, 20:39:57
Dejo este ejemplo recién confeccionado para que lo analicéis, lo he probado y aparentemente funciona bien.
Más adelante le echare otro rato y expondré como lo he realizado. De todas formas como están indicados los
nombres de los registros es posible seguirlos sobre el datasheet del micro.

Código: Visual Basic
  1. Define CONF_WORD = 0x31c4  'Palabra de configuracion (Fuses)
  2. Define CLOCK_FREQUENCY = 4  'Frecuencia del reloj en Mhz
  3. '********************************************************************************
  4. 'NOMBRE: 12F675_Ejemplo_2_COMPARADOR MODE
  5. 'MICRO: PIC12F675, 4Mhz Interno
  6. 'DESCRIPCION: Uso del comparador analogico
  7. 'FECHA/AUTOR: By COS, 07/09
  8. 'Version 1.0
  9. 'Lectura de la entrada analogica AN2 y se asigna su valor
  10. 'a la cvref interna del modulo comparador.
  11. 'Se utiliza como entrada para comparar la CIN-
  12. 'VRR =1 : CVREF = (VR3:VR0 / 24) * VDD, uso esta configuracin en el modulo comparador
  13. '********************************************************************************
  14. 'Define SEROUT_DELAYUS = 0  'Serout sin demoras entre bytes
  15. Symbol adc_ok = ADCON0.GO  'adc_ok = 0 -> el modulo ADC tiene una lectura lista
  16. '************************ Declaracion de variables ******************
  17. Dim adc_and2 As Word
  18. Dim cvref_in As Word
  19. Dim c_out As Byte
  20. '***************** Asignacion de valores a las variables *******
  21. adc_and2 = 0
  22. c_out = 0
  23. cvref_in = 0
  24. '************* Configuracion modulos generales (E/S) *********
  25. CMCON = %00000100  'comparator CN1=ON
  26. VRCON = %10100000  'vref ON, vrr = 1 (cvref -> min. =0 y max. = 3.125V)
  27. ANSEL = %00010110  'fosc/8 (4Mhz=2uSeg.), an2 y an1 en mode analogico, resto de pin digitales
  28. ADCON0 = %00001001  'adc a 8bit, vdd reference, adc On
  29. 'ADCON0.ADFM = 1  '10BIT ADC
  30. ADCON0.GO = 1  'Inicia conversion ADC
  31. OSCCAL = 0x47  'calibracion del oscilador interno
  32. TRISIO = 0xff  'tri-state pins, entradas
  33. TRISIO.4 = 0  'GP4 pin, como salida, Tx puerto serie
  34. TRISIO.5 = 1  'GP5 pin, como entrada
  35. '*********************Configuracion del Timer1*****************************
  36. T1CON.TMR1CS = 0  'bit de seleccion de reloj para el timer1, interno Fosc/4
  37. T1CON.T1CKPS0 = 0  'bit de seleccion del prescaler para el reloj del timer1
  38. T1CON.T1CKPS1 = 0  'bit de seleccion del prescaler para el reloj del timer1
  39. T1CON.TMR1ON = 0  'parado el contador del TMR1
  40. PIE1.TMR1IE = 0  'desactiva las interrupciones del timer1
  41. '--------------------------------------Main Programa------------------------------
  42. WaitMs 500  'espera 5Seg.
  43. main:  'Rutina del programa principal (inicio)
  44.         If adc_ok = 0 Then Gosub lectura_adc  'Comprueba si el ADC tiene lectura
  45.         Gosub v_ref_in  'Calcula tension de referencia interna modulo comparador
  46.         c_out.0 = CMCON.COUT  'Resultado comparacion
  47.         Serout GPIO.4, 2400, CrLf, "ADC_AND2: ", #adc_and2, " CVREF: ", #cvref_in, CrLf
  48.         Serout GPIO.4, 2400, #c_out, CrLf
  49.         WaitMs 200
  50. Goto main  'Redirecciona el flujo del programa al inicio
  51. End  'Fin del programa                            
  52. lectura_adc:  'Asigna lectura del ADC
  53.                 'adc_and2.HB = ADRESH  'Asigna valor ADC alto, 10bit
  54.                 'adc_and2.LB = ADRESL  'Asigna registro ADC valor bajo 10bit
  55.                 adc_and2 = ADRESH  'Para 8bit
  56.                 ADCON0.GO = 1  'Activa lectura del ADC
  57. Return                                            
  58. v_ref_in:  'Asigna volor de cvref segun la entrada analogica an2
  59.         cvref_in = (15 * adc_and2) / 255  'Convierte entrada analogica 8bit a 4bit
  60.         VRCON.VR3 = cvref_in.3
  61.         VRCON.VR2 = cvref_in.2
  62.         VRCON.VR1 = cvref_in.1
  63.         VRCON.VR0 = cvref_in.0
  64.         cvref_in = 0
  65.         cvref_in.3 = VRCON.VR3
  66.         cvref_in.2 = VRCON.VR2
  67.         cvref_in.1 = VRCON.VR1
  68.         cvref_in.0 = VRCON.VR0
  69. 'VRR = 0: cvref = vdd/4 + (VR3:VR0 / 32) * vdd
  70. 'VRR =1 : CVREF = (VR3:VR0 / 24) * VDD, USO ESTA CONFIGURACION
  71. Return

PD:
Donde dice "'Se utiliza como entrada para comparar la CIN+"
Ahora dice "'Se utiliza como entrada para comparar la CIN-"

Donde dice "ANSEL = %00010101  'fosc/8 (4Mhz=2uSeg.), an2 en mode analogico, resto de pin digitales"
Ahora dice "ANSEL = %00010110  'fosc/8 (4Mhz=2uSeg.), an2 y an1 en mode analogico, resto de pin digitales"

Los cambios no afectan al funcionamiento del programa.
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: Chrisbaf en 21 de Julio de 2009, 02:45:00
gracias lo voy a checar.. :)
Título: Re: PIC12F675 con Pic Basic del Pic Simulator IDE
Publicado por: dogflu66 en 15 de Febrero de 2011, 22:08:36
Para los que estaban interesados en este hilo, por el momento lo estoy continuando en mi pagina, más adelante lo pasare por aquí también.

http://www.pickey.es/proyectos.html