Practicas en Mplab

55
Prender un led con un 16F84A por RB0, de lo mas sencillo Código GeSHi (asm): ; 02-06-06 ; Ejemplo 01 ; Prender un led ; PIC 16f84a ; MPLAB 7.30 ; PROTEUS 6.9 SP3 ; Veguepic LIST P=16F84A, ; usar PIC 16F84A #include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off ; power up timer on ; watchdog off ; osc XT ORG 0 BSF STATUS,5 ; activa la pagina 1 MOVLW B'00000' ; carga 00000 en W MOVWF TRISA ; puerto a todos salidas MOVLW B'00000000' ; carga 00000000 en W MOVWF TRISB ; puerto b todos salidaS BCF STATUS,5 ; volvemos a la pagina 0 BCF PORTB,0 ; ponemos a 0 RB0 BCF PORTB,1 ; ponemos a 0 RB1 BCF PORTB,2 ; ponemos a 0 RB2 BCF PORTB,3 ; ponemos a 0 RB3 BCF PORTB,4 ; ponemos a 0 RB4 BCF PORTB,5 ; ponemos a 0 RB5 BCF PORTB,6 ; ponemos a 0 RB6 BCF PORTB,7 ; ponemos a 0 RB7 ; luego haremos todos juntos

Transcript of Practicas en Mplab

Page 1: Practicas en Mplab

Prender un led con un 16F84A por RB0, de lo mas sencillo

CódigoGeSHi (asm):; 02-06-06; Ejemplo 01; Prender un led; PIC 16f84a; MPLAB 7.30; PROTEUS 6.9 SP3; Veguepic LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaSBCF STATUS,5 ; volvemos a la pagina 0 BCF PORTB,0 ; ponemos a 0 RB0BCF PORTB,1 ; ponemos a 0 RB1BCF PORTB,2 ; ponemos a 0 RB2BCF PORTB,3 ; ponemos a 0 RB3BCF PORTB,4 ; ponemos a 0 RB4BCF PORTB,5 ; ponemos a 0 RB5BCF PORTB,6 ; ponemos a 0 RB6BCF PORTB,7 ; ponemos a 0 RB7 ; luego haremos todos juntos INICIO ; etiquetaBSF PORTB,0 ; pone a 1 RB0GOTO INICIO ; va a inicio END ; fin de programa

Page 2: Practicas en Mplab

Prender y apagar un led cada 0.5 segundos con un 16F84A por RB0

CódigoGeSHi (asm):; 02-06-06; Ejemplo 02; Prende y apagar un led cada 0.5 seg; PIC 16f84a; MPLAB 7.30; PROTEUS 6.9 SP3; Veguepic LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT PDel0 equ 0CPDel1 equ 0D ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaSBCF STATUS,5 ; volvemos a la pagina 0 MOVLW B'00000000' ; ponemos a cero elMOVWF PORTB ; el puerto b; usando esta opcion se ahorran; 6 bytes en comparacion con el; ejemplo 01 INICIO ; etiqueta

Page 3: Practicas en Mplab

BSF PORTB,0 ; pone a 1 RB0CALL DEMORA ; llama a demora de 0,5 segBCF PORTB,0 ; pone a 0 RB0CALL DEMORA ; llama a demora de 0,5 segGOTO INICIO ; va a inicio ;-------------------------------------------------------------; La demora a sido generada con el programa PDEL; Delay 250000 ciclos;------------------------------------------------------------- DEMORA movlw .197 ; 1 set numero de repeticion (B) movwf PDel0 ; 1PLoop1 movlw .253 ; 1 set numero de repeticion (A) movwf PDel1 ; 1PLoop2 clrwdt ; 1 clear watchdog clrwdt ; 1 ciclo delay decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loopPDelL1 goto PDelL2 ; 2 ciclos delayPDelL2 return ; 2+2 Fin.;--------------------------------------- END ; fin de programa

Prender y apagar 4 leds cada segundo (RB0 a RB3). 0,5 segundos prendido y 0,5 segundos apagado con un 16F84A

CódigoGeSHi (asm):; 03-06-06; Ejemplo 03

Page 4: Practicas en Mplab

; Prender y apagar un 4 leds cada 1 seg; PIC 16f84a; MPLAB 7.30; PROTEUS 6.9 SP3; Veguepic LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT PDel0 equ 0CPDel1 equ 0D ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaSBCF STATUS,5 ; volvemos a la pagina 0 MOVLW B'00000000' ; ponemos a cero elMOVWF PORTB ; el puerto b; usando esta opcion se ahorran; 6 bytes en comparacion con el; ejemplo 01 INICIO ; etiqueta MOVLW B'00001111' ; prendemos leds RB0 a RB3MOVWF PORTB ; cargamos el puerto b CALL DEMORA ; llama a demora de 0,5 seg MOVLW B'00000000' ; apagamos leds RB0 a RB3MOVWF PORTB ; cargamos el puerto b

Page 5: Practicas en Mplab

CALL DEMORA ; llama a demora de 0,5 segGOTO INICIO ; va a inicio ;-------------------------------------------------------------; La demora a sido generada con el programa PDEL; Delay 500000 ciclos;------------------------------------------------------------- DEMORA movlw .239 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 |PLoop1 movlw .232 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 |PLoop2 clrwdt ; 1 clear watchdogPDelL1 goto PDelL2 ; 2 ciclos delayPDelL2 goto PDelL3 ; 2 ciclos delayPDelL3 clrwdt ; 1 ciclo delay decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loopPDelL4 goto PDelL5 ; 2 ciclos delayPDelL5 goto PDelL6 ; 2 ciclos delayPDelL6 goto PDelL7 ; 2 ciclos delayPDelL7 clrwdt ; 1 ciclo delay return ; 2+2 Fin. ;--------------------------------------- END ; fin de programa

