Sei sulla pagina 1di 15

Laboratorio pic16f628a

Este fue el primer laboratorio para poder conocer como un pic16f628a nos ayude a realizar varias conexiones electrnicas, desde prender un led hasta que nos tenga la mejor ayuda del microchip. Sus primeros cambios fue conectar con el pic16f84a, pero el costo es menor con el microcontrolador pic16f628a con mejores actualizaciones, desde tener un cristal dentro del micro con muchsimo ms memoria. Es decir: Flash programa 2048x14, ram dato 224x8, eeprom dato 128x8 y muy buen conexin de 3V a 5,5V. Realiza infinidad de veces mejores que el pic16f84a; ademas no es fcil de encontrar este pic anterior.

Lo mas sensillo en estos cambios son los siguientes:


LIST P = 16F84 #include <p16F84.inc> __CONFIG 1Bh ;_CP_OFF & _PWRTE_ON & _WDT_OFF & _RC_OSC ;20h General ;21h General ;22h General ;23h General ;24h General ;25h General ;26h General ;27h General ;28h General ;29h General ;2Ah General ;2Fh General ;30h rutina delay etc ;31h rutina delay etc ;32h rutina delay etc ;33h para bajo delay etc ;3Eh para bits etc ;3Fh para bits etc Empieza Empieza1 ORG 0 BSF 03,5 MOVLW 03 MOVWF 05 MOVLW 08 MOVWF 06 BCF 03,5 ;Cargue el cdigo a direccin 000 ;seleccionar Banko 1 ;Pone 0000 0011 en W ;graba TrisA. RA0, RA1 entrada. Otros salidas ;Pone 0000 1000 en W ;graba TrisB. RB3 entrada. Otros salidas ;Banko 0

CLRF 06 GOTO Principal Tabla1 ADDWF 02,1 RETLW 08 RETLW 01Ah RETLW 0BEh RETLW 0FFh XXX XXX RETLW 00 XXX BTFSS 06,3 XXX XXX CALL Delay1 XXX BSF 06,0 XXX CALL Tabla1 XXX

;apagar Port B

Delay1 Principal

;Mire una lnea de la entrada ;Input LOW ;Test de linear entrada

; realice la salida

alta

GOTO Principal END LIST P=16F6280a ;f=inhx8m ;Fin

#include "P16F628.inc" __CONFIG _CP_OFF &_BODEN_OFF &_PWRTE_OFF &_WDT_OFF &_LVP_OFF &_MCLRE_OFF &_INTRC_OSC_NOCLKOUT ;interno crystal 4MHz ;20h General ;21h General ;22h General ;23h General ;24h General ;25h General ;26h General ;27h General ;28h General ;29h General ;2Ah General ;2Fh General ;30h rutina delay etc ;31h rutina delay etc ;32h rutina delay etc ;33h para bajo delay etc ;3Eh para bits etc ;3Fh para bits etc Empieza ORG 0 MOVLW 07 MOVWF 1Fh BSF 03,5 CLRF 06 MOVLW 030h MOVWF 05 BCF 03,5 CLRF 3F CLRF 05 CLRF 06 GOTO Main ;Cargue el cdigo a direccin 000 ;compartido ;1F es el CMCON ;Banko 1 ;apagado port B salida ;graba W con 0011 0000 ;RA0,1,2,3,6 salida RA4 y 5 entrada ;Banko 0 ;apaga el boton que presiona ;apagado la lneas de salida de porta A ;apagan las salidas de porta B

Table1

ADDWF 02,1 RETLW 0A1h RETLW 32h

Del1

NOP DECFSZ 30h,1 GOTO Del1 DECFSZ 31h,1 GOTO Del1 RETURN MOVLW 020h MOVWF 022h BTFSC 2F,0 XXX GOTO Principal

Principal

;Boton A presiona el primer tiempo?

END

;Fin

