Hablemos de puertos

Para que el microcontrolador pueda distribuir la información que se procesa y enviarse al exterior, se necesitan los puertos que comuniquen por medio de estados lógicos. La forma en que están arreglados los puertos de los microcontroladores son entradas/salidas paralelas, siendo estos sus periféricos más vitales.

Entradas/Salidas paralelas

Los datos manejados por un microcontrolador se pueden resumir en:

  • Información de medición: es la información recibida a través de sensores externos y estos pueden ser análogos o digitales.
  • Transferencia de datos por paquetes: es la información enviada o recibida de forma paralela o serial.
  • Interfaces de usuario: son todos los emisores o receptores que pueden interactuar con una persona (LED’s, keypads, Diplays de 7 segmentos, Displays LCD, etc.).
  • Información de salida: son datos para activar o conmutar algún componente electrónico.

Como primer concepto que debemos manejar que los puertos de un microcontrolador son identificados como PORT+LETRA (Ej: PORTA, PORTB, etc.), todo puerto está diseñado como un arreglo de 8 bits así que un PORTA tiene por decirlo: RA0, RA1, RA2, RA3, RA4, RA5, RA5 y RA7, pero debido al diseño en algunos micontroladores encontraremos “puertos incompletos”, donde por ejemplo un puerto específico solo tenga 4 pines dedicados, aunque internamente este el registro con los bits restantes que corresponderían a esos pines, no son utilizables, esto es debido al tamaño y la arquitectura del microcontrolador.

Para un ejemplo de esto veamos la configuración de pines del PIC 18f2550:



Observemos lo siguiente de los puertos:


  • PORTA: se tiene un rango desde RA0 hasta RA6, siendo el pin RA6 únicamente pin de salida.
  • PORTB: completo
  • PORTC: Se tiene desde RC0 al RC2, se obvia el RC3 y continúa el RC4 al RC7.

La hoja de datos nos indica los registros asociados al puerto:


Los puertos de los microcontroladores tienen tres tecnologías: entradas de tipo "Schmitt Trigger" y “open drain” (algunos les decimos colector abierto, así me lo enseñaron) y la tecnología Totem-Pole.

  • Schmitt Trigger: generalmente se utilizan compuertas tipo Buffer o AND, pero es más común el uso de Buffer en las entradas, la compuerta Schmitt Trigger se caracteriza porque define valores umbrales para 1 y 0 lógico, ya que estos valores binarios son rangos de voltajes, lo que la compuerta hace es que cuando entra un valor intermedio lo rectifica para que sea un 1 o 0 lógico y no exista problemas por malinterpretación de una compuerta al entrarle esos valores.
  • Open drain (colector abierto): primero quisiera aclarar que llamar colector abierto a esta circuiteria a mi forma de verlo es incorrecto, ya que colector abierto es una configuración para transistores BJT y los microcontroladores utilizan transistores MOSFET. Son transistores pero con una tecnología distinta aunque la conectividad es la misma, a mi forma de ver debe ser llamada Open drain.
La configuración open drain se basa en la conectividad de dos de las terminales del mosfet, el pin de source de aterriza a Gnd, gate es el pin polarizado y el drain se queda solo conectado al pin de salida, como al “aire”. Esto hace que cuando gate es polarizado, la salida en drain se vuelva 0 lógico, pero cuando no lo es se vuelve un estado desconocido, en estos casos se deben usar resistencias pull up, para colocar la salida de 1 lógico.
  • Totem-Pole: Es la configuración de dos mosfets uno de canal N y otro canal P, el mosfet de canal P da el valor de 1 lógico y el mosfet de canal N  da el 0 lógico. Esta configuración permite ambos estados lógicos sin necesidad de una resistencia pull up.


Para saber si algún pin de un puerto tiene configuración open drain, debemos ver el diseño de los puertos en las hojas de datos. Pero como recomendación personal a pesar de que tipo de tecnología pueda tener la salida del microcontrolador siempre es bueno colocarle una resistencia pull up para estabilizar el valor de salida.


Algunos pines de los puertos están diseñados para una tarea específica, como por ejemplo una Interrupción, el PIC 16f84A tiene una forma muy sencilla aunque ya muy antigua de una interrupción en PORTB (RB0) y aprovechando podemos ver la idea en diagrama de bloques de cómo hacer un pin de un puerto bidireccional, con la ayuda de latch tipo D, buffers y un mosfet (open drain).


En varias hojas de datos el fabricante compartirá como es que están diseñados algunos puertos, claro este diseño es de un 16f84a, lo cual hace que este diseño sea ya obsoleto, pero nos da la idea de como se pensó para poder hacer un pin I/O y se tiene una base para mejoras en los diseños.

Control de temperatura de una estufa eléctrica con PICAXE



Se plantea el siguiente proyecto:

Controlar la temperatura de una estufa eléctrica con una termocopla tipo K, donde uno pueda “setear la temperatura” por medio de un potenciómetro y un relé cambie sus velocidades de conmutación para calentar o hacer que se enfríe la plancha metálica.

Entendiendo el problema:
  • La plancha de metal estará fría desde su conexión.
  • Con un potenciómetro se indicará la temperatura deseada
  • Al momento de conectarla el sistema empezara a hacer que el relé interrumpa con tiempos de intervalo para calentar la plancha de metal.
  • Cada vez que se esté acercando a la temperatura deseada el relé debe interrumpir más rápido y cuando llegue a dicha temperatura detendrá su conmutación.
  • El PICAXE debe medir con ADC las muestras de la termocopla y asi controlar las temporizaciones, yo hice esto conectando la termocopla a mi multímetro midiendo temperatura y comparándola con la lectura de PICAXE.


Debes ver es el comportamiento de una termocopla tipo K.

Así que haremos los siguientes circuitos, siento en este caso el circuito de muestreo el más importante:

Control por relé


Circuito digital para PICAXE


Circuito de muestreo de termocopla



Ahora debemos usar un tema que ya habíamos visto en PICAXE con interrupciones, solo que en vez de hacer interrupción por cambio de pin, haremos interrupción por timer.

Con este simple código podemos calcular los tiempos en ticks para la ejecución del timer según cada tiempo y variación de la temperatura, solo es cuestión de simularlo y ver los resultados en :


Symbol PERIODO_TIEMPO = 50000   'número de microsegundos entre interrupciones
Symbol FRECUENCIA = 8 'frecuencia de operacion del picaxe
Symbol TIEMPO_TICK = 256 / FRECUENCIA
Symbol TICKS_PRECARGADOS = PERIODO_TIEMPO / TIEMPO_TICK
Symbol VALOR_PRECARGADO = 0 - TICKS_PRECARGADOS
Symbol PRECARGA = VALOR_PRECARGADO & $FFFF
‘Resultados:
'1s = 20728
'95ms = 35849
'90ms = 37411
'85ms = 38974
'80ms = 40536
'75ms = 42099
'70ms = 43661
'65ms = 45224
'60ms = 46786
'55ms = 48349
'50ms = 49911
'45ms = 51474
'40ms = 53036
'35ms = 54599
'30ms = 56161
'25ms = 57724
'20ms = 59286
'15ms = 60849
'10ms = 62411
'5ms = 63974

Teniendo dos lectura analogas, la del potenciometro y la de la salida del circuito de instrumentación. Y con estos cálculos de tiempo los agregamos a nuestro programa final:

output c.4,c.5,b.6 'salida a relé
b1 = 0
b10 = 0
w7 = 20728

                SetIntFlags $80, $80
                timer = $FFFF
                SetTimer w7
               
ae:
                readadc c.3,b0 'lectura de valor analogico del potenciometro
                readadc c.1,b2 'lectura de valor analogico de amplificador de instrumentacion de la termocopla
                'sertxd(#b11,"- ",#b2,13,10)
                'pause 100
                if b2 < 10 then
                               pwmout c.5,99,80 '24° temperatura ambiente
                endif
                if b2 > 10 and b2 < 21 then
                               pwmout c.5,99,120 '70° temperatura
                endif
                if b2 > 20 and b2 < 30 then
                               pwmout c.5,99,145 '90° temperatura
                endif
                if b2 > 29 and b2 < 60 then
                               pwmout c.5,99,160 '140° temperatura
                endif
                if b2 > 59 and b2 < 71 then
                               pwmout c.5,99,220 '200° temperatura
                endif
                if b2 > 70 and b2 < 96 then
                               pwmout c.5,99,300 '250° temperatura
                endif
                if b2 > 95 then
                               pwmout c.5,99,350 '300° temperatura
                endif
goto ae


interrupt:
                b11 = b0 - b2
                if b2 > b0 or b11 < 15 then
                               b10 = 1
                               b5 = 0
                               high b.6
                               low b.5
                endif
                if b0 > b2 and b11 > 14 then
                               b10 = 0
                               b5 = b0 - b2
                               high b.5
                               low b.6
                endif
               
                if b10 = 0 then
                               toggle c.4, b.0
                endif
                if b10 = 1 then
                               low c.4
                endif

                if b5 > 9 and b5 < 20 then
                               b10 = 0
                               w7 = 63974 '5ms interrupcion
                endif
                if b5 > 20 and b5 < 30 then
                               b10 = 0
                               w7 = 59286 '10ms interrupcion
                endif
                if b5 > 30 and b5 < 50 then
                               b10 = 0
                               w7 = 53036 '20ms interrupcion
                endif
                if b5 > 50 and b5 < 70 then
                               b10 = 0
                               w7 = 49911 '30ms interrupcion
                endif
                if b5 > 70 and b5 < 90 then
                               b10 = 0
                               w7 = 40536 '40ms interrupcion
                endif
                if b5 > 91 then
                               b10 = 0
                               w7 = 20728 '50ms interrupcion
                endif

                SetIntFlags $80, $80
                timer = $FFFF
                SetTimer w7 '50ms interrupcion
return