informática industrial. 3º ingeniería técnica industrial. especialidad

Anuncio
INFORMÁTICA INDUSTRIAL.
3º INGENIERÍA TÉCNICA INDUSTRIAL. ESPECIALIDAD ELECTRÓNICA
BOLETÍN 1. CURSO 2003/04
1.
Se colocan tres interruptores en las líneas RA0, RA1 y RA2 de la puerta A de un PIC16F84. Y se colocan cuatro
diodos led en las líneas RB0, RB1, RB2 y RB3 del puerto B. Mediante los interruptores se programa un número
binario de 3 bits.
Desarrollar un programa en ensamblador que lea el número binario introducido, le sume 5 y represente en los leds
el valor binario resultante. Un led apagado representa un 0 y encendido un 1.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2.
LIST
RADIX
P=16F84
HEX
;Comando que indica el PIC usado
;Los valores se representaran en hexadecimal
PUERTAA
EQU
0X05
PUERTAB
ESTADO
W
EQU
EQU
EQU
0X06
0X03
0
;La etiqueta "PUERTAA" queda identificada con
;la direccion 0x05, que si corresponde con el
;banco 0 es el valor de PUERTAA y si es del
;banco 1 con el de TRISA.
;Equivalencia de la etiqueta PUERTAB
;Estado corresponde con el valor 0x03.
;Identifica W con el valor 0.
ORG
0
;Comando que indica al Ensamblador la
;direccion de la memoria donde se
;situara la instrucion siguiente
bsf
ESTADO,5
movlw
movwf
movlw
movwf
bcf
0xff
PUERTAA
0x00
PUERTAB
ESTADO,5
movf
PUERTAA,W
Addlw
movwf
5
PUERTAB
Goto
inicio
;Pone a 1 el bit 5 de ESTADO para direccionar
;la pagina 1 de la memoria de datos.
;W <-- FF(Hex)
;W --> TRISA
;W <-- 0
;W --> TRISB (Las lineas de PB salidas)
;Pone a 0 el bit 5 de ESTADO pasando a
;acceder al banco 0.
;W <-- PUERTAA. Se introduce el valor binario
;de los interruptores.
;W <-- W + 2
;W --> PUERTAB. El valor de W sale por las
;lineas de PB a los led.
;Salta a la instruccion precedida por la
;etiqueta de inicio.
Inicio
END
Se dispone de cinco interruptores que actúan como periféricos de entrada y se conectan a las cinco líneas de la
puerta A de un PIC16F84 funcionando a 4MHz con oscilador externo de tipo XT. Como periféricos de salida
actúan cinco diodos led unidos a las líneas RB4-RB0 de la puerta B. Se dispone también de un pulsador manual
para provocar el Reset.
Confeccionar un programa ensamblador que explore el estado de los interruptores e ilumine el led correspondiente
al interruptor que se encuentre cerrado (con camino a tierra).
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PORTB
PORTA
STATUS
RP0
W
Inicio
Loop
LIST
RADIX
EQU
EQU
EQU
EQU
EQU
P=16F84
HEX
0x06
0x05
0x03
0x01
0x00
org
goto
0x00
Inicio
;Vector de Reset
org
0x05
;Salva el vector de interrupción
clrf
bsf
clrf
movlw
movwf
bcf
PORTB
STATUS,RP0
PORTB
b'00011111'
PORTA
STATUS,RP0
movf
movwf
goto
PORTA,W
PORTB
Loop
end
;Borra los latch de salida
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A se configura como entrada
;Selecciona banco 0
;Leer las entradas RA0-RA4
;Reflejar en las salidas
;Bucle sin fin
;Fin del programa fuente
3.
Se desea confeccionar un programa para el PIC16F84 funcionando a 4MHz, que comience poniendo a cero el
contador CONTA. Después irá incrementando de uno en uno el contador hasta llegar al valor 0x5F, momento en el
que se detiene en un bucle infinito no operativo. El valor del contador en binario se visualizará con 8 diodos led
conectados a las líneas de la puerta B. Se pide el organigrama del algoritmo así como el código ensamblador.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
4.
P=16F84
HEX
EQU
EQU
EQU
EQU
EQU
0x00
0x01
0x06
0x03
0x0C
; Comienzo del campo de etiquetas.
ORG
goto
ORG
0
inicio
5
; El programa comienza en la direccion 0 y
; salta a la direccion 5 para sobrepasar
; el vector de interrupcion.
bsf
movlw
movwf
bcf
ESTADO,5
0x00
PUERTAB
ESTADO,5
; Seleciona el banco 1
; Se configura PuertaB como salida
clrf
CONTA
; CONTA = 0
bucle1
incf
movf
movwf
movlw
subwf
btfss
goto
CONTA,F
CONTA,W
PUERTAB
0x5f
CONTA,W
ESTADO,2
bucle1
;
;
;
;
;
;
;
bucle2
goto
end
bucle2
; si Z = 1 se produce un bucle infinito
W
F
PUERTAB
ESTADO
CONTA
inicio
; Seleccion del banco 0
CONTA + 1 --> CONTA
CONTA se carga en W
W se carga en el registro de datos PB
W <-- 0x5f
CONTA - W --> W
Explora Z y si vale 1 se produce "brinco"
Si Z = 0 se vuelve a bucle1
Se tiene un PIC16F84 trabajando con un reloj de 1MHz y tiene un led conectado en la línea RB7. Se pide el
programa ensamblador que haga parpadear al led con un frecuencia de 8,2 ms.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
5.
LIST
RADIX
LIST
RADIX
P=16F84
HEX
EQU
EQU
EQU
EQU
0x06
0x01
0x03
0x01
ORG
bsf
movlw
movwf
movlw
movwf
bcf
clrf
0
ESTADO,5
b’11010110’
OPTION
0x00
PUERTAB
ESTADO,5
PUERTAB
; Inicio del programa en direccion 0
; Banco 1
; Valor a cargar en OPTION
parpa
bsf
call
bcf
call
goto
PUERTAB,7
retardo
PUERTAB,7
retardo
parpa
; Enciende el led RB7 = 1
; Llamada a subrutina de RETARDO
; Apaga el led, RB7 = 0
retardo
explora
clrf
btfss
goto
return
TMR0
TMR0,4
explora
;
;
;
;
;
PUERTAA
OPTION
ESTADO
TMR
; La Puerta B salida
; Banco 0
; Las lineas de salida de PB a 0
TMR0 = 0 y empieza su incremento
TMR0<4> = 1?
No ha llegado TMR0 a 16d
Ha llegado TMR0 al valor 16d y retorna
al programa principal
END
Se tiene un PIC16F84 con un oscilador interno controlado por un cristal de cuarzo de 4 MHz. Las líneas RA0 y
RA1 están conectadas a dos interruptores A y B respectivamente. Las líneas RB0 y RB1 están conectadas a dos
leds A’ y B’. Existe además otro led conectado a RB7.
Se pide elaborar un programa que mantenga por un lado parpadeando al led conectado a RB7 con un periodo de 1
segundo, y por otro lado que refleje en los leds A’ y B’ el estado de los interruptores A y B.
01
02
03
04
05
06
07
W
F
TMR_OPT
ESTADO
LIST
RADIX
P=16F84
HEX
EQU
EQU
EQU
EQU
0
1
0x01
0x03
; TMRO en banco 0 OPTION en banco 1
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
6.
PUERTAA
PUERTAB
INTCON
CONTA
inicio
bucle
ra0_1
ra1x
ra1_1
bucle2
inter
conta_0
rb7_1
seguir
EQU
EQU
EQU
EQU
0x05
0x06
0x0B
0x10
; PA en banco 0 TRISA en banco 1
; PB en banco 0 TRISB en banco 1
ORG
goto
ORG
goto
ORG
0
inicio
4
Inter.
5
; Vector de Reset
bsf
clrf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
movlw
movwf
movlw
movwf
btfsc
goto
bcf
goto
ESTADO,5
PUERTAB
b'00000011'
PUERTAA
b'00000111'
TMR_OPT
ESTADO,5
b'10100000'
INTCON
0x10
CONTA
0x0c
TMR_OPT
PUERTAA,0
ra0_1
PUERTAB,0
ra1x
bsf
btfsc
goto
bcf
goto
bsf
goto
decfsz
goto
movlw
movwf
btfsc
goto
bsf
goto
bcf
movlw
movwf
movlw
movwf
retfie
; Contador auxiliar
; Vector de Interrupcion
; Salta a comienzo de rutina de interrupcion
; Seleccion del banco 1
; Configura PUERTA B como salida
; Configura RA0, RA1 como entradas
; Banco 0
; Se permite interrupcion del
; TMR0 y la global (GIE)
; Se carga CONTA con 16 decimal
;
;
;
;
;
Se carga TMR0 con 12 decimal
Explora RA0 y brinco si vale 0
salta a RA0_1
Si RA0 = 0 se saca por RB0 un 0
A explorar RA1
PUERTAB,0
PUERTAA,1
ra1_1
PUERTAB,1
bucle2
PUERTAB,1
bucle
;
;
;
;
Si RA0 = 1 se saca por RB0 un 1
Examina ra1 y brinco si es 0
Salta si RA1 = 1
Si RA1 = 0, RB1 = 0
CONTA,1
seguir
0x10
CONTA
PUERTAB,7
rb7_1
PUERTAB,7
seguir
PUERTAB,7
b'10100000'
INTCON
0x0c
TMR_OPT
; RSI. Decrementa CONTA y brinco si vale 0
; Si RA1 = 1 , RB1 = 1
; Bucle indefinido, se sale por la interupcion
; Si CONTA = 0 se carga
; Si RB7 = 0, brinco
; Si RB7 = 0, se invierte
; Si RB7 = 1 , se invierte
; Se restaura INTCON por desactivar las
; interrupciones el procesador
; Se recarga TMR0 con 12
END
Disponemos de un display 7-segmentos de un dígito más un punto conectado a un PIC16F84 a través del puerto B.
Además se dispone de tres interruptores conectados a las tres líneas menos significativas del puerto A. Se pide
realizar el programa que visualice en el display el valor decimal del número binario recibido a través de los
interruptores.
f
a
b
c
d
e
f
g
dp
b
g
e
c
d
dp
01
02
03
04
05
06
07
08
09
10
11
12
13
w
f
PCL
PUERTAA
PUERTAB
ESTADO
VALOR
LIST
RADIX
P=16F84
HEX
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0
1
02
05
06
03
12
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
; Registro auxiliar
; RUTINA PRINCIPAL: Lectura de los interruptores y calculo del valor a visualizar
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
7.
inicio
explora
bit_1
bit_2
visual
ORG
goto
ORG
bsf
clrw
movwf
movlw
movwf
bcf
movf
movwf
comf
clrw
btfss
goto
addlw
btfss
goto
addlw
btfss
goto
addlw
call
0
inicio
5
ESTADO,5
; Para saltar el Vector de Interrupcion
; Seleccion del banco 1
PUERTAB
0xff
PUERTAA
ESTADO,5
PUERTAA,w
VALOR
VALOR,f
; Puerta B salida
;
;
;
;
;
puerta A entrada
Seleccion banco 0
Se cargan los interruptores en W
Se usa un registro auxiliar
Invertir los niveles de interruptores
VALOR,0
bit_1
0x01
VALOR,1
bit_2
0x02
VALOR,2
visual
0x04
display
;
;
;
;
;
;
;
;
;
;
Si RA0 = 1, brinca
Salta a explorar el bit_1
Si RA0 =1, se suma 1
Si RA1 = 1, brinca
Salta a explorar el bit_2
Si RA1 = 1, se suman 2
Si RA2 = 1, brinca
Salta al modulo del display
Si RA2 = 1, se suman 4
Salta al modulo del display
; DISPLAY: Rutina de visualizaci¢n del acumulador en el display de 7 segmentos
bucle
movwf
PUERTAB
goto
bucle
; Al retornar de la subrutina
; el valor de W se saca por la Puerta B
; bucle infinito
; TABLA DE CONVERSION--------------------------------------------------------display
addwf
PCL,f
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
0x3F
0x06
0x5b
0x4f
0x66
0x6d
0x7d
0x07
;
;
;
;
;
;
;
;
;
;
;
pcl + W -> W
El pcl se incrementa con el
valor de W proporcionando un salto
Retorna con el valor del codigo del 0
Retorna con el c¢digo del 1
Retorna con el c¢digo del 2
Retorna con el c¢digo del 3
Retorna con el c¢digo del 4
Retorna con el c¢digo del 5
Retorna con el c¢digo del 6
Retorna con el c¢digo del 7
END
Escribir un programa que transfiera a las N primeras posiciones de la EEPROM de datos las direcciones 0x10 a
0x10+N-1 de la memoria RAM. El valor de N se encuentra almacenado en la dirección 0x0F del primer banco de
la memoria. Tras escribir la cadena el programa comprobará que la escritura es correcta y deja W a 0 si ha sido así
y a un valor distinto de 0 si la comprobación no es satisfactoria.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DATA_CON1
ADDR_CON2
STATUS
N
INICIO
INDF
FSR
INTCON
EECON1
INI
ESCRIBE
LIST
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
p= 16F84
08h
09h
03h
0Fh
10h
00h
04h
0Bh
88h
ORG
goto
ORG
retfie
bcf
movf
movwf
andwf
btfsc
goto
0
INI
4
STATUS,5
N,0
ADDR_CON2
ADDR_CON2,0
STATUS,2
FIN
decf
movf
addlw
movwf
movf
movwf
ADDR_CON2,1
ADDR_CON2,0
INICIO
FSR
INDF,0
DATA_CON1
bcf
bsf
movlw
movwf
INTCON,7
STATUS,5
0x55
ADDR_CON2
; Interrupcion sin tratamiento
; Pagina 0
; Guardamos en W el contador
; Refrescamos los flags
; Si FZ=1 saltamos a FIN
;
;
;
;
;
;
;
;
;
;
;
;
Inicialmente en ADDR esta el numero de
byte a escribir + 1 (de N+1 a 1 )
Se escriben en orden inverso
DirEEPROM en Addr
DirEEPROM en W
INICIO+DirEEPROM= DirRAM (en W)
Direccionamiento indirecto
En W dato a escribir
Dato a escribir en EEDATA
Secuencia de escritura
GIE=0
Banco 1
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
WAIT
; WAIT
movlw
movwf
0xAA
ADDR_CON2
movlw
movwf
bsf
bsf
bsf
btfss
goto
sleep
b'11000000'
INTCON
DATA_CON1,2
DATA_CON1,1
STATUS,5
EECON1,2
WAIT
bcf
clrw
addwf
btfss
goto
STATUS,5
; Pagina 0
ADDR_CON2,0
STATUS,2
ESCRIBE
; ADDR_CON2=0 ?
; Si FZ=1 saltamos a COMPROB
movf
movwf
N,0
ADDR_CON2
FIN
decf
movf
addlw
movwf
bsf
bsf
bcf
ADDR_CON2,1
ADDR_CON2,0
INICIO
FSR
STATUS,5
DATA_CON1,0
STATUS,5
movf
subwf
btfsc
goto
INDF,0
DATA_CON1,0
STATUS,2
FIN
clrw
addwf
btfss
goto
sleep
goto
END
GIE=1 EEIE=1
WREN=1
Orden de escritura
Banco 1
Esperamos a que se escriba
; Otra posibilidad. El WD siempre tarda mas en
; rebosar que la escritura en completarse
COMPROB
LEE
;
;
;
;
;
ADDR_CON2,0
STATUS,2
LEE
FIN
; Iniciamos comprobacion de la escritura
; Guardamos en W el contador
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Inicialmente en ADDR esta el numero de
byte a leer + 1 (de N+1 a 1 )
Se escriben en orden inverso
DirEEPROM en Addr
DirEEPROM en W
DirRAM en W
Direccionamiento indirecto
Pagina 1
Orden de lectura
Pagina 0
comprobacion
Dato de la RAM en W
DATA-W -> W
Si FZ=1 todo ha ido bien
Si no Error y W <> 0
Siguiente
; ADDR_CON2=0 ?
; Si FZ=1 saltamos a FIN
; Lee el sigueinte
Descargar