Luego de esta forma, encontraremos que el cambio del pic16f84a al 16f628a se puede y no ser muy difcil. Circuito de Laboratorio

Mostramos el primer experimento Este experimento enciende un Led cuando el botn A se presiona. El botn se presionar en el puerto A (bit 0) donde la lnea que entra ser alta. Esto se llama lgica positiva. El Led es conectado del puerto B (bit 0). En este circuito, el puerto "A" realiza una entrada y el puerto "B" en la salida. El puerto A y B tiene 8 lneas con el pic16f628a, pues en el pic16f84a el puerto A llegan solamente 5 lneas.

El interruptor se conecta a RA0 y el led se conecta a RB0. Cualquier puerto puede cambiarse de una entrada o salida en el programa. Si usted va a cambiar la direccin de un puerto, revise bien el circuito pues si por ejemplo se conecta el puerto B a la tierra pero no al led, el chip se daar cuando el botn se pulse.
;Proyecto1: Pulsando el boton, prende el LED List P = 16F628a #include <p16F628a.inc> __CONFIG B'11110100111001';_CP_OFF &_BODEN_OFF &_PWRTE_OFF &_WDT_OFF&_LVP_OFF &_MCLRE_ON &_INTRC_OSC_NOCLKOUT Empezar ORG 0 MOVLW MOVWF BSF CLRF MOVLW MOVWF BCF CLRF BTFSS GOTO BSF GOTO BCF GOTO

0x07 CMCON 03,5 06 01 05 03,5 06 05,0 Principal2 06,0 Principal 06,0 Principal

;apaga el comparador ;Banko 1 ;apagado puerto B salida ;grabando W con 0000 0001 ;Make RA0 input ;Banko 0 ;apagado puerto B salida ;Test de entrada en puerto A ;Boton no presionado ;Boton presionado, prende el LED ;ir a Principal ;Button not pressed. Turn off LED ;ir a Principal ;Fin

Principal

Principal2

END

De esta forma encontraran 24 formas especiales en el laboratorio, donde en m, a solucionado muchsimas respuestas que pude resolver.

TERMOMETRO: pic16f877a y Lm35


El LM35 es un sensor de temperatura con una precisin calibrada de 1C. Puede medir temperaturas en el rango que abarca desde -55 a + 150C. La salida es muy lineal y cada grado centgrado equivale a 10 mV en la salida. Haremos un medidor de temperatura usando la conversion 10-bit del convertidor A/D del pic16f877a y Ra0 como entrada analogica para mostrar el resultado sobre un LCD de 2*16 ;Configuracion de pines del LCD hacia el PIC16f877a Define LCD_DREG PORTB Define LCD_DBIT 4 Define LCD_RSREG PORTB Define LCD_RSBIT 2 Define LCD_EREG PORTB Define LCD_EBIT 3 ;usamos puertoB como salida de datos ; solo usamos 4 bits altos (Rb4-RB7) ;RS va conectado a puertoB ; RS a Rb2 ; E va conectado a puertoB ; E va a Rb3

;Definimos parametros del conversor A/D Define ADC_BITS 10 Define ADC_CLOCK 3 Define ADC_SAMPLEUS 50 Resultado var word TRISA = %11111111 ADCON1 = %10000010 Pause 200 ;Numero bits del resultado=10 ;fuente del Reloj 3 (3=rc) ;tiempo de muestreo del ADC en useg ;Historia de la conversion ; PORTA configurado como entradas ; PORTA analog y justificacion del resultado ;tiempo para el LCD

;Programa Principal inicio: ADCIN 0, Resultado ;lee Ra0 y guarda en resultado Lcdout $fe,1 ;Limpia la pantalla Lcdout "temperatura:",DEC Resultado ;muestra el resultado en decimal LCDOUT $fe,$C0,"grados C" ; pasa a la siguiente linea y escribe Pause 1000 ;espera 1 seg Goto inicio ;vamos a inicio End

