Autor Tema: PIC12F675 con Pic Basic del Pic Simulator IDE  (Leído 39563 veces)

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
PIC12F675 con Pic Basic del Pic Simulator IDE
« 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.
« Última modificación: 13 de Diciembre de 2008, 22:27:29 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: 12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #1 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ó.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: 12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #2 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.
« Última modificación: 20 de Mayo de 2010, 20:18:13 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: 12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #3 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.
« Última modificación: 16 de Diciembre de 2008, 20:09:33 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: 12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #4 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.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: 12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #5 en: 13 de Diciembre de 2008, 22:01:45 »
El esquema:

« Última modificación: 13 de Diciembre de 2008, 22:25:12 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: 12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #6 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
« Última modificación: 29 de Enero de 2024, 21:26:03 por dogflu66 »
Saludos desde Granada, España.

Desconectado xocas

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 2312
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #7 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...

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #8 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:
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #9 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).
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #10 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.
« Última modificación: 01 de Febrero de 2016, 22:53:59 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #11 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.
« Última modificación: 30 de Octubre de 2010, 10:43:49 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #12 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.
« Última modificación: 30 de Octubre de 2010, 10:48:35 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #13 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.
« Última modificación: 30 de Octubre de 2010, 10:59:36 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: PIC12F675 con Pic Basic del Pic Simulator IDE
« Respuesta #14 en: 16 de Diciembre de 2008, 21:48:32 »
Recreacion 3D de un programador:

Saludos desde Granada, España.