5.3. ESQUEMAS PRÁCTICAS MÓDULO 2
5.3.1. Esquemas Práctica 2
Vpp RA0 RA1 RA2 RA3 RA4 RA5 Vss OSC1 OSC2 RC0 RC1 RC2 RC3 RC4 RC5 TX RX VSS1 VDD RB0 RB1 RB2 RB3 RB4 RB5 PGC PGD 16F876 10nF 22pF 4.7kohm 5V RIBBON_10H RIBBON_16H 5V 4x10K
5.3.2. Esquemas Práctica 5 y módulo 2
7 1 2 6 13 10 9 15 11 12 14 3 5 4 A B C D LT RBI BI/RBO OA OB OC OD OE OF OG 74LS47N 7 1 2 6 13 10 9 15 11 12 14 3 5 4 A B C D LT RBI BI/RBO OA OB OC OD OE OF OG 74LS47N SEVEN_SEG_DISPLAY A B C D E F G SEVEN_SEG_DISPLAY A B C D E F G 5V HDR1X4 Vpp RA0 RA1 RA2 RA3 RA4 RA5 Vss OSC1 OSC2 RC0 RC1 RC2 RC3 RC4 RC5 TX RX VSS1 VDD RB0 RB1 RB2 RB3 RB4 RB5 PGC PGD 16F876 10nF LED_red 1.0kohm HAY PRODUCTO 5V 22pF 4.7kohm 5V RIBBON_10H RIBBON_16H 5V 4x10K
Figura 58. Esquema práctica 2
Planos Esquemas Práctica Módulo 2
5.3.3. Diseño placa base
Anexo Programa ASM de práctica 1
A.
Lista de códigos de programa
A.1 Módulo 1
A.1.1. Programa ASM de práctica 1
include "p16f877.inc"
;registros de proposito general
rmoneda equ 0x40 ;valor de la tecla apretada rprecio equ 0x42 ;precio producto
tapreta equ 0x43 ;registro para saber si tecla esta apretda r1 equ 0x50 ;Guardamos la columna elegida
r2 equ 0x51 ;guardamos la fila elegida
mas_fil equ 0x52 ;se guarda la mascara de la fila modetect equ 0x54 ;moneda a enviar
rmonaux equ 0x58 ;reg para calcular las decenas en precio pagado equ 0x59 ;reg de la cantidad pagada
digito equ 0x5b ;reg aux para el digito a pasar al LCD a traves de ;letra
ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD
letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda pausa equ 0x63 ;reg auxiliar para hacer pausa cambio equ 0x34 ;el cambio a dar
pausa2 equ 0x38 ;otro reg para pausa aux equ 0x39 ;reg auxiliar
aux2 equ 0x3a ;reg auxiliar2 ;Rutina principal
org 0x00 Inicio
call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle
nop
call ver_moneda
btfsc tapreta,1 ;mira si hay una tecla apretada y si no es asi mira call detectmoneda ;la ocion del teclado si no va a volver a mirar el goto buckle ;LCD
;rutina para iniciar el LCD iniciar_LCD
banksel TRISA movlw 0xF0
movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07
Anexo Programa ASM de práctica 1
movlw 0x18
movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;ponemos el pre-escaler a 1:16 movwf OPTION_REG
banksel PORTA
clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo
movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra
call escribir_LCD call retardo
movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra
call clear_display call retardo
call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06
movwf letra
call escribir_LCD call retardo call RS1
return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro
conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a
Anexo Programa ASM de práctica 1
movwf 0x2b
movlw 0xa ;tecla a
movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c movwf 0x2f return
;Configuracion del micro conf_mic
banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7
movwf ADCON1 ;salidas digitales movlw 0x87
movwf OPTION_REG ;preescaler a 256 banksel PORTC ; banco 0
clrf r1 clrf r2 clrf pagado
clrf tapreta ;inicializa el valor del reg. de valor de tecla clrf rmoneda ;inicializa el valor del reg. de la tecla apretada clrf rprecio ;inicializamos el valor del reg. de precio
call mens_inicio ;sacamos por pantalla el mens. de inicio return
;vamos dando un '1' a las columnas para ir comprobando si la tecla esta apretada
ver_moneda movlw 0x1 movwf PORTC
clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una
movlw 0x2 movwf PORTC movlw 0x04
movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas
movlw 0x4 movwf PORTC movlw 0x08
movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas
movlw 0x8 movwf PORTC movlw D'12'
movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas
return ;volvemos al principio rev_fila
Anexo Programa ASM de práctica 1
clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x08
movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTA,3 ;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos call ret_tecl_moneda
btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return
movlw 0x10
movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movwf mas_fil ;volvemos a guardar mascara
btfsc PORTA,4 ;comprobamos bit 1 para saber
;si la tecla de la fila esta activada call ret_tecl_moneda
return
;en esta rutina hacemos un pequeño retardo para los rebotes ;buckle para saber que tecla del monedro está apretada. ret_tecl_moneda
movlw 0x0F
movwf ret ;actualizamos el registro para el retardo buck_re2
decfsz ret,f ;se va decrementando ret hasta q volvemos a goto buck_re2 ; comprobar el PORTC
movf PORTA,w
andwf mas_fil,w ;hace una and entre la mascara guardada y W si el ;resultado es diferente de 0 es q la tecla
btfsc STATUS,Z ;esta pulsada para mirarlo si el flag Z del return ; STATUS esta a 0 es q la tecla se pulso si no es
;asi seguimos con el programa ;aqui calculamos la tecla apretada en el monedero most_num2
clrw
addwf r1,w ;sumamos los valores de r1 y r2 para saber la tetcla addwf r2,f ; apretada
rrf r2,f ;rotamos 2 veces el valor de r2 para que nos coincida rrf r2,w ; el valor de r2 con el numero del registro de tecla addlw 0x20 ; guardado
movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w
movwf rmoneda ;guardamos el resultado de la tecla
bsf tapreta,1 ;poenmos a '1' el registro de tapreta para saber ;si hay tecla apretada
;buckle para saber si la tecla deja de ser apretada sol_tec2 movf PORTA,w
andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ;tecla sigue apretada hasta q el flag Z no este goto sol_tec ;acticado no saldra del buckle
return
;--- ;rutina para detectar moneda
Anexo Programa ASM de práctica 1
movf rmoneda,w
btfsc rmoneda,3 ;si la tecla es menor de 8 saltamos
goto mirarsiopcion ;si la tecla es mayor de 8 vamos a ver si movf rmoneda,w ;es la tecla de cancelar
movwf modetect ;pasamos la moneda detectada al registro y call detect_moneda ;vamos a detectarla
return Dev_pagado
movf pagado,w
call dev_dinero ;pasamos la cantidad de dinero pagada al W clrf pagado ;para que la funcion dev_dinero devuelva call mens_inicio ;dicho dinero y ponemos a 0 la cantidad
clrf tapreta ; pagada
return detect_moneda
btfsc modetect,2 ;si la tecla es < de 4 saltamos
goto detec_50_100_200 ;si la tecla es > de 4 es la moneda 50 100 o ;200 cent
btfsc modetect,1 ;si la tecla es < de 2 saltamos
goto detec_10y20 ;si la tecla es > de 2 es la moneda 10 o 20 ;cent
movf modetect,w ;aqui ya sabemos que es la moneda de 5 cent goto fin_detect
detec_10y20
btfsc modetect,0 ;diferenciamos entre la moneda de 10 y 20 cent si goto detect_20 ;es la la tecla 2 es la moneda de 10 y por lo movlw D'2' ;tanto en pagado habrá que incrementar el valor goto fin_detect ;de '2'
detect_20
movlw D'4' ;aqui sabemos que es la moneda de 20 cent y habrá goto fin_detect ;que incrementar en '4' el valor de pagado
detec_50_100_200
btfsc modetect,1 ;diferenciamos entre las monedas de 50 100 y 200 goto detec_200 ; centimos
btfsc modetect,0
goto detec_100
movlw D'10' ;si es la tecla 4 llegará hasta aqui y sabremos goto fin_detect ;que es la moneda de 50 cent por lo tanto
;incrementamos en '10' pagado detec_200
movlw D'40' ;aqui sabemos que es la moneda de 200 cent y goto fin_detect ;habrá que incrementar en '40' el valor de pagado detec_100
movlw D'20' ;aqui sabemos que es la moneda de 100 cent y goto fin_detect ;habrá que incrementar en '20' el valor de pagado fin_detect ;a esta función las anteriores le pasan por el W el
;valor a incrementar el registro pagado
movwf aux ;lo que vamos a añadir se pone en aux por si hemos addwf pagado ;metido más monedas de la cuenta
Anexo Programa ASM de práctica 1
btfsc STATUS,C
goto exceso_de_dinero ;en el caso de haber pasado el tope se irá
call RS0 ;a esta función
movlw 0x2 ;pasamos este valor para hacer un return home en movwf letra ;el LCD
call clear_display
movf pagado,w ;iniciamos registros clrf digito
clrf tapreta
call pasar_a_LCD ;y escribimos lo pagado en la pantalla de LCD call escribir_PG ;despues del valor de lo pagado escribimos PG en
return ; el LCD
exceso_de_dinero
movf aux,w ;en el caso de exceso de dinero devovlemos la moneda subwf pagado,f ;insertada y restamos la ultima moneda al registro call dev_dinero ;pagado
clrf tapreta ;inciamos registro de tecla apretada para esperar la return ; proxima tecla
mirarsiopcion ;Aqui revisamos si es cancelar y devolver lo pagado btfss rmoneda,0
call Dev_pagado ;Aqui se ha cancelado y se devolveria lo pagado fin clrf tapreta ;iniciamos registros
clrf rmoneda return ;--- pasar_a_LCD movwf letraux clrf digito
b_millares ;para saber si hay más de 10 euros metidos movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no
movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito
b_centenas ;calculo las centenas de lo que he metido movlw D'20'
subwf letraux btfss STATUS,C
Anexo Programa ASM de práctica 1
goto centenas movlw 1
addwf digito goto b_centenas
centenas ;envio las centenas
movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD
movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra
call escribir_LCD clrf digito
b_decenas ;y calculo decenas
movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades
movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30
btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;--- dev_dinero ;esta rutina será la que tenga que hacer el de la practica 4
nop ;en esta práctica no hará nada return
;--- mens_inicio
movlw 0x1 ;limpiamos la pantalla movwf letra
call clear_display
movf pagado,w ;pasamos el valor de lo pagado al W para que la call pasar_a_LCD ; función pasar_a_LCD nos saque lo pagado por el call escribir_PG ; LCDescribimos PG después
return escribir_PG
movlw 0x50 ;letra P movwf letra
Anexo Programa ASM de práctica 1 call escribir_LCD movlw 0x47 ;letra G movwf letra call escribir_LCD return
clear_display ;función para las instruciones de 1,53ms de la banksel TRISB ;pantalla de LCD
movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0 call E1 movf letra,w movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return
escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return
E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,4
return
E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,4
return
RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,3
Anexo Programa ASM de práctica 1
return
RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,3
return
limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME
movlw 0x02 movwf letra
call clear_display
movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra
call clear_display return
;--- retardo ;funciones para retardos este sería cortito
movlw 0xFF movwf pausa retm decfsz pausa goto retm return
retardo_largo ;funcón para un retardo un poco más largo que el anterior movlw 0xFF movwf pausa2 ret_l1 movlw 0xFF movwf pausa ret_l2 banksel TRISB banksel PORTB decfsz pausa goto ret_l2 decfsz pausa2 goto ret_l1 return end
Anexo Programa ASM de práctica 3
A.1.2. Programa ASM de práctica 3
include "p16f877.inc" ;registros de proposito general
rmoneda equ 0x40 ;valor de la tecla apretada
tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto
r1 equ 0x50 ;Guardamos la columna elegida r2 equ 0x51 ;guardamos la fila elegida
mas_fil equ 0x52 ;se guarda la mascara de la fila
lim_tec equ 0x55 ;reg. para saber q tiene q detectar 2 teclas en ;producto
num_prod equ 0x56 ;registro del numero del producto
rmonaux equ 0x58 ;reg para calcular las decenas en precio pagado equ 0x59 ;reg de la cantidad pagada
digito equ 0x5b ;reg aux para el digito a pasar al LCD a traves de ;letra
ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD
letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda
pausa equ 0x63 ;reg auxiliar para hacer pausa al dar moneda DATO equ 0x30 ;dato de eprom
DIREC equ 0x31 ;direcion eprom
err_prod equ 0x32 ;si el producto existe o hay cambio
contador equ 0x33 ;contador para escribir '#' si no hay precio prod_elegido equ 0x36 ;para saber si se ha elegido el producto decenas equ 0x37 ;guardamos las decenas de los productos pausa2 equ 0x38 ;otro reg para pausa
aux equ 0x39 ;reg auxiliar aux2 equ 0x3a ;reg auxiliar2
esp_prec equ 0x3b ;para mover el cursor en le precio
producto equ 0x3c ;donde guardamos el numero del producto
;Rutina principal org 0x00 Inicio
call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle
nop ;se mira si se a apretado una tela de producto call ver_moneda
btfss tapreta,0 goto buckle
call pedir_prod ;va al aparatado de elegir producto goto buckle
;rutina para iniciar el LCD iniciar_LCD
Anexo Programa ASM de práctica 3
movlw 0xF0
movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07
movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x18
movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;ponemos el pre-escaler a 1:16 movwf OPTION_REG
banksel PORTA
clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo
movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra
call escribir_LCD call retardo
movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra
call clear_display call retardo
call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06
movwf letra
call escribir_LCD call retardo call RS1
return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro
conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8
Anexo Programa ASM de práctica 3
movwf 0x29
movlw 9 ;tecla 9
movwf 0x2a
movlw 0xe ;tecla d movwf 0x2b
movlw 0xa ;tecla a
movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c movwf 0x2f return
;Configuracion del micro conf_mic
banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7
movwf ADCON1 ;salidas digitales movlw 0x87
movwf OPTION_REG ;preescaler a 256 banksel PORTC ; banco 0
clrf r1 ;iicializamos registros clrf r2 clrf tapreta clrf rprecio clrf num_prod clrf rmoneda clrf decenas clrf prod_elegido bsf lim_tec,0 clrf err_prod
banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco
call mens_inicio
call op_a_producto ;para iniciar registros en modo pedir producto return
;vamos dando un '1' a las columnas para ir comprobando si la tecla esta ;apretada
ver_moneda movlw 0x1 movwf PORTC
clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una
movlw 0x2 movwf PORTC movlw 0x04
movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas
movlw 0x4 movwf PORTC movlw 0x08
Anexo Programa ASM de práctica 3
movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas
movlw 0x8 movwf PORTC movlw D'12'
movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas
return ;volvemos al prinicipio rev_fila
btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return
clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01
movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTB,0 ;miramos si la fila 1 esta a 0 para mirar
;numero si no es asi seguimos call ret_tcl_producto
btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return
movlw 0x01
movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movlw 0x02
movwf mas_fil ;volvemos a guardar mascara btfsc PORTB,1 ;comprobamos bit 1 para saber
;si la tecla de la fila esta activada call ret_tcl_producto
btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return
movlw 0x02 ;guardamos el valor 8 para la fila 3 movwf r2
movlw 0x04 movwf mas_fil btfsc PORTB,2
call ret_tcl_producto
btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return
;en esta rutina hacemos un pequeño retardo para los rebotes ret_tcl_producto
movlw 0x0F
movwf ret ;actualizamos el registro para el retardo
buck_re
decfsz ret,f ;se va decrementando ret hasta q volvemos a goto buck_re ;comprobar el PORTB
movf PORTB,w
andwf mas_fil,w ;hacemos una and entre la mascara guardada y W ;si el resultado es diferente de 0 es q la tecla ;esta pulsada
Anexo Programa ASM de práctica 3
btfsc STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el
;programa ;aqui calculamos la tecla apretada most_num
clrw
addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada
addlw 0x20
movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w
movwf rmoneda ;guardamos el resultado de la tecla
bsf tapreta,0 ;se pone a '1' tapreta para saber que hay tecla ;apretada
;buckle para saber si la tecla deja de ser apretada sol_tec
movf PORTB,w
andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ; tecla sigue apretada hasta q el flag Z no este goto sol_tec ; acticado no saldra del buckle
return
;--- pasar_a_LCD
movwf letraux clrf digito
b_millares ;para saber si hay más de 10 euros metidos movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si