Logico que al circuito hay que colocarle un cristal de 4 MHZ y conectar pines 11 y 32 a 5V. y pines 12 y 31 a Gnd. Aqui tienen el archivo HEX listo para grabarlo, lo pueden bajar del siguiente link: http://www.4shared.com/file/N96RlROQ/termometro.html NOTA: El proyecto presenta un pequeo error en la medicion el cual se puede corregir de varia maneras, una solucion rapida es utilizar un potenciometro de 5k y colocar sus extremos entre el pin2 del lm35 y tierra luego el centro o terminal variable del potenciometro conectar a la entrada Ra0 del pic de tal manera que hacemos un divisor de tension. Otra forma es usando amplificadores operacionales el cual veremos mas adelante.

Termometro con pic16F877A


Anuncios Google

Medio de Temperaturawww.italterm.com - Medio de Temperatura em Metais INDICMAX, FORNERO,


ITALTEMP Esto es para los interesados en electronica y microcontroladores, es un termometro digital hecho con un pic16F877A, un display de 16x2 y un LM35 (sensor de temperatura). El sensor manda la seal analogica al microcontrolador y despliega en el display la temperatura que el sensor esta capturando. Tiene una varioacion como de 1 grado con la temperatura real asi que es bastante exacto. Les dejo el circuito electrico, la simulacion la hice con el ISIS proteus: ====== Lista de materiales ====== U1 = Microcontrolador PIC16F877A U2 = Sensor de temperatura LM35 LCD1 = Display de 16x2 (16 caracteres por 2 filas) X1 = Cristal de cuarzo de 4Mhz PB1 = pulsador o push button normalmente abierto R1 = Resistencia de 100 ohm a 1/4 w R2 = Resistencia de 10 kohm a 1/4 w RV1 = Potenciometro de 10 kohm C1, C2 = Capacitores ceramicos de 15pf (no polarizados) C3 = Capacitor ceramico de 100nf (no polarizados) D1 = Diodo 1N4148 NOTA: Si tu LCD tiene un led para la luz de fondo debes agregarle una resistencia de 220 o 330 ohm en el pin del anodo o polo positivo de este led. Pera saber cuales son esos pines consulta el datasheet de tu LCD.

Tambien les dejo el codigo, esta hecho en lenguaje ensamblador, el codigo no lo hice, solo lo modifique del original por que estaba hecho para el pic16f887, les dejo la info del autorIng. Miguel Angel Piedra Angeles,http://www.cosasdeingenieria.com

dijo: ;*********************************************************************************** ; * ; programa: termometro.asm * ; * ; este programa muestra el funcionamiento del conversor analgico - digital que * ; contiene el pic16f877a. toma la seal analgica del sensor de temperatura y la * ; convierte a digital. una vez hecha la conversin la despliega en la pantalla lcd *

