PIC12F683

Este PIC es el pequeño gigante de Microchip.
Con tan solo 8 pines, posee varias caracteristicas de las cuales uno no pensaria que tendria.


Caracteristicas

-6 I/O pines.
-Memoria de programa de 2048 palabras (14 bits).
-35 instrucciones en Assembler.
-256 bytes de EEPROM de datos.
-128 bytes de SRAM de datos.
-4 entradas analógicas de 10 bits de resolución.
-Reloj interno seleccionable de 125KHz a 8MHz. Si se activa la opcion de reloj externo puede trabajar hasta con 20MHz.
-Modulo CCP. Capture, Compare, PWM módulo (de 10 bits).
-1 comparador analógico. Dos entradas para sensar y una salida.


Con respecto al PIC16F84A podemos ver las siguientes mejoras:
El doble de memoria(2048) para guardar nuestro programa.
4 veces más de memoria EEPROM.
Admite entradas analógicas.
Posee reloj interno seleccionable
Entre otras mejoras.

Otro punto a favor de este PIC es que no es necesario rescatar el valor OSSCAL, calibrarlo o estar pendiente de este valor como sucede con el PIC 12F675 o el PIC12F629. En el PIC 12F683 este valor ya se encuentra calibrado para usar su reloj interno sin ningun problema, no sufre modificacion alguna al programarlo.

Como único punto en contra solo veo la cantidad de pines pero esto puede jugarnos a favor si queremos ahorrar espacio y tener un circuito más compacto y de alta calidad. Por otro lado tambien tenemos los CI de registros de desplazamiento como el CD4017 ó el 74HC164 que nos pueden ayudar a expandir los pines de salida.


Mapa de memoria de datos



Como podemos observar, el espacio para almacenar nuestras variables comienza en la posicion 20h

Fuente de oscilador

Aqui podemos ver el modulo del reloj del PIC con el que trabaja, sea interno o externo. Si es interno puede ser seleccionado de 125KHz a 8MHz y en este rango puede ser calibrado con el registro OSCTUNE que veremos despues. El oscilador interno de baja frecuencia de 31KHz no esta calibrado de fabrica y no es afectado por OSCTUNE, es poco recomendable este reloj.




Registros

Mencionare los registros principales del PIC. No mencionare el registro STATUS ya que es igual al de otros PICs.

Registro OSCCON



El bit 0 SCS selecciona si es reloj interno o externo.
El bit 7 no esta implementado.
Los bits 1 y 2 LTS y HTS informan si los relojes son estables.

Este registro se complementa con los codigos en la palabra de configuración.
En modo INTOSC, GP5/OSC1/CLKIN puede funcionar como entrada/salida pero el pin GP4/ OSC2/CLKOUT funciona como salida de reloj interno dividido por 4.
En modo INTOSCIO , GP4 y GP5 pueden funcionar como salidas/entradas.

En la libreria del PIC tenemos:
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_INTOSCIO                    EQU     H'3FFC'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTOSC                      EQU     H'3FFD'
_EXTRC_OSC_NOCLKOUT          EQU     H'3FFE'
_EXTRCIO                     EQU     H'3FFE'
_EXTRC_OSC_CLKOUT            EQU     H'3FFF'
_EXTRC                       EQU     H'3FFF'


Registro OSCTUNE



Este registro nos ayuda a calibrar el reloj interno del PIC para obtener una mejor presición en tiempos. Si se requiere mayor presición se debe emplear un cristal externo. El modo de configuracion para uso del cristal externo como reloj es _HS_OSC, _XT_OSC, etc.

Registro CMCON0

Se debe configurar al inicio del codigo de programa. Por defecto esta activado.



Para desactivar el modulo comparados debemos escribir en los bits CM 0,1 y 2 un "1" lógico.

Registro TRISIO



como vemos solo 5 pines pueden trabajar como I/O, mientras que el sexto pin solo puede trabajar como entrada,es el pin GP3 que tambien puede trabajar como MCLR del PIC si se configura para ello.

Registro ANSEL

Aqui se configura los pines que seran empleados como entradas analogicas y el prescaler del reloj que usara el ADC.
Tengan en cuenta antes de escoger el reloj y el prescaler que el Tad mínimo del PIC es 1.6us.



Fuente: Microchip 12f683

Hasta ahi los registros, solo mencione los principales, ahora vamos con el primer programa para el PIC12F683.

