Mostrando entradas con la etiqueta MPASM (Rincón del ensamblador - Pic´s). Mostrar todas las entradas
Mostrando entradas con la etiqueta MPASM (Rincón del ensamblador - Pic´s). Mostrar todas las entradas

lunes, 15 de diciembre de 2008

Control de temperatura con el lm35 y el pic16f877 en ensamblador

Control de temperatura con el lm35 y el pic16f877 en ensamblador

Introducción:

El LM35 es un sensor de temperatura con una precisión calibrada de 1ºC. Puede medir temperaturas en el rango que abarca desde -55º a + 150ºC. La salida es muy lineal y cada grado centígrado equivale a 10 mV en la salida.

Descripción

Este programa fue realizado en lenguaje ensamblador para el pic16f877 pero se puede emigrar fácilmente a otro pic.

La idea principal de este proyecto es el control de temperatura de un cuarto, recipiente, etc. Para llevar acabo esto se tiene primero que sensar la temperatura q existe en el entorno de ahí se toma la decisión si la temperatura es menor a la temperatura a controlar se enciende un dispositivo para elevar dicha temperatura, si la temperatura es mayor a la que se desea controlar se activa un pin del Mc.

Entonces se tienen dos señales de activación en los pines del MC estas con el acondicionamiento se puede activar motores, ventiladores, calentadores o etc.

Materiales:

• Pic16f877
• Cristal de 20 MHZ
• Varios capacitares
• Varias resistencias
• Lm35
• Ventilador
• Foco



Rutinas importantes del Programa:

;-------------------------------------------------------------

;Rutina de sensado y despliegue de información
Ciclo:
BSF ADCON0,2 ; empiesa la conversion
BTFSS PIR1,6 ;se espera a q termine la conversion
GOTO Ciclo
movf ADRESL,w ;se mueve el valor de la conversion a w
movwf valor1
movwf valor
BCF PIR1,6 ;se limpia el bit ADIF
GOTO compara
SS:
movf valor1,w
CALL Hex_Ascii ;llama a convertir a ascii
call limpia ;limpia el lcd
movf ASCII_H,w ;imprime el valor de centenas en el lcd
call envia
movf ASCII_M,w ;imprime el valor de decenas en el lcd
call envia
movf ASCII_L,w ;imprime el valor de unidades en el lcd
call envia
movlw 0xDF ;visualiza "°"
call envia
movlw "C"
call envia
GOTO Ciclo
;-----------------------------------------------------------------------

ifmayor macro r1,r2,aqui
movfw r1 ;w<== r1
sublw r2 ;w<==r2-r1
btfsc STATUS, Z ;se salta si z=0
goto aqui
btfss STATUS, C ;se salta si c=1
goto aqui
goto foco
ende
;---------------------------------------------------------------------


Nota : En la simulación que se adjunta se puso un motor simulando un ventilador y un led simulando un foco.

Simulación:





Puede descargar el programa completo en la sección de Descargas de este blogs.

viernes, 28 de noviembre de 2008

LM35 CONECTADO AL PIC16F877 CON REFERENCIA(VREF+) Y DESPLEGADO EN UN LCD

LM35 + PIC16F877 EN ENSAMBLADOR

INTRODUCCION:

El LM35 es un sensor de temperatura con una precisión calibrada de 1ºC. Puede medir temperaturas en el rango que abarca desde -55º a + 150ºC. La salida es muy lineal y cada grado centígrado equivale a 10 mV en la salida.

CARACTERISTICAS:

Sus características más relevantes son:

Precisión de ~1,5ºC (peor caso), 0.5ºC garantizados a 25ºC.
No linealidad de ~0,5ºC (peor caso).
Baja corriente de alimentación (60uA).
Amplio rango de funcionamiento (desde -55º a + 150ºC).
Bajo costo.
Baja impedancia de salida.
Su tensión de salida es proporcional ala temperatura, en la escala Celsius. No necesita calibración externa y es de bajo costo.