; dndonos como resultado la temperatura que hay en el ambiente. * ; * ; velocidad del reloj: 4mhz tipo de reloj: xt * ; perro guardin: deshabilitado proteccin del cdigo: off * ; * ;*********************************************************************************** list p=16f877a radix hex include "p16f877a.inc" ;declaracin de la librera ;*******************declaracin de los bits de configuracin******************* __config _cp_off&_cpd_off&_lvp_off&_wdt_off&_xt_osc ;************************** declaracin de registros ************************** cblock 0x20 num1,num2,num3 ;****************************************************************************** pointer ;registros utilizados en unidades,decenas ;binbcd y en la adquisicin de centenas,millares ;datos datoh unidadest,decenast centenast,millarest sample shift ;****************************************************************************** promedio contador endc cblock 0x70 ;se coloca a datol en una de las localidades de datol ;memoria que estn espejadas en banco0 y banco1 endc ;****************************************************************************** ;****************declaracin de los pines de control de la lcd***************** #define rs portc,2 #define en portc,1 ;****************************************************************************** ;**************puerto donde estarn los pines de datos de la lcd*************** portlcd equ portd ;****************************************************************************** ;****************************************************************************** ;comandos de la pantalla limpiar equ b'00000001' ;limpia toda la pantalla renglon1 equ b'10000000' ;coloca en el rengln 1 renglon2 equ b'11000000' ;coloca en el rengln 2 dison equ b'00001100' ;enciende el display home equ b'00000010' ;va a la direccin 0 shiftdl equ b'00011100' ;rota el lcd a la izquierda shiftdr equ b'00011000' ;rota el lcd a la derecha shiftcl equ b'00010100' ;rota el cursor a la izquierda shiftcr equ b'00010000' ;rota el cursor a la derecha ;****************************************************************************** org 0x00 ;vector de reset goto inicio ;salto al inicio del cdigo org 0x04 ;vector de interrupcin ;*******************tablas de datos para la subrutina binbcd******************* tablau ;tabla de unidades movf pointer,w addwf pcl,f retlw d'2' retlw d'6' retlw d'8' retlw d'4' retlw d'2' retlw d'6' retlw d'8' retlw d'4' retlw d'2' retlw d'1' tablad ;tabla de decenas

movf pointer,w addwf pcl,f retlw d'1' retlw d'5' retlw d'2' retlw d'6' retlw d'3' retlw d'1' retlw d'0' retlw d'0' retlw d'0' retlw d'0' tablac ;tabla de centenas movf pointer,w addwf pcl,f retlw d'5' retlw d'2' retlw d'1' retlw d'0' retlw d'0' retlw d'0' retlw d'0' retlw d'0' retlw d'0' retlw d'0' ;****************************************************************************** inicio: bsf status,rp0 ;cambio a banco1 clrf trisd ;configuro todo portd como salida bcf trisc,1 ;configuro portc,1 como salida(en) bcf trisc,2 ;configuro portc,2 como salida(rs) bcf status,rp0 ;cambio a banco0 clrf portd ;apago posible latchs en portd clrf portc ;apago posible latchs en portc call init_adqui ;llamo a la subrutina de configuracin de ;el modulo adc call initlcd ;llamo a la subrutina de inicializacin ;de la pantalla lcd 16x2 start call d16x2 ;llamo a la subrutina que escribe el mensaje inicial ;**************************************** ;codigo que hace que se ejecute el comando de rotacin a la derecha 46 veces movlw .46 movwf shift vuelta call retardo movlw shiftdr ;comando de rotacin call cmd decfsz shift,f goto vuelta ;**************************************** movlw limpiar ;comando de limpieza de pantalla call cmd opera movlw renglon1 ;comando para empezar a escribir a partir call cmd ;de la primera direccin del renglon1 clrf promedio ;se limpia al registro promedio call adqui ;se llama a la subrutina de adquisicin de ;datos del adc call binbcd ;llamo a la subrutina que convierte de binario ;a ascii ;**************************************** movf millares,w ;mando los datos adquiridos a la lcd call dato movf centenas,w call dato

movf decenas,w call dato movf unidades,w call dato ;**************************************** movlw b'11011111' ;dato para el smbolo de grado call dato movlw 'c' ;la c de celsius call dato goto opera ;regreso al inicio del programa principal ;**************************subrutina de los mensajes ************************** d16x2 movlw "p" call dato movlw "r" call dato movlw "o" call dato movlw "y" call dato movlw "e" call dato movlw "c" call dato movlw "t" call dato movlw "o" call dato movlw " " call dato movlw "p" call dato movlw "d" call dato movlw "m" call dato movlw renglon2 call cmd movlw "t" call dato movlw "e" call dato movlw "r" call dato movlw "m" call dato movlw "o" call dato movlw "m" call dato movlw "e" call dato movlw "t" call dato movlw "r" call dato movlw "o" call dato movlw " " call dato movlw "a" call dato movlw "/"