Page 6: Practicas en Mplab

Efecto de luces tipo Auto Fantastico con un 16F84A por el puerto b, RB0 a RB7CódigoGeSHi (asm):; 04-06-06; Ejemplo 04; Luces del Auto fantastico; PIC 16f84a; MPLAB 7.30; PROTEUS 6.9 SP3; Veguepic LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT PDel0 equ 0CPDel1 equ 0D ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaSBCF STATUS,5 ; volvemos a la pagina 0 MOVLW B'00000000' ; ponemos a cero elMOVWF PORTB ; el puerto b INICIO ; etiqueta BSF PORTB,0 ; prendemos y apagamosCALL DEMORA ; led por ledBCF PORTB,0 ; despues trataremos de; usar otra funcion

Page 7: Practicas en Mplab

BSF PORTB,1CALL DEMORABCF PORTB,1 BSF PORTB,2CALL DEMORABCF PORTB,2 BSF PORTB,3CALL DEMORABCF PORTB,3 BSF PORTB,4CALL DEMORABCF PORTB,4 BSF PORTB,5CALL DEMORABCF PORTB,5 BSF PORTB,6CALL DEMORABCF PORTB,6 BSF PORTB,7CALL DEMORABCF PORTB,7 BSF PORTB,6CALL DEMORABCF PORTB,6 BSF PORTB,5CALL DEMORABCF PORTB,5 BSF PORTB,4CALL DEMORABCF PORTB,4 BSF PORTB,3CALL DEMORA

Page 8: Practicas en Mplab

BCF PORTB,3 BSF PORTB,2CALL DEMORABCF PORTB,2 BSF PORTB,1CALL DEMORABCF PORTB,1 GOTO INICIO ; va a inicio ;-------------------------------------------------------------; La demora a sido generada con el programa PDEL; Descripcion: Delay 100000 ciclos - 100 ms;-------------------------------------------------------------DEMORA movlw .110 ; 1 set numero de repeticion (B) movwf PDel0 ; 1 |PLoop1 movlw .181 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 |PLoop2 clrwdt ; 1 clear watchdog clrwdt ; 1 ciclo delay decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B) goto PLoop1 ; 2 no, loopPDelL1 goto PDelL2 ; 2 ciclos delayPDelL2 goto PDelL3 ; 2 ciclos delayPDelL3 clrwdt ; 1 ciclo delay return ; 2+2 Fin.;------------------------------------------------------------- END ; fin de programa

El codigo anterior ocupaba 65 espacios de memoria de 1024 dispònibles, optimizando el codigo anterior ahora ocupa solo 33 usando las funciones RLF y RRF.

Page 9: Practicas en Mplab

CódigoGeSHi (asm):; 05-06-06; Ejemplo 05; Luces del Auto fantastico - optimizado; PIC 16f84a; MPLAB 7.30; PROTEUS 6.9 SP3; Veguepic LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT PDel0 equ 0CPDel1 equ 0D ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaSBCF STATUS,5 ; volvemos a la pagina 0 CLRF PORTB ; ponemos a cero el puerto b INICIO ; etiquetaBSF PORTB,0 ; prende RB0BCF STATUS,0 ; limpia el carry de STATUS,C

REPETIR IZQCALL DEMORA ; demora de 100msRLF PORTB,1 ; rota el contenido de portb a la derechaBTFSS PORTB,7 ; hasta que prenda RB7, luego se saltaGOTO IZQ ; una linea DERCALL DEMORA ; demora de 100 msRRF PORTB,1 ; rota el contenido de portb a la izquierda

Page 10: Practicas en Mplab

BTFSS PORTB,0 ; hasta que prenda RB0, luego saltaGOTO DER ; una linea GOTO REPETIR ; repite el ciclo GOTO INICIO ; va a inicio ;-------------------------------------------------------------; La demora a sido generada con el programa PDEL; Descripcion: Delay 100000 ciclos - 100 ms;-------------------------------------------------------------DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)       movwf     PDel0     ; 1 |PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)       movwf     PDel1     ; 1 |PLoop2  clrwdt              ; 1 clear watchdog       clrwdt              ; 1 ciclo delay       decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)       goto      PLoop2    ; 2 no, loop       decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)       goto      PLoop1    ; 2 no, loopPDelL1  goto PDelL2         ; 2 ciclos delayPDelL2  goto PDelL3         ; 2 ciclos delayPDelL3  clrwdt              ; 1 ciclo delay       return              ; 2+2 Fin.;------------------------------------------------------------- END ; fin de programa

Juego de luces, las luces se cruzan de lado a lado.

CódigoGeSHi (asm):; 06-06-06; Ejemplo 06; Juego de luces; PIC 16f84a; MPLAB 7.30

Page 11: Practicas en Mplab

; PROTEUS 6.9 SP3; Veguepic LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT PDel0 equ 0CPDel1 equ 0D ; el efecto que se busca es de dos luces que parten de los extremos expuestos y se muevan; de lado a lado. SEC1 equ B'10000001'SEC2 equ B'01000010'SEC3 equ B'00100100'SEC4 equ B'00011000' ; se podri haber seguido con; SEC5 equ B'00100100' pero es igual a SEC3 y asi para los demas; por lo que se invierte la secuencia SEC3, SEC2, SEC1    ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaSBCF STATUS,5 ; volvemos a la pagina 0 CLRF PORTB ; ponemos a cero el puerto b INICIO ; etiqueta

REPETIR MOVLW SEC1 ; carga el valor de SEC1 en WMOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms MOVLW SEC2 ; carga el valor de SEC2 en W