Programa

Continuando con el mismo formato del programa para el PIC16F84A, presento el primer programa para el PIC12F683. Es el programa para un led intermitente conectado en GP5 (PIN2).
Empleo el reloj interno del PIC para ahorrar pines. Considero esto necesario en nuestro primer programa ya que el pic solo posee 8 pines, 6 si no contamos los pines de alimentación. Si usted amigo lector recien comienza a programar PICs, le recomiendo el primer programa para el PIC16F84A de esta misma sección.

  1. ;http://www.archimon-tx8.blogspot.com
  2. list p=12F683
  3. #include "p12f683.inc"
  4.  
  5. errorlevel -302 ; suppress message 302  
  6. __config   _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
  7.  
  8. ;Ubicacion de variables en banco de memoria
  9.  
  10. COUNT1 equ 0x20   ;el banco de memoria comienza en la posicion 0x20
  11. COUNT2 equ 0x21
  12.  
  13. ;Inicio de programa
  14.  
  15. org     0x00
  16.  
  17. movlw   0x07  
  18. movwf   CMCON0       ;Comparadores OFF  
  19.  
  20. ;configuracion de puerto
  21. bsf    STATUS,RP0    ;seleccionamos banco 1
  22. movlw   b'01100001'  ;bit 1 y 2(LTS HTS) indican si los osc. son estables. Bit 7 no implementado
  23. movwf   OSCCON       ;Oscilador interno a 4MHz (default)
  24. clrf    ANSEL        ;puerto digital
  25. movlw   b'00001000'  ;Bit 7 y 8 no implementados, Bit 3 solo como entrada
  26. movwf   TRISIO       ;Utilizaremos solo el GP5(PIN2) como salida.
  27. bcf    STATUS,RP0
  28.          
  29. ;Codigo de programa
  30.  
  31. INICIO   bsf  GPIO,5    ;Poner a 1 GP5
  32.          call DELAY
  33.          bcf  GPIO,5    ;Poner a 0 GP5
  34.          call DELAY
  35.          goto INICIO
  36.  
  37. DELAY movlw 0xFF  ; Subrutina de retardo
  38.       movwf COUNT1  ; 256x256=65536 cuentas
  39.       movwf COUNT2
  40. LOOP  decfsz COUNT1,1 ; Decrementa COUNT1
  41.       goto LOOP  ; Salta si COUNT1=0
  42.       movlw 0xFF  
  43.       movwf COUNT1  ; COUNT1=FF
  44.       decfsz COUNT2,1 ; Decrementa COUNT2
  45.       goto LOOP  ; Salta si COUNT2=0
  46.       return   ; Retorno de subrutina
  47.  
  48. end   ; Fin de programa


Lo más resaltante de este programa esta en la configuración del puerto para que trabaje como puerto digital y tambien la selección del reloj interno.

Circuito

 photo Sintiacutetulo-1_zps2f5887b8.jpg


El pin 4 MCLR se conecta a Vcc ya que su función esta activada, es decir, si este pin toma 0 voltios el programa se reinicia.
En el circuito tambien se tiene que conectar la fuente de alimentación, pin 8 - tierra y pin 1 - Vcc (5V)

Información del programa

Mencionaré las palabras de configuración nuevas respecto al PIC16F84A:

FCMEN (Fail-Safe Clock Monitor enabled) modulo del oscilador a prueba de fallos. 
Si falla el reloj externo, cambia a reloj interno
IESO (Internal External Switch Over Oscillator mode) Activa el uso del reloj externo e interno.
CPD (Data EEPROM Code Protection) proteje la memoria EEPROM contra las lecturas.
BOD (brownout reset) Reinicio del pic luego de una caida de voltaje.
MCLRE_ON activa la funcion MCLRE en el pin 4, debe ser conectado a Vcc.
INTRC_OSC_NOCLKOUT selección del reloj interno del pic. Los pines OSC1/CLKIN y OSC2/CLKOUT pueden 
trabajar como I/O.

Nuestra palabra de configuración:
__config   _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF 
& _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

Luego definimos las variables que utilizamos COUNT1 y COUNT2.
El banco de memorias comienza en la posición 0x20.