El sensor se presenta en diferentes encapsulados pero el mas común es el to-92 de igual forma que un típico transistor con 3 patas, dos de ellas para alimentarlo y la tercera nos entrega un valor de tensión proporcional a la temperatura medida por el dispositivo. Con el LM35 sobre la mesa las patillas hacia nosotros y las letras del encapsulado hacia arriba tenemos que de izquierda a derecha los pines son: VCC - Vout - GND.



DESCRIPCION:

El lm35 se conecta al canal 0 del conversor Analógico/Digital,se toma el valor de la entrada de ese canal y se convierte en ascii una vez convertido se muestra en el lcd.

Para una medida real con el conversor del Analógico/Digital se ha dispuesto una referencia de 2.55 volts(VREF+),para generar esta tensión de referencia se puede ajustar con un regulador LM336,lm317 externo al pic o en su defecto un divisor con resistencias, con lo cual la medida de temperatura será simple y fiable. El rango de medidas que soporta este montaje es solo de temperaturas positivas y abarca desde 0º a +150ºC.

MATERIALES:

- PIC16F877A
- Resistencias de 4.7K
- Cristal de 20MHZ
- Push Botton
- Fuente de DC de 5 volts
- Protoboard
- LCD
- Capacitores
- LM35
- Regulador(lm336,lm317,etc)

RUTINAS IMPORTANTES DEL PROGRAMA:

;------------------------------------------------------------
;Rutina de sensado y despliege de información
Ciclo:
BSF ADCON0,2 ; empiesa la conversion
BTFSS PIR1,6 ;se espera a q termine la conversion
GOTO Ciclo
movf ADRESL,w ;se mueve el valor de la conversion a w
BCF PIR1,6 ;se limpia el bit ADIF
call Hex_Ascii ;llama a convertir a ascii
call limpia ;limpia el lcd
movf ASCII_H,w ;imprime el valor de centenas en el lcd
call envia
movf ASCII_M,w ;imprime el valor de decenas en el lcd
call envia
movf ASCII_L,w ;imprime el valor de unidades en el lcd
call envia
movlw 0xDF ;visualiza "°"
call envia
movlw "C"
call envia
GOTO Ciclo
;-------------------------------------------------------------------
DIAGRAMA Y SIMULACION:





Puede descargar el programa completo en la seccion de Desgargas de este blog.

jueves, 27 de noviembre de 2008

LCD MAS ENTRADAS DIGITALES CON PIC16F877 EN ENSAMBLADOR

En respuesta a nuestro lector "alve mont" de Colombia se realizo este programa con el fin de poder ayudarlo en lo que esta en nuestro alcance.

DESCRIPCION:

Este programa maneja un lcd de 16*2 y los 4 bits del puerto D como entrada con el pic16f877.Este sencillo ejemplo nos muestra el uso de las entradas digitales del Mc,en el interior del micro se encuentran 10 letreros que seran mostrados dependiendo de que combinacion binaria se encuentre en la entrada del puerto D.

Para el LCD se utiliza todo el puerto C para enviar el dato y los 2 pines menos significativos del puerto B para el RS Y EL E.

Nota: retrado calculado para un cristal de 20 Mhz

MATERIALES:

- PIC16F877A
- Resistencias de 4.7K,2.2k
- Cristal de 20MHZ
- Push Botton
- Fuente de DC de 5 volts
- Protoboard
- LCD
- Capacitores

RUTINAS IMPORTANTES DEL PROGRAMA:
;-----------------------------------------------------------------
;"rutina que verifica que valor binario se encuentra en la entrada"
bucle:
clrf aux
movf PORTD,W
movwf aux
xorlw b'00000001'
btfsc STATUS,Z
goto blank

movf aux,W
movwf aux
xorlw b'00000010'
btfsc STATUS,Z
goto blank1

movf aux,W
movwf aux
xorlw b'00000011'
btfsc STATUS,Z
goto blank2