Page 12: Practicas en Mplab

MOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms MOVLW SEC3 ; carga el valor de SEC3 en WMOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms MOVLW SEC4 ; carga el valor de SEC4 en WMOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms MOVLW SEC3 ; carga el valor de SEC3 en WMOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms MOVLW SEC2 ; carga el valor de SEC2 en WMOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms MOVLW SEC1 ; carga el valor de SEC1 en WMOVWF PORTB ; carga w en el puerto bCALL DEMORA ; demora de 100ms GOTO INICIO ; va a inicio  ;-------------------------------------------------------------; La demora a sido generada con el programa PDEL; Descripcion: Delay 100000 ciclos - 100 ms;-------------------------------------------------------------DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)       movwf     PDel0     ; 1 |PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)       movwf     PDel1     ; 1 |PLoop2  clrwdt              ; 1 clear watchdog       clrwdt              ; 1 ciclo delay       decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)       goto      PLoop2    ; 2 no, loop       decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)       goto      PLoop1    ; 2 no, loopPDelL1  goto PDelL2         ; 2 ciclos delayPDelL2  goto PDelL3         ; 2 ciclos delayPDelL3  clrwdt              ; 1 ciclo delay       return              ; 2+2 Fin.;------------------------------------------------------------- END ; fin de programa

Page 13: Practicas en Mplab

Juego de luces, son dos luces que se mueven en 4 posiciones de lado a lado. Movemos una luz de lado a lado entre los cuatro bits bajos y con la funcion SWAPF copiamos para los bits altos.

CódigoGeSHi (asm):; 11-06-06; Ejemplo 07; Juego de luces; PIC 16f84a; MPLAB 7.30; PROTEUS 6.9 SP3; Veguepic; el efecto que se busca es de dos luces que se mueven en 4 posiciones de lado a lado. LIST P=16F84A, ; usar PIC 16F84A#include <p16f84A.inc> __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off; power up timer on; watchdog off; osc XT PDel0 equ 0CPDel1 equ 0D SEC1 equ 0ESEC2 equ 0f ORG 0BSF STATUS,5 ; activa la pagina 1MOVLW B'00000' ; carga 00000 en WMOVWF TRISA ; puerto a todos salidasMOVLW B'00000000' ; carga 00000000 en WMOVWF TRISB ; puerto b todos salidaS

Page 14: Practicas en Mplab

BCF STATUS,5 ; volvemos a la pagina 0 CLRF PORTA ; ponemos a cero el puerto aCLRF PORTB ; ponemos a cero el puerto bBCF STATUS,0 ; limpia el carry de STATUS,C MOVLW B'00000001' ; carga 00000001 en wMOVWF SEC1 ; guarda el valor en SEC1 INICIO ; etiqueta DERECHA ; rutina para mover a derechaCALL CAMBIAR ; llama a CAMBIARRLF SEC1,1 ; mueve el contenido a la izquierda y lo guarda en SEC1BTFSS SEC1,3 ; si el bit 7 es igual a 1 salta una instruccionGOTO DERECHA ; repite la rutina derecha IZQUIERDA ; rutina para mover a izquierdaCALL CAMBIAR ; llama a CAMBIARRRF SEC1,1 ; mueve el contenido a la izquierda y lo guarda en SEC1BTFSS SEC1,0 ; si el bit 0 es igual a 1 salta una instruccionGOTO IZQUIERDA ; repite la rutina izquierda GOTO INICIO ; va a inicio CAMBIAR ; rutina para repetir los 4 bits bajos en los 4 bits altos SWAPF SEC1,0 ; intercambia los 4 bits bajos por los 4 bits altosMOVWF SEC2 ; guarda el valor en SEC2MOVF SEC1,0 ; carga SEC1 en wADDWF SEC2,1 ; suma w y SEC2 y lo guarda en SEC2MOVF SEC2,0 ; carga SE21 en wMOVWF PORTB ; mueve el valor de w en el puerto bCALL DEMORA ; demora de 200ms RETURN ;-------------------------------------------------------------; La demora a sido generada con el programa PDEL; Descripcion: Delay 200000 ciclos - 200 ms;------------------------------------------------------------- DEMORA movlw .156 ; 1 set numero de repeticion (B)

Page 15: Practicas en Mplab

movwf PDel0 ; 1 |PLoop1 movlw .213 ; 1 set numero de repeticion (A) movwf PDel1 ; 1 |PLoop2 clrwdt ; 1 clear watchdogPDelL1 goto PDelL2 ; 2 ciclos delayPDelL2decfsz PDel1,1 ; 1 + (1) es el tiempo 0 ? (A)goto PLoop2 ; 2 no, loopdecfsz PDel0,1 ; 1 + (1) es el tiempo 0 ? (B)goto PLoop1 ; 2 no, loopPDelL3 goto PDelL4 ; 2 ciclos delayPDelL4 clrwdt ; 1 ciclo delayreturn ; 2+2 Fin.;------------------------------------------------------------- END ; fin de programa

Pues me di un paseo por este todo el post y no vi un ejemlo de manejo de la LCD con el PIC16F84A asi que esta es mi contribucion al tema. Se trata de un contador de 0-9. Es algo muy basico y es que la verdad la idea es mas bien enfocarse en el proceso de inicializacion y manejo y envio de comandos y datos. Esta hecho para manejarse con un BUS de 8 lineas.

Código:

;**************************************************************;* *;* Ensamblador para microcontroladores MPASM *;* *;* NOMBRE : pic8lcd.asm *;* OBJETIVO: Contador 0-9 con salida a LCD configurada a un *;* bus de 8 lineas, controladas por el puerto B del *;* PIC16F84A. Las lineas EN y RS estan sobre el *;* puerto A en los bits 0 y 1 respectivamente. *;* *