call dato movlw "d" call dato return ;**********************subrutina de adquisicin del adc********************** adqui: call sampletime ;retardo de adquisicin bsf adcon0,go ;inicia la conversin btfsc adcon0,go ;ya se termino la conversin? goto $-1 ;no? pregunta de nuevo banksel adresh ;si, continua movf adresh,w ;lee la parte ms significativa movwf datoh ;gurdalo en datoh banksel adresl ;cambio a banco1 movf adresl,w ;lee la parte menos significativa movwf datol ;gurdalo en datol banksel portb ;cambio a banco0 bcf status,c ;borra el bit de acarreo rrf datoh,f ;elimino el bit menos significativo rrf datol,f ;para ocupar solo 9 bits return sampletime: movlw .225 movwf sample espera_s: nop nop decfsz sample,f goto espera_s return ;***********************subrutina de inicializacin lcd************************ initlcd: movlw b'00110000' ;1 call cmd movlw b'00110000' ;2 call cmd movlw b'00110000' ;3 call cmd movlw b'00111100' ;4 call cmd movlw b'00001000' ;5 call cmd movlw b'00000001' ;6 call cmd movlw b'00000110' ;7 call cmd movlw dison ;8 call cmd movlw home call cmd return ;*****************subrutina que enva los caracteres a la lcd****************** dato movwf portlcd bsf rs nop nop nop bsf en call retardo5ms bcf en return ;******************subrutina que enva los comandos a la lcd******************* cmd movwf portlcd

bcf rs nop nop nop bsf en call retardo5ms bcf en return ;****************************************************************************** retardo5ms movlw d'1' movwf num3 otra25 movlw d'100' movwf num2 otra15 movlw d'166' movwf num1 otra5 decfsz num1,f goto otra5 decfsz num2,f goto otra15 decfsz num3,f goto otra25 return ;****************************************************************************** retardo movlw d'3' movwf num3 otra25a movlw d'200 ' movwf num2 otra15a movlw d'166' movwf num1 otra5a decfsz num1,f goto otra5a decfsz num2,f goto otra15a decfsz num3,f goto otra25a return ;******************subrutina de conversin de binario a ascii****************** binbcd clrf millares clrf unidades clrf decenas clrf centenas clrf pointer otra btfss datoh,7 goto rota call tablau addwf unidades,f call tablad addwf decenas,f call tablac addwf centenas,f ;**************************************** movf unidades,w sublw d'10' btfss status,c goto mayor goto menor mayor incf decenas,f movlw d'10' subwf unidades,f goto dece menor movlw d'10'

subwf unidades,w btfss status,z goto dece goto mayor ;**************************************** dece movf decenas,w sublw d'10' btfss status,c goto mayord goto menord mayord incf centenas,f movlw d'10' subwf decenas,f goto cente menord movlw d'10' subwf decenas,w btfss status,z goto cente goto mayord ;**************************************** cente movf centenas,w sublw d'10' btfss status,c goto mayorc goto menorc mayorc incf millares,f movlw d'10' subwf centenas,f goto milla menorc movlw d'10' subwf centenas,w btfss status,z goto milla goto mayorc ;**************************************** milla movf millares,w sublw d'10' btfss status,c goto mayorm goto menorm mayorm movlw d'10' subwf millares,f goto rota menorm movlw d'10' subwf millares,w btfss status,z goto rota goto mayorm ;**************************************** rota rlf datol,f rlf datoh,f incf pointer,f movf pointer,w sublw d'10' btfss status,z goto otra movlw 0x30 addwf unidades,f movlw 0x30 addwf decenas,f movlw 0x30 addwf centenas,f

movlw 0x30 addwf millares,f return ;**********************subrutina de configuracin del cad********************** init_adqui: bsf status,rp0 bsf trisa,0 clrf adcon1 bcf status,rp0 movlw b'11000001' movwf adcon0 return end ;final del programa

Potrebbero piacerti anche