movf aux,W
movwf aux
xorlw b'00000100'
btfsc STATUS,Z
goto blank3

movf aux,W
movwf aux
xorlw b'00000101'
btfsc STATUS,Z
goto blank4

movf aux,W
movwf aux
xorlw b'00000110'
btfsc STATUS,Z
goto blank5

movf aux,W
movwf aux
xorlw b'00000111'
btfsc STATUS,Z
goto blank6

movf aux,W
movwf aux
xorlw b'00001000'
btfsc STATUS,Z
goto blank7

movf aux,W
movwf aux
xorlw b'00001001'
btfsc STATUS,Z
goto blank8

movf aux,W
movwf aux
xorlw b'00001010'
btfsc STATUS,Z
goto blank9



goto bucle
;-----------------------------------------------------------------
;"Fragmento de la rutina que manda a llamar el letrero a imprimir en pantalla"
blank:
call limpia
a:
lcdwr letrero,a,bucle
; call linea2
;///////////////////////////////////////////////////////////////////////////////////////
blank1:
call limpia
a1:
lcdwr letrero1,a1,bucle
;//////////////////////////////////////////////////////////////////////////////////////
blank2:
call limpia
a2:
lcdwr letrero2,a2,bucle
;////////////////////////////////////////////////////////////////////////////////////
;-------------------------------------------------------------------
;"Fragmento de los 10 letreros que muestra el programa"
letrero:
addwf PCL, F
dt "Andres Barrera",0x04
letrero1:
addwf PCL, F
dt"Dumar Bernal",0x04
letrero2:
addwf PCL, F
dt"Jose Bohorquez",0x04
;---------------------------------------------------------------
;"Macro que realiza el despliege del letrero";
lcdwr macro Escri, Es0, Es1
movfw Contado ;Movemos el valor de contador a W
call Escri ;Llamamos a Escri
call envia ;Llamamos a envia
incf Contado, F ;Incrementamos contador
movlw 0x04 ;Movemos este valor a W y despues
subwf Temp,F ;se lo restamos a Temp
btfss STATUS, Z ;y verificamos si se puso la bandera de 0
goto Es0 ;Vamos a Es0 lo cual indica que no se ha terminado de mandar la cadena
clrf Contado ;Limpiamos el contador
goto Es1 ;Vamos a Es1
endm

;-------------------------------------------------------

Espero que esto sea de gran ayuda para "alve mont" de Colombia.

Saludos.

lunes, 24 de noviembre de 2008

LCD + TECLADO + PIC16F877

Teclado matricial 2 X 2 + LCD(16*2)

DESCRIPCION:

Este programa maneja un lcd de 16*2 y teclado matricial con el pic16f877.Este sencillo ejemplo del uso del teclado matricial + lcd se puede extender a un manejo de Teclado matricial de 4*4,5*5, etc.Dependiendo de que tecla se precione aparece un numero distinto en el LCD.Para el LCD se utiliza todo el puerto C para enviar el dato y los 2 pines menos significativos del puerto B para el RS Y EL E.

Nota: retrado calculado para un cristal de 20 Mhz

FUNCIONAMIENTO:

Cuando se presiona un pulsador se conecta una fila con una columna, teniendo en cuenta este hecho es muy fácil averiguar que tecla fue pulsada. También podemos ver la conexion típica con el puerto D del µC PIC.

Las resistencias de 2k2 son necesarias para poder compartir el puerto del pic independientemente del teclado y por ejemplo poder conectar un LCD al mismo tiempo. Durante la fase de lectura del teclado 2 pines del puerta D es configurada como entrada y los otros como salida.


MATERIALES:

- PIC16F877A
- Resistencias de 4.7K,2.2k
- Cristal de 20MHZ
- Push Botton
- Fuente de DC de 5 volts
- Protoboard
- LCD
- Capacitores

RUTINAS IMPORTANTES DEL PROGRAMA:
;-----------------------------------------------
call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD)
call letrero ;imprime el letrero de bienvenida
call delay ;retardo de tiempo
call delay ;retardo de tiempo
call limpia ;limpia el lcd