Page 16: Practicas en Mplab

;* AUTOR : antonio gauss *;* EMAIL : [email protected] *;* *;**************************************************************

title "PIC16F84A, pic8lcd.asm" list p=16f84a, f=inhx8m #include <p16f84a.inc> __config _XT_OSC & _WDT_OFF & _CP_OFF & _PWRTE_ON

STATUS equ 0x03PORTA equ 0x05PORTB equ 0x06

PDel0 equ 0x10PDel1 equ 0x11COUNT equ 0x12

org 0x00 goto inicio

org 0x04 goto rsi

org 0x05

inicio: bsf STATUS,RP0 movlw 0xFC movwf PORTA movlw 0x00 movwf PORTB bcf STATUS,RP0

clrf PORTA clrf PORTB

call init

main: clrf COUNT

Page 17: Practicas en Mplab

movlw 0x01 movwf PORTB call en_com

mLoop: movf COUNT,0 addlw 0x30 movwf PORTB call en_dat

movlw .250 call delay

incf COUNT,1 movlw 0x0A xorwf COUNT,0 btfss STATUS,2 goto mLoop

goto main

init: movlw .20 call delay

movlw 0x38 movwf PORTB call en_com

movlw 0x0C movwf PORTB call en_com

movlw 0x06 movwf PORTB call en_com

return

en_com: bcf PORTA,1

Page 18: Practicas en Mplab

bsf PORTA,0 nop bcf PORTA,0

movlw .2 call delay

return

en_dat: bsf PORTA,1

bsf PORTA,0 nop bcf PORTA,0

call T050us

return

T050us: movlw .15 movwf PDel0

DLoop3: decfsz PDel0,1 goto DLoop3

return

T200us: movlw .65 movwf PDel0

DLoop2: decfsz PDel0,1 goto DLoop2

return

delay: movwf PDel1 nop

Page 19: Practicas en Mplab

DLoop0: movlw .249 movwf PDel0

DLoop1: nop decfsz PDel0,1 goto DLoop1

decfsz PDel1,1 goto DLoop0

return

rsi: retfie

end

Les traigo un ejemplito de un PWM usando interrupciones (INT0) para incrementar/decrementar el ancho del pulso.

Código:

;**************************************************************;* *;* Ensamblador para microcontroladores MPASM *;* *;* NOMBRE : PICpwm.asm *;* OBJETIVO: Modulador de ancho de pulso PWM utilizando la *;* interrupcion externa del PIC16F84A. El modulador *;* cuenta con un par de entradas que se encargan de *;* el incremento y decremento del pulso. *;* *;* AUTOR : antonio gauss *;* EMAIL : [email protected] *

Page 20: Practicas en Mplab

;* *;**************************************************************

title "PIC16F84A, PICpwm.asm" list p=16f84a, f=inhx8m #include <p16f84a.inc> __config _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF

TMR0 equ 0x01STATUS equ 0x03PORTB equ 0x06INTCON equ 0x0B

STEMP equ 0x10WTEMP equ 0x11ACCA equ 0x12ACCC equ 0x13PDelT equ 0x14

org 0x00 goto inicio

org 0x04 goto rsi

org 0x05

inicio: bsf STATUS,RP0 movlw 0xF7 movwf PORTB bcf TMR0,6 bcf STATUS,RP0

movlw 0x90 movwf INTCON

movlw 0x7F movwf ACCA

Page 21: Practicas en Mplab

main: movf ACCA,0 movwf ACCC

bsf PORTB,3 call delay

movf ACCA,0 sublw 0xFF movwf ACCC

bcf PORTB,3 call delay

goto main

delay: movf ACCC,0 movwf PDelT

DLoop: nop

decfsz PDelT,1 goto DLoop

return

IncDut: incf ACCA,1 movlw 0xFF xorwf ACCA,0 btfss STATUS,Z return

movlw 0xFE movwf ACCA

return

DecDut: decf ACCA,1

Page 22: Practicas en Mplab

btfss STATUS,Z return

movlw 0x01 movwf ACCA

return

rsi: btfss INTCON,1 retfie

movwf WTEMP swapf STATUS,0 movwf STEMP

start: btfss PORTB,1 call IncDut

btfss PORTB,2fin: call DecDut

swapf STEMP,0 movwf STATUS swapf WTEMP,1 swapf WTEMP,0

bsf INTCON,4 bcf INTCON,1

retfie

end

Page 23: Practicas en Mplab

El módulo LCD visualiza un mensaje largo (más de 16 caracteres) que se desplaza a lo largo; de la pantalla. Se utiliza la subrutina LCD_MensajeMovimiento de la librería LCD_MENS.INC.;; ZONA DE DATOS ************************************************** ********************

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST P=16F84AINCLUDE <P16F84A.INC>

CBLOCK 0x0CR_ContAAR_ContABSTORWSTRSTENDC

; ZONA DE CÓDIGOS ************************************************** ******************

ORG 0goto InicioORG 4goto INT_EXT

Inicio

call LCD_Inicializa ; Prepara la pantalla.bsf STATUS,RP0BSF PORTB,0BCF OPTION_REG,NOT_RBPUBCF OPTION_REG,INTEDGbcf STATUS,RP0clrf R_ContABPrincipal

Page 24: Practicas en Mplab