Definimos el modo de operación de los puertos y el reloj interno.
Primero desactivamos la funcion de comparador. Esta activa por defecto.
movlw   0x07  
movwf   CMCON0       ;Comparadores OFF  
Seleccionamos el reloj interno del pic.
bsf    STATUS,RP0    ;seleccionamos banco 1
movlw   b'01100001'  ;bit 1 y 2(LTS HTS) indican si los osc. son estables. Bit 7 no implementado
movwf   OSCCON       ;Oscilador interno a 4MHz (default)
Puerto como digital
clrf    ANSEL        ;puerto digital
Todo el puerto como salida.
movlw   b'00001000'  ;Bit 7 y 8 no implementados, Bit 3 solo como entrada
movwf   TRISIO       ;Utilizaremos solo el GP5(PIN2) como salida.
bcf    STATUS,RP0 

Regresamos al banco 0 y lo siguiente es la misma programación que del PIC16F84A.

Mis primeros programas

Los primeros programas en assembler o la primera vez que programamos un PIC resulta algo complicado, ya que, por otro lado, estamos probando nuestro programador de PICs, también que nuestro PIC funcione correctamente y luego pensamos en todo lo que podemos hacer con este pequeño chip.

PIC16F84A

El pic 16F84A es uno de los más usados por todos los que se inician en el campo de la programación de microcontroladores, asi que el primer programa que haremos sera para este PIC. Antes de comenzar, debo mencionar que no presentare un tutorial de Assembler, pero les recomiendo este archivo para el PIC16F84A, donde están todas sus instrucciones y más.

Información recomendada

Programación PIC16F84A

Libro Microcontrolador PIC16F84 Desarrollo de proyectos

Más aún les brindare información sobre algunos puntos.
Toda esta información será suficiente para comenzar.

Programa

Este es el programa que recomiendo para comenzar.
Es el clásico “Hola mundo” de los programas en microcontroladores, el famoso “led intermitente” o led que parpadea o “Led Blink”.

  1. ;http://www.archimon-tx8.blogspot.com
  2. list p=16F84A
  3. include "p16f84a.inc"
  4.  
  5. ;Definicion de fuses
  6.  
  7. __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
  8.  
  9. ;Ubicacion de variables en banco de memoria
  10.  
  11. COUNT1 equ 0x0c
  12. COUNT2 equ 0x0d
  13.  
  14. ;Inicio de programa
  15.  
  16. org 0x00
  17.  
  18. ;Modo de operacion de puertos I/O, interrupciones
  19.  
  20. bsf STATUS,5
  21. movlw b'11111110'       ;la unica salida será RB0
  22. movwf TRISB      
  23. bcf STATUS,5  
  24.  
  25. ;Codigo de programa
  26. INICIO    
  27.          bsf  PORTB,0  
  28.          call DELAY     ;llamo a la rutina de retardo
  29.          bcf  PORTB,0  
  30.          call DELAY     ;otra vez para notar el efecto del parpadeo
  31.          goto INICIO
  32.  
  33. DELAY movlw 0xFF  ; Subrutina de retardo
  34.       movwf COUNT1  ; 256x256=65536 cuentas
  35.       movwf COUNT2
  36. LOOP  decfsz COUNT1,1 ; Decrementa COUNT1
  37.       goto LOOP  ; Salta si COUNT1=0
  38.       movlw 0xFF  
  39.       movwf COUNT1  ; COUNT1=FF
  40.       decfsz COUNT2,1 ; Decrementa COUNT2
  41.       goto LOOP  ; Salta si COUNT2=0
  42.       return   ; Retorno de subrutina
  43.  
  44. end   ; Fin de programa


Si bien otros programas iniciales son más sencillos que este, no son suficientes para asegurar que todo está bien.

Circuito

Aquí está el circuito para probar el programa en la práctica.



Trabajaremos con Proteus, por lo práctico de este programa en las simulaciones de microcontroladores. También nos ayudara para asegurar que nuestro programa funciona bien.
En el circuito no se ve pero tambien se tiene que conectar la fuente de alimentación, pin 5 - tierra y pin 14 - Vcc (5V)

Información del programa

Veamos un poco la estructura del programa:
Luego del “list” y el “include” que nos permiten añadir las instrucciones del Pic especificado pasamos a la palabra de configuración.
Aquí tenemos información de las palabras de configuración más importantes para el PIC16F84A.