;-----------------------------------------------
Rutina del teclado


Le:
MOVLW B'00000100' ;ponemos a 1 el pin3 del puerto d
MOVWF PORTD
BTFSC PORTD,0 ;checamos si el pin0 del puerto d esta en 1
GOTO LE ;si es asi escribimos el num. 1 si no checamos el siguiente pin
BTFSC PORTD,1 ;checamos si el pin1 del puerto d esta en 1
GOTO LE1 ;si es asi escribimos el num. 2 si no checamos el siguiente pin
MOVLW B'00001000' ;ponemos a 1 el pin4 del puerto d
MOVWF PORTD
BTFSC PORTD,0 ;checamos si el pin0 del puerto d esta en 1
GOTO LE2 ;si es asi escribimos el num. 3 si no checamos el siguiente pin
BTFSC PORTD,1 ;checamos si el pin1 del puerto d esta en 1
GOTO LE3 ;si es asi escribimos el num. 4 si no checamos el siguiente pin

goto Le
;--------------------------------------------------------------

DIAGRAMA:



Puede descargar el programa completo en la seccion de Desgargas de este blog.

sábado, 22 de noviembre de 2008

LCD mas Pic16f877

LCD: Manejo del LCD(16*2)

DESCRIPCION:

Este programa maneja un lcd de 16*2 con el pic16f877.El lcd se encuentra configurado en 8 bits, se utiliza todo el puerto C para enviar el dato y los 2 pines menos significativos del puerto B para el RS Y EL E.

Nota: retrado calculado para un cristal de 20 Mhz

MATERIALES:

- PIC16F877A
- Resistencias de 4.7K
- Cristal de 20MHZ
- Push Botton
- Fuente de DC de 5 volts
- Protoboard
- LCD

RUTINAS IMPORTANTES DEL PROGRAMA:

;--------------------------------------------------------------------
CLRF PORTB ;LIMPIA EL PUERTO
CLRF PORTC ;LIMPIA EL PUERTO
call inicialcd ;CONFIGURA EL LCD(INICIALIZA EL LCD)
call letrero ;ESCRIBE EL LETRERO
call limpia ;LIMPIA EL LCD
call linea2 ;SELECCIONA LA LINEA 2
call letrero ;ESCRIBE EL LETRERO
;--------------------------------------------------------------------
;subrutina para inicializar el lcd
inicialcd:

movlw 0x01 ; El comando 0x01 limpia la pantalla en el LCD
movwf PORTC
call comando ; Se da de alta el comando
movlw 0x0C ; Se selecciona la primera linea
movwf PORTC
call comando ; Se da de alta el comando
movlw 0x3C ; Se configura el cursor
movwf PORTC
call comando ; Se da de alta el comando
bsf PORTB, 1 ; Rs se pone en 1 para deshabilitar el uso de comandos
return
;-------------------------------------------------------------------
linea2:
bcf PORTB, 1 ; rs en 0
movlw 0xc0 ; selecciona linea 2 pantalla en el LCD
movwf PORTC
call comando ; Se da de alta el comando
return
;-------------------------------------------------------------------
limpia:
bcf PORTB, 1 ; rs en 0
movlw 0x01 ; limpia lcd pantalla en el LCD
movwf PORTC
call comando ; Se da de alta el comando
return
;--------------------------------------------------------------------

DIAGRAMA DE CONECCIÓN:



Puede descargar el programa completo en la seccion de Desgargas de este blog.

lunes, 10 de noviembre de 2008

RS-232: SUMA DE DOS NUMEROS

DESCRPCION:

Este programa utiliza la comunicacion serial del pic16f877. La hiperterminal simulada o de una pc primero pide el primer sumando y despues pide el segundo sumando, y de inmediato te regresa el resultado, y despues sigue con el mismo procedimiento.

