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
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.
;---------------Encabezado-------------
List p=16F84
radix hex
;------------mapa de memoria---------
STATUS EQU 03 ; status esta en la dirección 03
TRISA EQU 05
PORTA EQU 05 ; el puerto a
TRISB EQU 06
PORTB EQU 06 ; el puerto b
cont EQU 0A
;-------Configuración de puertos-------
reset ORG 0
GOTO inicio
ORG 5
inicio BSF STATUS,5 ; configurando puertos
MOVLW 0x02 ; carga w con 0000 0010
MOVWF TRISA ; ahora RA1 es entrada
MOVLW 0x00 ; carga w con 0000 0000
MOVWF TRISB ; y el puerto B salida
BCF STATUS,5
CLRF PORTB ; limpio el puerto B
CLRF cont ; limpio el contador
BSF cont,0 ; pongo el contador a 1
;------------------------------------------
test BTFSC PORTA,1 ; si alguien presiona
CALL led ; voy a la etiqueta "led"
GOTO test ; sino me quedo esperando
led BTFSC cont,0 ; si el contador está a 1
GOTO on_led ; lo atiendo en "on_led"
BCF PORTB,0 ; sino, apago el LED
BSF cont,0 ; pongo el contador a 1
GOTO libre ; y espero que suelten el pulsador
on_led BSF PORTB,0 ; enciendo el LED
CLRF cont ; pongo el contador a 0
libre BTFSC PORTA,1 ; si no sueltan el pulsador
GOTO libre ; me quedaré a esperar
RETURN ; si lo sueltan regreso
; a testear nuevamente
;------------------------------------------
END
;------------------------------------------
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.
CLRF PORTB ; limpio el puerto B
CLRF cont ; limpio el contador
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...
test BTFSC PORTA,1 ; si alguien presiona
CALL led ; voy a la etiqueta "led"
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...
led BTFSC cont,0 ; si el contador está a 1
GOTO on_led ; lo atiendo en "on_led"
BCF PORTB,0 ; sino, apago el LED
BSF cont,0 ; pongo el contador a 1
GOTO libre ; y espero que suelten el pulsador
on_led BSF PORTB,0 ; enciendo el LED
CLRF cont ; pongo el contador a 0
libre BTFSC PORTA,1 ; si no sueltan el pulsador
GOTO libre ; me quedaré a esperar
RETURN ; si lo sueltan regreso
; 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...