• No se han encontrado resultados

Esquemas Práctica 2

In document Prácticas PIC (página 139-200)

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

In document Prácticas PIC (página 139-200)

Documento similar