movlw Mensaje0 ; Apunta al mensaje.call LCD_MensajeMovimientogoto Principal ; Repite la visualización.; "Mensajes" ----------------------------------------------------------------------------;Mensajesaddwf PCL,FMensaje0 ; Posición inicial del mensaje.DT " " ; Espacios en blanco al principio para mejorDT "Proyecto Final" ; visualización.DT " Diseño Logico",DT " ", 0x0 ; Espacios en blanco al final.;INCLUDE <LCD_MENS.INC> ; Subrutina LCD_MensajeMovimiento.INCLUDE <LCD_4BIT.INC> ; Subrutinas de control del LCD.INCLUDE <RETARDOS.INC> ; Subrutinas de retardos.

;================================================= ==================

; Rutina de interrupcion

; Se procede a dar servicio a la interrupcion.

; Esta corresponde a una interrupcion periferica. No se usa.

;================================================= ==================INT_EXT

MOVWF STORW ; Respaldar el acumulador, W, en la localidad de memoria STORW.MOVF STATUS, W ; El contenido de STATUS register se almacena en el acumulador.MOVWF STRST ; Respaldar el STATUS register en la localidad de memoria STRST.; Se incluye el banco en uso antes de la interrupcion.incf R_ContAB, F ; paso 1 1 ciclo

banco0 ; Direcciona el Banco 0.MOVF STRST, W ; Se almacena en el acumulador el registro STRST.MOVWF STATUS ; Se restaura el STATUS register.SWAPF STORW, F ; Se almacena en el acumulador el registro STRST.SWAPF STORW, W ; Se almacena en el acumulador el registro STRST.

Page 25: Practicas en Mplab

RETFIE ; Terminal la rutina de interrupcion, regresa al programa principal.

END ; Fin del programa.------------------------------------------------------------------------------------------

; ================================================== =================;; Librería de subrutinas para el manejo de mensajes a visualizar en un visualizador LCD.

CBLOCKLCD_ApuntaCaracter ; Indica la posición del carácter a visualizar; respecto del comienzo de todos los mensajes,; (posición de la etiqueta "Mensajes").LCD_ValorCaracter ; Código ASCII del carácter aENDC ; visualizar.

; Los mensajes tienen que estar situados dentro de las 256 primeras posiciones de la; memoria de programa, es decir, no pueden superar la dirección 0FFh.

; Subrutina "LCD_Mensaje" ---------------------------------------------------------------;; Visualiza por pantalla el mensaje apuntado por el registro W.;; Los mensajes deben localizarse dentro de una zona encabezada por la etiqueta "Mensajes" y que; tenga la siguiente estructura:;; Mensajes ; ¡Etiqueta obligatoria!; addwf PCL,F; Mensaje0 ; Posición inicial del mensaje.; DT ".. ..", 0x00 ; Mensaje terminado en 0x00.; Mensaje1; ...; ...; FinMensajes;; La llamada a esta subrutina se realizará siguiendo este ejemplo:;; movlw Mensaje0 ; Carga la posición del mensaje.; call LCD_Mensaje ; Visualiza el mensaje.;LCD_Mensajemovwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.

Page 26: Practicas en Mplab

movlw Mensajes ; Halla la posición relativa del primer caráctersubwf LCD_ApuntaCaracter,F ; del mensaje respecto de etiqueta "Mensajes".decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".LCD_VisualizaOtroCaractermovf LCD_ApuntaCaracter,Wcall Mensajes ; Obtiene el código ASCII del carácter apuntado.movwf LCD_ValorCaracter ; Guarda el valor de carácter.movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En casobtfsc STATUS,Z ; que sea "0x00", que es código indicador finalgoto LCD_FinMensaje ; de mensaje, sale fuera.LCD_NoUltimoCaractercall LCD_Caracter ; Visualiza el carácter ASCII leído.incf LCD_ApuntaCaracter,F ; Apunta a la posición del siguiente caráctergoto LCD_VisualizaOtroCaracter ; dentro del mensaje.LCD_FinMensajereturn ; Vuelve al programa principal.

; Subrutina "LCD_MensajeMovimiento" -----------------------------------------------------;; Visualiza*un mensaje de mayor longitud que los 16 caracteres que pueden representarse; en una línea, por tanto se desplaza a través de la pantalla.;; En el mensaje debe dejarse 16 espacios en blanco, al principio y al final para; conseguir que el desplazamiento del mensaje sea lo más legible posible.;CBLOCKLCD_CursorPosicion ; Contabiliza la posición del cursor dentro de laENDC ; pantalla LCDLCD_MensajeMovimientomovwf LCD_ApuntaCaracter ; Posición del primer carácter del mensaje.movlw Mensajes ; Halla la posición relativa del primer caráctersubwf LCD_ApuntaCaracter,F ; del mensaje respecto de la etiqueta "Mensajes".decf LCD_ApuntaCaracter,F ; Compensa la posición que ocupa "addwf PCL,F".LCD_PrimeraPosicionclrf LCD_CursorPosicion ; El cursor en la posición 0 de la línea.call LCD_Borra ; Se sitúa en la primera posición de la línea 1 yLCD_VisualizaCaracter ; borra la pantalla.movlw LCD_CaracteresPorLinea ; ¿Ha llegado a final de línea?subwf LCD_CursorPosicion,Wbtfss STATUS,Zgoto LCD_NoEsFinalLineaLCD_EsFinalLinea

Page 27: Practicas en Mplab

call Retardo_200ms ; Lo mantiene visualizado durante este tiempo.call Retardo_200mscall retardo_externomovlw LCD_CaracteresPorLinea-1; Apunta a la posición del segundo carácter visualizadosubwf LCD_ApuntaCaracter,F ; en pantalla, que será el primero en la siguientegoto LCD_PrimeraPosicion ; visualización de línea, para producir el efectoLCD_NoEsFinalLinea ; de desplazamiento hacia la izquierda.movf LCD_ApuntaCaracter,Wcall Mensajes ; Obtiene el ASCII del carácter apuntado.movwf LCD_ValorCaracter ; Guarda el valor de carácter.movf LCD_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En casobtfsc STATUS,Z ; que sea "0x00", que es código indicador finalgoto LCD_FinMovimiento ; de mensaje, sale fuera.LCD_NoUltimoCaracter2call LCD_Caracter ; Visualiza el carácter ASCII leído.incf LCD_CursorPosicion,F ; Contabiliza el incremento de posición del; cursor en la pantalla.incf LCD_ApuntaCaracter,F ; Apunta a la siguiente posición por visualizar.goto LCD_VisualizaCaracter ; Vuelve a visualizar el siguiente carácterLCD_FinMovimiento ; de la línea.return ; Vuelve al programa principal.

retardo_externoMOVf R_ContAB,WMOVWF R_ContAA ; +2 1 cicloloopnopDECFSZ R_ContAA, F ; paso 1 1 cicloGOTO loop ; paso 2 2 ciclosreturn

Page 28: Practicas en Mplab

Multimetro digital con pic

Implementación de un Instrumento Digital.

Resumen: La importancia de los instrumentos eléctricos de medición es incalculable, ya que mediante el uso de ellos se miden e indican magnitudes eléctricas, como corriente, carga, potencial y energía, o las características eléctricas de los circuitos, como la resistencia, la capacidad, la capacitancia y la inductancia. Además que permiten localizar las causas de una operación defectuosa en aparatos eléctricos en los cuales, como es bien sabidos, no es posible apreciar su funcionamiento en una forma visual, como en el caso de un aparato mecánico. Las mediciones eléctricas se realizan con aparatos especialmente diseñados según la naturaleza de la corriente; es decir, si es alterna, continua o pulsante. Los instrumentos se clasifican por los parámetros de voltaje, tensión e intensidad.

Page 29: Practicas en Mplab

1.- Introducción: Es clara la importancia que tienen los equipos multifuncionales para los laboratorios, por  lo que es evidente la necesidad de sus usuarios de sacarles el máximo provecho para fortalecer su competencia ofreciendo calibración de calidad y alta confiabilidad.

El personal de ingeniería continuamente enfrenta una variedad de exigencias cada vez más complejas, es por esto que se han desarrollado técnicas efectivas para la medición de datos de forma rápida y confiable, que ponen todo en manos de la instrumentación.Para esta práctica se usará el PIC16F877. El resultado se mostrará en un LCD de 16x2. Para el caso del PIC, es necesario asignar ciertos valores a un par de registros.

2.- Planteamiento:Ante el avance de las tecnologías en la educación se planea incorporar el uso del PC en prácticas de laboratorio en asignaturas como mediciones y redes eléctricas, para lo cual, se requiere entre otras cosas, construir un instrumento digital que permita la medición de: Voltaje, Corriente, Frecuencia, Período, Ciclo útil Rango, Capacitancia.

La selección de la medición a realizar se hará a través de “menús” utilizando una pantalla LCD de caracteres y pulsadores, simulando un teclado de entrada.

Page 30: Practicas en Mplab

La visualización de la variable medida también se hará utilizando la pantalla LCD.

Es necesario que todos los valores se presenten en la pantalla con al menos un digito decimal en notación punto flotante. El equipo una vez programado, deberá trabajar independiente del PC, adicionalmente.

3.- Los convertidores A/D: Es un dispositivo electrónico capaz de convertir una entrada analógica de voltaje en un valor binario, la señal analógica, que varía de forma continua en el tiempo, se conecta a la entrada del dispositivo y se somete a un muestreo a una velocidad fija, obteniéndose así una señal digital a la salida del mismo.

Para realizar sus funciones en convertidor ADC tiene que efectuar los siguientes procesos:

1. Muestreo de la señal analógica.2. Cuantización de la propia señal.3. Codificación del resultado de cuantización.

El muestreo se realiza tomando diferentes muestras de tensiones o voltajes en diferentes puntos de la onda. La cuantización es el siguiente paso, para esta parte del proceso los valores continuos de la onda se convierten en series de valores numéricos decimales discretos correspondientes a niveles de voltaje que contiene la señal analógica. Y por ultimo la codificación, los valores de las tomas de voltaje se

Page 31: Practicas en Mplab

representan numéricamente por medio de códigos y estándares previamente establecidos.

4.- Software Utilizado: Hemos programado el PIC 16F876 usando el PROTON IDE, que es el componente central del sistema ya que permite trabajar cómodamente en BASIC, facilitando mucho el proceso de programación.

Es un paquete de software para el diseño de circuitos electrónicos que incluye captura (composición) de los esquemas, simulación analógica y digitales combinadas y diseño de circuitos impresos. Está disponible en dos versiones con funcionalidad limitada: "Proteus VSM" y "Proteus PCB Design"

El paquete está compuesto por dos programas: ISIS, para la captura y simulación de circuitos; y ARES, para el diseño de PCB's. En los ordenadores que tienen activada la funcionalidad VSM sólo se puede ejecutar el programa ISIS. En ellos se realizo el diseño del multímetro digital. También permite simular y depurar el funcionamiento de todo el sistema ejecutando el software paso a paso, insertando puntos de ruptura, viendo el contenido de registros y posiciones de memoria, etc y comprobando si la respuesta del hardware es la correcta.

5.- Hardware Utilizado: Como el objetivo especifica el hardware esta basado en el PIC 16F877. Sobre este

Page 32: Practicas en Mplab

microcontrolador se carga el software, En él se resume toda la lógica del mismo.Sus funciones principales son:- Realizar la comunicación con el tablero.- Realizar la comunicación con la pantalla.- Controlar la información que se despliega en el mismo.

En la figura adjunta se muestra el diagrama de pines del microcontrolador. Los pines que simulan las entradas y salidas son 12 pines. Las entradas están configuradas entre los pines 2 y 7, y las salidas entre los pines 11 y 16.

6.- La Familia del PIC16F877El microcontrolador PIC16F877 de Microchip pertenece a una gran familia de microcontroladores de 8 bits (bus de datos) que tienen las siguientes características generales que los distinguen de otras familias:- Arquitectura Harvard- Tecnología RISC- Tecnología CMOSEstas características se conjugan para lograr un dispositivo altamente eficiente en el uso de la memoria de datos y programa y por lo tanto en la velocidad de ejecución.Microchip ha dividido sus microcontroladores en tres grandes subfamilias de acuerdo al número de bits de su bus de instrucciones:

Page 33: Practicas en Mplab

7.- Características generales del PIC16F877La siguiente es una lista de las características del PIC16F877:CPU:- Tecnología RISC- Sólo 35 instrucciones que aprender- Todas las instrucciones se ejecutan en un ciclo de reloj, excepto los saltos que requieren dos- Frecuencia de operación de 0 a 20 MHz (200 nseg de ciclo de instrucción)- Opciones de selección del osciladorMemoria:- Hasta 8k x 14 bits de memoria Flash de programa- Hasta 368 bytes de memoria de datos (RAM)- Hasta 256 bytes de memoria de datos EEPROMLectura/escritura de la CPU a la memoria flash de programa- Protección programable de código- Stack de hardware de 8 nivelesReset e interrupciones:- Hasta 14 fuentes de interrupción- Reset de encendido (POR)- Timer de encendido (PWRT)- Timer de arranque del oscilador (OST)- Sistema de vigilancia Watchdog timer.Otros:- Modo SLEEP de bajo consumo de energía- Programación y depuración serie “In-Circuit” (ICSP) a través de dos patitas- Rango de voltaje de operación de 2.0 a 5.5 volts- Alta disipación de corriente de la fuente: 25mA

Page 34: Practicas en Mplab

- Rangos de temperatura: Comercial, Industrial y Extendido- Bajo consumo de potencia:o Menos de 0.6mA a 3V, 4 Mhzo 20 μA a 3V, 32 Khzo menos de 1μA corriente de standby (modo SLEEP).

8.- La Memoria de ProgramaLos PIC de rango medio poseen un registro Contador del Programa (PC) de 13 bits, capaz de direccionar un espacio de 8K x 14, como todas las instrucciones son de 14 bits, esto significa un bloque de 8k instrucciones. El bloque total de 8K x 14 de memoria de programa está subdividido en 4 páginas de 2K x 14.

9.- Características Principales del Sistema de desarrollo pic16f877         Permite Leer y escribir directamente en los PUERTOS o la RAM sin necesidad de enviar ningún programa adicional.

         Permite enviar programas al sistema, probarlos, detenerlos, e incluso monitorizar los puertos y la RAM mientras está en funcionamiento.

         Dispone de lectura automática de datos con una frecuencia configurable por el usuario.

10.- Panel de control: En este panel de control, se trata de un menú donde, se pueden diferenciar cuatro mediciones, que son voltaje, frecuencia, ciclo útil y capacitancia, que cuya formación iremos describiendo a continuación.

Page 35: Practicas en Mplab

El voltímetro: Instrumento digital diseñado para medir y presentar en forma digital una variable tensión de la corriente eléctrica. Este diseño de multímetro se encuentra en un rango de (10 Vdc a +10 Vdc). Salirse de éste rango de operación puede ser motivo de deterioro del mismo.Cuando la tecnología nos permite saber, cual es la tensión, con bastante precisión, no se debe seguir con dispositivos que solo indican que ‘‘hay’’ tensión pero no exactamente El voltímetro es tal vez el instrumento que más aplicaciones tiene. Fuera de la función específica de medir un voltaje, existen muchos parámetros que se miden indirectamente con voltímetros.Para la creación del mismo se necesitara un conversor ADC, que facilita su interconexión con un microprocesador,

Frecuencia: Como sabemos la frecuencia es la tasa de recurrencia de un evento cíclico o periódico. En una forma de onda análoga o digital, podemos invertir el periodo de la señal para obtener la frecuencia. A menor sea el periodo, mayor será la frecuencia y viceversa. Para obtener la frecuencia de una señal digital, es muy sencillo, el periodo es directamente el tiempo entre flancos de subida, o entre flancos de bajada.

Capacitancia: La capacitancia siempre es una cantidad positiva y puesto que la diferencia de potencial aumenta a medida que la carga almacenada se

Page 36: Practicas en Mplab

incrementa. En consecuencia la capacitancia de un dispositivo es una medida de su capacidad para almacenar carga y energía potencial eléctrica.

En la actualidad, en los equipos de medición de capacitancia solamente requiere de conectar el dispositivo bajo medición entre sus terminales y apretar un botón para que la lectura aparezca en un indicador, aunque también existen equipos de tipo analógico que requieren además manipular algunas perillas y visualizar una pequeña aguja dentro de una escala graduada para llevar a balance un circuito puente y realizar la lectura en base a multiplicadores y escalas limitadas en resolución.

Page 38: Practicas en Mplab

Device 16F877

XTAL 20Input PORTD

ALL_DIGITAL=true

Declare ADIN_RES 10Declare ADIN_TAD FRCDeclare ADIN_STIME 50

Input PORTD

TRISA=000011 ADCON1=%11000000