PWRTE (power up timer: temporizador de encendido) provee un retardo fijo de 72ms en el encendido 
únicamente, diseñado para mantener el reset mientras la fuente se estabiliza.
CP protección de código.
WDT (watchdog: temporizador de perro guardián)reset cuando hay desbordamiento. 
Evita los posibles cuelgues de programa.
Tipo de oscilador:
RC: Formado por una resistencia y un condensador. No preciso.
LP: Baja frecuencia. Entre 32K a 200KHz.
XT: Oscilador a cristal de cuarzo. Genera entre 100k a 4MHz.
HS: Para frecuencias entre 4M a 20MHz.
Nuestra palabra de configuración:
__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

Protección de codigo (CP) no es necesario por lo que la deshabilitamos (OFF).
WDT tampoco es necesario por lo que es un programa sencillo.
PWRTE siempre lo considero activado. Es muy importante.
XT es por que trabajo con un cristal de 4MHz.

Luego definimos las variables que utilizamos COUNT1 y COUNT2.
El banco de memorias comienza en la posición 0x0c.

Definimos el modo de operación de los puertos.

Por último la rutina principal de bucle infinito.

INICIO    
         bsf  PORTB,0  
         call DELAY     ;llamo a la rutina de retardo
         bcf  PORTB,0
         call DELAY     ;otra vez para notar el efecto del parpadeo
         goto INICIO


“bsf” pone a 1 lógico el Pin 0 del puerto B.
“bcf” pone a 0 lógico el Pin 0 del puerto B.

Así se logra prender y apagar el led conectado al Pin 0 pero este efecto no sería observable sin un retardo, ya que las instrucciones como había mencionado demoran 1us.
El retardo se da en:

call DELAY

Donde se salta a la rutina de retardo “DELAY”.

DELAY movlw 0xFF  ; Subrutina de retardo
      movwf COUNT1  ; 256x256=65536 cuentas
      movwf COUNT2
LOOP  decfsz COUNT1,1 ; Decrementa COUNT1
      goto LOOP  ; Salta si COUNT1=0
      movlw 0xFF  
      movwf COUNT1  ; COUNT1=FF
      decfsz COUNT2,1 ; Decrementa COUNT2
      goto LOOP  ; Salta si COUNT2=0
      return   ; Retorno de subrutina


Como había mencionado, con el StopWatch se puede calcular el tiempo que demora este retardo de forma exacta, obtuve 196ms o 200ms para redondear.


Amplificador de audio TDA2003

Los TDA son integrados muy conocidos en la electrónica de sonido, ya que mediante un sencillo circuito podemos obtener un pequeño pero eficiente amplificador de audio. Recomiendo este amplificador para los que se inician en este mundo, los sorprenderá.

Circuito


El condensador C6 de 2200uF puede ser reemplazado por uno de 1000uF, ello depende de como obtienen una mejor calidad de sonido, tambien la resistencia R4 de 330 Ohms puede ser de 220 Ohms, que es su valor tipico para el circuito.
El potenciometro es para variar el sonido del amplificador.

El circuito para el TDA2002 y TDA2003 es el mismo, lo que cambia es la potencia y el TDA2003 tiene una mayor potencia (10W), por lo que recomiendo armarlo para este CI.

PCB


Como podemos observar las dimensiones son reducidas, 5,7cm x 4,7cm.
El disipador si es recomendable porque el TDA se calienta en funcionamiento.
El programa utilizado fue ARES PROTEUS. Recomendado para los que inician en desarrollo de PCBs.


Materiales
Condensadores:
-0.1uF (104)
-47nF
-2200uF 16V
-10uF  16V
-470uF 16V
-2.2uF

Resistencias (todas de 1/2W)
-1 Ohm
-2.2 Ohm
-330 Ohm
-47 Ohm

CI:
-tda2003

Otros:
-Potenciometro 5k
-Molex (2)
-Disipador (pequeño para el TDA)
-Espadines macho

Descargas

Descargar PCBs + Lista de materiales

En el archivo .rar tambien esta el diagrama del circuito y la mascara de componentes.

Circuito terminado

Aquí tengo el montaje final de cómo queda terminado:



Los espadines los utilice para conectar la alimentación, es dependiendo de dónde lo utilizaran, en mi caso lo usaba para laboratorio o para experimentar por lo que necesite conectores prácticos, actualmente lo derive a un pequeño equipo de audio reproductor de USB.