nota:la comunicacion es a 19200 bauds

MATERIALES:

- PIC16F877A
- Resistencias de 4.7K
- Cristal de 20MHZ
- Push Botton
- Fuente de DC de 5 volts
- Protoboard

RUTINAS IMPORTANTES DEL PROGRAMA:
;------------------------------------------------------------------------------
Configuracion de comunicacion:

bcf STATUS,RP0 ;Vamos al banco 0
bsf RCSTA,SPEN ;Habilitamos el puerto serial
bsf RCSTA,CREN ;Habilitamos recepción continua
bsf STATUS,RP0 ;Vamos al banco 1
movlw d'64' ;Valor del BRG para 19200 baud a 20MHz
movwf SPBRG
movlw b'00100100' ;Habilitamos transmision, modo asincrono y alta velocidad
movwf TXSTA
bcf STATUS, RP0 ;Vamos al banco 0
;------------------------------------------------------------------------------
CALL LETRERO ;despliega en hiperterminal "DATO 1"
CALL Recepcion ;espera recepcion decena del 1 dato
MOVWF VARIABLE1H ; lo guarda en la variable
CALL Recepcion ;espera recepcion unidad del 1 dato
MOVWF VARIABLE1L ; lo guarda en la variable
CALL LETRERO2 ;despliega en hiperterminal "DATO 2"
CALL Recepcion ;espera recepcion decena del 2 dato
MOVWF VARIABLE2H ; lo guarda en la variable
CALL Recepcion ;espera recepcion unidad del 2 dato
MOVWF VARIABLE2L ; lo guarda en la variable
MOVLW 0X0A
CALL Transmicion
MOVLW 0X0D
CALL Transmicion
MOVLW 'R'
CALL Transmicion
MOVLW '='
CALL Transmicion
;------------------------------------------------------------------------------
Recepcion:
bcf STATUS,RP0 ;Vamos al banco 0
btfss PIR1,RCIF ;Verificamos la bandera de recepción
goto $-1 ;Regresamos a la linea anterior
movf RCREG,W ;Movemos lo que se recibió en RCREG a W
bcf PIR1,RCIF ;Limpiamos la bandera de recepción
return
;------------------------------------------------------------------------------
Transmicion:
bcf STATUS,RP0 ;Vamos al banco 0
movwf TXREG ;Copiamos W a TXREG
btfss PIR1, TXIF ;Verificamosla bandera de transmisión
goto $-1 ;Regresamos a la linea anterior
bcf PIR1, TXIF ;Limpiamos la bandera de transmision
return



Puede descargar el programa completo en la seccion de Desgargas de este blog.

sábado, 8 de noviembre de 2008

Secuencia de encendido de Leds

Descripción:

8 LED conectados a un puerto del Pic (PORTB),los 8 leds enciende con ciertos intervalos una vez encendidos todos se apaga todo el puerto:

Nota: El voltaje consumido por el LED es aproximadamente de 2V. Asumiendo que la corriente que consume el LED es de 10mA, calculando la resistencia:

R=V/I=(5-2)/10mA= 0.3K = 330 Ohms

Materiales:

- PIC16F877A
- Resistencias de 330Ohms, 4.7K
- LEDs
- Cristal de 20MHZ
- Push Botton
_ Fuente de DC de 5 volts
_ Protoboard

Programa:

Ciclo:
CLRF PORTB ;Apaga todos los LEDs
call delay
BSF PORTB,0 ;enciende el LED RB0
call delay
BSF PORTB,1 ;enciende el LED RB1
call delay
BSF PORTB,2 ;enciende el LED RB2
call delay
BSF PORTB,3 ;enciende el LED RB3
call delay
BSF PORTB,4 ;enciende el LED RB4
call delay
BSF PORTB,5 ;enciende el LED RB5
call delay
BSF PORTB,6 ;enciende el LED RB6
call delay
BSF PORTB,7 ;enciende el LED RB7
call delay

GOTO Ciclo

Diagrama: