Tutoriales de Electrónica Básica
MICROCONTROLADORES PIC:

Veamos cómo conectar un pulsador al microcontrolador, cómo programarlo y un poquito de código...

Señales de Entrada

Lo interesante y llamativo de los microcontroladores es que obedecen tus órdenes al pie de los bit's :o)

Por ejemplo, si le ordenas que vigile un pulsador, el muy pillo lo hará, y cuando alguien lo active le dará su merecido, jejejeje

Bien..., eso es lo que haremos ahora. Pero esta vez también utilizaremos el puerto A

Ahhhhhhh...!!!, y para complicarlo un poco más lo haremos con un solo pulsador. Si un travieso lo activa encenderemos un LED, y si lo activan nuevamente, lo apagaremos, quedó...?

Mmmmmmmm... Lo que estoy notando es que voy a necesitar un registro que me guarde la información de si el LED está prendido o apagado, (sino... cómo voy a saber que hacer cuando lo presionen...!!!) bueno, ahora si...

Comencemos... el pulsador lo conectaré a RA1 y el LED a RB0, así se ve en el siguiente esquema

Circuito para controlar un pulsador con el microcontroador

Hay varias formas de hacerlo, y más adelante utilizaremos el método de INTERRUPCIONES. Aquí lo haré a mi modo, porque este tutorial es mío, Ok...?   :oP

Vamos a lo nuestro.

  1. ;---------------Encabezado-------------
  2.         List    p=16F84
  3.         radix   hex
  4. ;------------mapa de memoria---------
  5. STATUS  EQU     03          ; status esta en la dirección 03
  6. TRISA   EQU     05
  7. PORTA   EQU     05          ; el puerto a
  8. TRISB   EQU     06
  9. PORTB   EQU     06          ; el puerto b
  10. cont    EQU     0A
  11. ;-------Configuración de puertos-------
  12. reset   ORG     0
  13.         GOTO    inicio
  14.         ORG     5
  15. inicio  BSF     STATUS,5    ; configurando puertos
  16.         MOVLW   0x02        ; carga w con 0000 0010
  17.         MOVWF   TRISA       ; ahora RA1 es entrada
  18.         MOVLW   0x00        ; carga w con 0000 0000
  19.         MOVWF   TRISB       ; y el puerto B salida
  20.         BCF     STATUS,5
  21.         CLRF    PORTB       ; limpio el puerto B
  22.         CLRF    cont        ; limpio el contador
  23.         BSF     cont,0      ; pongo el contador a 1
  24. ;------------------------------------------
  25. test    BTFSC   PORTA,1     ; si alguien presiona
  26.         CALL    led         ; voy a la etiqueta "led"
  27.         GOTO    test        ; sino me quedo esperando
  28. led     BTFSC   cont,0      ; si el contador está a 1
  29.         GOTO    on_led      ; lo atiendo en "on_led"
  30.         BCF     PORTB,0     ; sino, apago el LED
  31.         BSF     cont,0      ; pongo el contador a 1
  32.         GOTO    libre       ; y espero que suelten el pulsador
  33. on_led  BSF     PORTB,0     ; enciendo el LED
  34.         CLRF    cont        ; pongo el contador a 0
  35. libre   BTFSC   PORTA,1     ; si no sueltan el pulsador
  36.         GOTO    libre       ; me quedaré a esperar
  37.         RETURN              ; si lo sueltan regreso
  38.                             ; a testear nuevamente
  39. ;------------------------------------------
  40.         END
  41. ;------------------------------------------

El registro que agregué, como te habrás dado cuenta es cont y su dirección respectiva 0x0A. De la configuración de puertos ni hablar, vamos por lo que está en rojo.

  1.         CLRF    PORTB       ; limpio el puerto B
  2.         CLRF    cont        ; limpio el contador
  3.         BSF     cont,0      ; pongo el contador a 1

CLRF es borrar, o limpiar, o poner a cero, en este caso pongo a cero todo el puerto B y también el registro cont, y luego pongo a 1 el primer bit de este último, es decir el bit 0.

Con esto me aseguro de que no hay ninguna señal en el puerto B, y que el registro cont es igual a 0000001, (señal de que el LED está apagado)

Sigamos...

  1. test    BTFSC   PORTA,1     ; si alguien presiona
  2.         CALL    led         ; voy a la etiqueta "led"
  3.         GOTO    test        ; sino me quedo esperando

Con BTFSC estoy probando el segundo bit (Bit 1) del puerto A. Si este bit esta a cero es por que nadie lo presionó, entonces salto una línea, y me encuentro con GOTO test, así que aquí estaré dando vueltas un buen rato, hasta que a alguien se le ocurra presionar el dichoso pulsador...











Ohhhhhhhhh...!!!, parece ser que alguien lo presionó. Bueno, esta vez no iré a GOTO, sino a CALL led, esto es una llamada a la subrutina led, allí vamos...

  1. led     BTFSC   cont,0      ; si el contador está a 1
  2.         GOTO    on_led      ; lo atiendo en "on_led"
  3.         BCF     PORTB,0     ; sino, apago el LED
  4.         BSF     cont,0      ; pongo el contador a 1
  5.         GOTO    libre       ; y espero que suelten el pulsador
  6. on_led  BSF     PORTB,0     ; enciendo el LED
  7.         CLRF    cont        ; pongo el contador a 0
  8. libre   BTFSC   PORTA,1     ; si no sueltan el pulsador
  9.         GOTO    libre       ; me quedaré a esperar
  10.         RETURN              ; si lo sueltan regreso
  11.                             ; a testear nuevamente

Antes de hacer algo debo saber si el LED está encendido o apagado. Recuerda que si está apagado cont=0000001, de lo contrario cont=00000000

Pregunta...(BTFSC     cont,0 ?) - el primer bit del registro cont es igual a uno?...

Si es así el LED está apagado así que lo atenderé en "on_led" ahí pondré a uno el primer bit del puerto B (encenderé el led), luego haré cont=0000000 para saber que desde este momento el LED está encendido.

El tema es que nunca falta aquellos que presionan un pulsador y luego no lo quieren soltar, así que le daremos para que tengan..., y nos quedaremos en la subrrutina "libre" hasta que lo suelten, y cuando lo liberen, saltaremos una línea hasta la instrucción RETURN.

Así es que caeremos en (GOTO     test) y esperamos a que opriman nuevamente el pulsador. y si quieres saber si esto funciona ponle el dedito, y caerás otra vez en la subrrutina "led"

Pregunta...(BTFSC     cont,0 ?) - el primer bit del registro cont es 1?...

Noooooooo...!!! Eso significa que el LED esta encendido, entonces lo apagaré (BCF     PORTB,0), haré cont=00000001 (de ahora en más LED apagado) y me quedaré en "libre" esperando a que sueltes el pulsador, y cuando lo hagas mi 16F84 estará listo para un nuevo ciclo.

Te gustó...?, fue fácil verdad...?

Creo que es un buen punto de partida. En breve hablaremos del famoso MPLAB de Microchip, por lo pronto, trata de conseguirlo...

R-Luis...