CCP2_PIN = PORTC.1

'Declaracion pines pantalla LCDDeclare LCD_DTPIN PORTB.4    ' Pin de Datos  LCD conectado al PORTB.4Declare LCD_ENPIN PORTB.3    ' Pin de Enable LCD conectado al PORTB.3Declare LCD_RSPIN PORTB.1    ' Pin de RS     LCD conectado al PORTB.1

TRISB.2 = %0                  ' Declara a PORTB.2 como Salida DigitalPORTB.2 = %0 

Output PORTC.2

Page 39: Practicas en Mplab

Output PORTC.3Output PORTC.1

'Programacion para la LCD

Print $FE,$40,$1F,$10,$10,$10,$10,$10,$10,$10    'esquina izquierdaPrint $FE,$50,$1F,$01,$01,$01,$01,$01,$01,$01   'esquina derechaPrint $FE,$48,$10,$10,$10,$10,$10,$10,$1F,$00    'esquina izquierda abajoPrint $FE,$58,$01,$01,$01,$01,$01,$01,$1F,$00    'esquina derecha abajoPrint $FE,$60,$00,$04,$06,$07,$06,$04,$00,$00  'flecha fila 1Print $FE,$68,$00,$00,$00,$1F,$0E,$04,$00,$00   'flecha hacia abajoPrint $FE,$70,$00,$00,$04,$0E,$0E,$1F,$00,$00    'flecha hacia arriba

'declaraciones

Dim voltage As FloatDim voltage1 As FloatDim resultado As FloatDim resultado1 As FloatDim resultado2 As Float

Page 40: Practicas en Mplab

Dim resis As FloatDim resistencia As FloatDim capacitancia As FloatDim frecuencia As FloatDim periodo As FloatDim ciclo As FloatDim x As FloatDim y As FloatDim f As FloatDim cicloutil As Float

inicio:

Print At 1,16,2 Print At 2,16,3Print At 2,1,1Print At 1,1,0Print At 1,1, "Alumno Fulano"Print At 2,1, "Alumno Fulano"DelayMS 2500ClsPrint At 1,16,2 Print At 2,16,3Print At 2,1,1Print At 1,1,0Print At 1,7, "Micro"Print At 2,3, "Procesadores"DelayMS 2500ClsPrint At 1,16,2 Print At 2,16,3

Page 41: Practicas en Mplab

Print At 2,1,1Print At 1,1,0Print At 1,4, "MULTIMETRO"Print At 2,6, "DIGITAL"DelayMS 2500Clsuno:Print  $FE, 1Print At 1,1, "1"Print At 1,2,4Print At 1,3, " VOLTIMETRO   "Print At 2,1, "2"Print At 2,2,4Print At 2,3, " FRECUENCIA     "Print At 2,16,5

uno1:pause 500If PORTD.1=%1 ThenGoTo dosEndIfIf PORTD.2=%1 Thenuno11:voltage=ADIn 0resultado1=(voltage*10)/1023voltage1=ADIn 1resultado2=(voltage1*10)/1023resultado=resultado1 - resultado2Print  $FE, 1Print At 1,5,  SDEC2 resultado," VDC    "

Page 42: Practicas en Mplab

Print At 2,1, "  Escala 10VDC  "pause 1000If PORTD.4=%1 ThenGoTo controlEndIfGoTo uno11EndIf

'frecuencia

If PORTD.3=%1 Thenuno111:f = Counter PORTD.5 ,1000DelayMS 1200frecuencia=f/1000Print  $FE, 1Print At 1,1, "Esc: 1-30 Khz"Print At 2,1,"F = ", DEC3 frecuencia," Khz"DelayMS 500If PORTD.4=%1 ThenGoTo controlEndIfGoTo uno111EndIfGoTo uno1

dos:pause 500Print  $FE, 1Print At 1,1, "1"

Page 43: Practicas en Mplab

Print At 1,2,4Print At 1,4, "CICLO UTIL"Print At 2,1, "2"Print At 2,2,4Print At 2,4, "CAPACITANCIA"Print At 1,16,6dos1:If PORTD.0=%1 ThenGoTo unoEndIf

'Ciclo util

If PORTD.2=%1 Thendos11:HPWM 2,x,yf=Counter PORTD.5,1000frecuencia=1/fperiodo=1/frecuenciaDelayMS 300ciclo= PulsIn PORTD.5,1cicloutil=ciclo/periodocicloutil=20000*cicloutilPrint  $FE, 1Print At 1,1, "Ciclo Util"Print At 2,1, Dec cicloutil,"%"DelayMS 500

If PORTD.4=%1 ThenGoTo controlEndIfGoTo dos11

Page 44: Practicas en Mplab

EndIf

'capacitancia

If PORTD.3=%1 Thendos111:High PORTC.3DelayMS 300resis= RCIn PORTC.3 , Highcapacitancia=resis/950Print  $FE, 1Print At 1,1, "Esc: 0-100 uF"Print At 2,1,"C = ",DEC2 capacitancia," uF"DelayMS 500If PORTD.4=%1 ThenGoTo controlEndIf

GoTo dos111EndIf GoTo dos1

control:GoTo uno

13.- Conclusión: El multímetro digital es un instrumento electrónico de medición que generalmente calcula voltaje, resistencia y corriente, aunque dependiendo del modelo de multímetro puede medir

Page 45: Practicas en Mplab

otras magnitudes como capacitancia y temperatura. Gracias al multímetro podemos comprobar el correcto funcionamiento de los componentes y circuitos electrónicos.

En general, los instrumentos de medición ofrecen la precisión necesaria para la ejecución de incontables actividades tanto profesionales como cotidianas que requieren atención.