Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Tutorial Básico (9 de 10)  

.: 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...


<--Anterior   Introducción   Siguiente -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
Tabla de Referencias


    
--| |--