Академический Документы
Профессиональный Документы
Культура Документы
POLITCNICA
MICROPROCESADORES
EJERCICIOS Y PRCTICAS
2003 / 2004
2003 / 04
EJERCICIOS DE PROGRAMACIN I
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
0x20
org
goto
org
0x00
inicio
0x05
movlw d7
addlw d12
movwf RESULTADO
end
;Carga 7 en el acumulador.
;Suma 12 al contenido del acumulador y lo guarda en l.
;Deposita el contenido del acumulador en "RESULTADO".
;Paro. Tambin se puede emplear "sleep" o un bucle.
EJERCICIOS DE PROGRAMACIN I
2003 / 04
EJERCICIOS DE PROGRAMACIN I
Esta ALU solo sabe emplear como registro negativo el acumulador (W). De forma que para
realizar la operacin sumaremos primero A+B y lo guardaremos en una direccin de
memoria "RESULTADO" para, posteriormente, cargar C en el acumulador y restrselo a
RESULTADO mediante la instruccin "subwf": resta del registro F la cantidad contenida
en W.
list p=16F876,f=INHX8M
include "P16F876.INC"
DATOA
DATOB
DATOC
RESULTADO
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
equ
equ
equ
0x20
0x21
0x22
0x23
org
goto
org
0x00
inicio
0x05
movf
addwf
movwf
movf
subwf
DATOA,W
DATOB,W
RESULTADO
DATOC,W
RESULTADO,F
;Dato A al acumulador.
;Sumo al acumulador el dato B. La suma A+B est en W.
;Envo el contenido del acumulador a "RESULTADO".
;Envo el dato C al acumulador.
;Resta del registro RESULTADO el contenido del
;acumulador y gurdalo en RESULTADO.
end
movf
addwf
movwf
movf
subwf
0x20,0
0x21,0
0x23
0x22,0
0x23,1
;Dato A al acumulador
;Sumo al acumulador el dato B. La suma A+B est en W
;Envo el contenido del acumulador a "RESULTADO"
;Envo el dato C al acumulador
;Resta del registro RESULTADO el contenido del
;acumulador y gurdalo en RESULTADO
end
;
;
;
;
;
EJERCICIOS DE PROGRAMACIN I
2003 / 04
EJERCICIOS DE PROGRAMACIN I
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
equ
equ
equ
equ
equ
0x20
0x21
0x22
0x23
0x24
0x25
org
goto
org
0x00
inicio
0x05
movf
addwf
movwf
movf
btfsc
addlw
A_L,W
B_L,W
SOL_L
A_H,W
STATUS,0
d1
addwf B_H,W
movwf SOL_H
end
A_H
A_L
B_H
B_L
SOL_H
SOL_L
* Nota: Cuando escribimos "STATUS,0" o cualquier otro registro, nos estamos refiriendo
al bit 0 de ese registro (en este caso el bit de carry).
EJERCICIOS DE PROGRAMACIN I
2003 / 04
EJERCICIOS DE PROGRAMACIN I
Bsicamente el cdigo es el mismo, pero deberemos recordar de teora que el bit carry
se interpreta como:
1 = se ha producido acarreo en el 8 bit
0 = no se ha producido acarreo
Pero esto es para la suma. Si estamos restando, el bit carry se interpreta de forma
inversa, es decir:
1 = no hay acarreo
0 = se ha producido acarreo en el 8 bit
En este ejercicio deberemos emplear la instruccin "btfss" en vez de "btfsc".
Deberemos tener cuidado al utilizar el bit C e interpretarlo convenientemente.
list p=16F876,f=INHX8M
include "P16F876.INC"
A_H
A_L
B_H
B_L
SOL_H
SOL_L
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
equ
equ
equ
equ
equ
0x20
0x21
0x22
0x23
0x24
0x25
org
goto
org
0x00
inicio
0x05
movf
subwf
movwf
movf
btfss
addlw
subwf
movwf
end
B_L,W
A_L
SOL_L
B_H,W
STATUS,0
d1
A_H,W
SOL_H
EJERCICIOS DE PROGRAMACIN I
2003 / 04
EJERCICIOS DE PROGRAMACIN I
CONT
inicio
uno
;Tipo de procesador.
;Definiciones de registros internos.
equ
0x70
org
goto
org
0x00
inicio
0x05
movlw
movwf
movlw
movwf
movlw
movwf
incf
decfsz
goto
end
d15
CONT
0x20
FSR
0x33
INDF
FSR,F
CONT,F
uno
;Cargamos 15 en el acumulador.
;Asignamos el valor 15 a la variable CONT.
;Con esto conseguimos que el registro de
;direccionamiento indirecto apunte a la direccin 0x20.
;Cargamos en INDF el contenido 0x33, de forma que
;lo guardar en la direccin a la que apunte FSR.
;Apunto a la siguiente direccin a escribir.
;Decremento el contador y mientras no sea cero
;vuelvo a realizar la operacin.
;Si es cero, acabo el programa.
EJERCICIOS DE PROGRAMACIN I
2003 / 04
EJERCICIOS DE PROGRAMACIN I
equ
equ
0x20
0x21
org
goto
org
0x00
inicio
0x05
;Tipo de procesador.
;Definiciones de registros internos.
inicio
movf
BIN,W
call
tabla
movwf GRAY
tabla
addwf PCL,F
b00000001
b00000011
b00000010
b00000110
b00000111
b00000101
b00000100
b00001100
b00001101
;Como no nos especifican el tamao de la tabla, la podemos hacer todo lo grande que
;queramos, pero con cuidado de no sobrepasar las 256 posiciones, ya que sino nos
;pasaramos de pgina.
EJERCICIOS DE PROGRAMACIN I
2003 / 04
EJERCICIOS DE PROGRAMACIN II
inicio
uno
dos
;Tipo de procesador.
;Definiciones de registros internos.
org
goto
org
0x00
inicio
0x05
clrf
bsf
movlw
movwf
movlw
movwf
clrf
PORTB
STATUS,RP0
b00000110
ADCON1
b00000001
TRISA
TRISB
bcf
STATUS,RP0
btfss
goto
bsf
bcf
goto
bcf
bsf
goto
PORTA,RA0
dos
PORTB,RB0
PORTB,RB1
uno
PORTB,RB0
PORTB,RB1
uno
end
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
Ejercicio 2
Borrar el puerto B
Inicializar el puerto
B como salida y el
A como entrada
SI
SI
NO
RA0=0?
00
Escribir en el
puerto B
10101010
NO
RA1=0?
01
Escribir en el
puerto B
01010101
SI
10
Escribir en el
puerto B
00001111
NO
RA0=0?
11
Escribir en el
puerto B
11110000
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
;Tipo de procesador.
;Definiciones de registros internos.
org
goto
org
0x00
inicio
0x05
inicio
clrf
bsf
movlw
movwf
movlw
movwf
clrf
bcf
PORTB
STATUS,RP0
b00000110
ADCON1
b00000011
TRISA
TRISB
STATUS,RP0
uno
btfsc
goto
btfsc
goto
movlw
movwf
goto
movlw
movwf
goto
btfsc
goto
movlw
movwf
goto
movlw
movwf
goto
PORTA,RA1
tres
PORTA,RA0
dos
b10101010
PORTB
uno
b01010101
PORTB
uno
PORTA,RA0
cuatro
b00001111
PORTB
uno
b11110000
PORTB
uno
;
;Si RA1 es uno, voy a "tres".
;
;Si RA0 es uno, voy a "dos".
;Si RA0 es cero envo el
;valor al puerto B
;y vuelvo a "uno".
;Como RA0 es uno, envo el valor
;correspondiente al puerto B.
;Vuelvo a "uno".
;
;Si RA0 es uno voy a "cuatro".
;Si RA0 es cero envo el valor
;correspondiente al puerto B.
;Vuelvo a "uno".
;Si RA0 es uno envo el valor
;correspondiente al puerto B.
;Vuelvo a "uno".
dos
tres
cuatro
end
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
Motor
M
RA2
RA1
a
RB0
cua
PIEZA
V
RA0
l
list p=16F876,f=INHX8M
include "P16F876.INC"
inicio
uno
dos
tres
cuatro
cinco
;Tipo de procesador.
;Definiciones de registros internos.
org
goto
org
0x00
inicio
0x05
clrf
bsf
movlw
movwf
movlw
movwf
clrf
PORTB
STATUS,RP0
b00000110
ADCON1
b00001111
TRISA
TRISB
bcf
STATUS,RP0
btfss
goto
bcf
bsf
btfss
goto
bsf
btfss
goto
bcf
btfss
PORTA,RA0
uno
PORTB,RB2
PORTB,RB0
PORTA,RA2
dos
PORTB,RB1
PORTA,RA3
tres
PORTB,RB0
PORTA,RA2
goto
bcf
btfss
goto
bsf
goto
cuatro
PORTB,RB1
PORTA,RA1
cinco
PORTB,RB2
uno
end
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
list p=16F876,f=INHX8M
include "P16F876.INC"
;Tipo de procesador.
;Definiciones de registros internos.
org
goto
org
0x00
inicio
0x05
inicio
clrf
bsf
movlw
movwf
movlw
movwf
clrf
bcf
PORTB
STATUS,RP0
b00000110
ADCON1
b00000011
TRISA
TRISB
STATUS,RP0
leer0
btfss
goto
movlw
movwf
goto
movlw
movwf
btfss
goto
bsf
goto
bcf
goto
PORTA,RA0
cero
b00000110
PORTB
leer1
b00111111
PORTB
PORTA,RA1
puntooff
PORTB, RB7
leer0
PORTB,RB7
leer0
cero
leer1
puntooff
;Enciendo
;Vuelvo a
;Borro el
;Comienzo
el punto digital.
comenzar.
punto digital del display.
de nuevo.
end
; Se podra pensar que sera preciso desactivar las resistencias de pull-up del
; puerto B, pero esto no es necesario ya que stas resistencias se desactivan
; automticamente cuando las patillas del puerto B estn configuradas como salida.
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
;Tipo de procesador.
;Definiciones de registros internos.
org
goto
org
0x00
inicio
0x05
inicio
clrf
bsf
movlw
movwf
movlw
movwf
clrf
bcf
PORTB
STATUS,RP0
b00000110
ADCON1
b00001111
TRISA
TRISB
STATUS,RP0
uno
movf
PORTA,W
andlw b00001111
;
;
;
;
;
;
;
;
;
;
Realizamos un enmascaramiento AND a las patillas RA3:RA0 de forma que, los bits no
empleados valdrn cero, y los que utilizamos mantendrn su valor. Nos aseguramos as
que, aunque halla algn valor en las patillas RA7:RA4 (no utilizadas), ste quedar
"enmascarado" y valdr cero
PORTA
enmascaramiento AND
tabla
tabla
;Llamo a la subrutina.
movwf PORTB
goto
uno
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
PCL,F
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01101111'
b'01110111'
b'01111100'
b'00111001'
b'01011110'
b'01111001'
b'01110001'
end
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
0x20
;Contador.
org
goto
org
0x00
inicio
0x05
bsf
STATUS,RP0
bcf
bcf
OPTION_REG,T0CS
OPTION_REG,PSA
;Comentario:
; stas dos instrucciones no se han realizado moviendo un literal ya que cuando se
; produce un reset el registro OPTION_REG posee todos sus bits a 1. Solo nos har falta
; borrar aquellos bits que deban estar a cero. Se podra hacer moviendo un literal.
bcf
uno
STATUS,RP0
movlw d50
movwf CONTADOR
bcf
INTCON,T0IF
;Vuelvo al banco 0.
;Cargo el valor 50 para la repeticin de la secuencia
;en el registro "CONTADOR".
;Borrar el bit T0IF.
; Importante!: Esta ltima operacin se debe realizar siempre por programa aunque en
; teora no hara falta, ya que al producirse un reset todos los bits de INTCON se
; ponen a cero. Es preferible incluirla siempre.
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Ahora hay que calcular el valor a cargar en el TMR0. Este calculo debe realizarse a
mano. Sabemos que la ecuacin que define la temporizacin para el TMR0 es:
T = 4Tosc(256 - carga)pre-escala
Si despejamos la carga:
T
carga = 256 - ------------------4Toscpre-escala
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
;
;
carga = 60 T = 10.0352 mseg
;
carga = 61 T = 9.9840 mseg
;
; El segundo valor es el correcto, 61, ya que con el primero nos pasamos. Siempre ser
; ms sencillo ajustar la temporizacin deseada incluyendo en el programa instrucciones
; "nop". Continuamos con el programa.
movlw
movwf
d61
TMR0
;Realizamos la carga
;en el temporizador 0.
btfss
goto
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
Como nos piden que cuente hasta 6, cargaremos en TMR0 un valor de forma que solo le
falten 6 incrementos para desbordar, as desbordar despus de 6 pulsos. Emplear
TMR0 para contar los 6 eventos y despus lo emplear como temporizador para
temporizar el segundo de visualizacin del display. Esto no es incompatible, ya que
las dos tareas no las realiza a la vez.
list p=16F876,f=INHX8M
include "P16F876.INC"
CONT
W_TEMP
STATUS_TEMP
OPTION_REG_TEMP
inicio
equ
equ
equ
equ
0x20
0x21
0x22
0x23
;Tipo de procesador.
;Definiciones de registros internos.
org
goto
org
goto
org
0x00
inicio
0x04
inter
0x05
clrf
bsf
movlw
movwf
bsf
clrf
PORTB
STATUS,RP0
.6
ADCON1
TRISA,RA4
TRISB
movlw b10101000
movwf OPTION_REG
;OPTION_REG = 10101000
; bit 7 RBPU =1
;
;
; bit 6 INTEDG=0
;
;
;
;
bit 5
bit 4
bit 3
bits 2:0
STATUS,RP0
;Vuelvo al banco 0.
; Debo cargar ahora el temporizador con el complemento a 1 de seis para que ste
; desborde tras seis eventos (en el sptimo, ya que 6 se decrementa hasta 0):
;
;
TMR0
W
Display
;
F9 ----- 6 ----- 0
;
FA ----- 5 ----- 1
;
FB ----- 4 ----- 2
;
FC ----- 3 ----- 3
;
FD ----- 2 ----- 4
;
FE ----- 1 ----- 5
;
FF ----- 0 ----- 6
;
Interrupcin 00
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
movlw ~.6
movwf TMR0
;INTCON
; bit 7
; bit 5
; bit 2
;
; Todas
uno
movlw b00111111
movwf PORTB
movlw b10100000
movwf INTCON
;Configuro el registro
;INTCON como necesite.
= 10100000
GIE=1
Activamos el bit general de interrupciones.
T0IE=1
Habilita la interrupcin del TMR0.
T0IF=0
ste bit no se escribe. Yo leo de l cuando hay desbordamiento del
temporizador TMR0. Deber borrase por software (un cero).
las dems interrupciones deshabilitadas (ceros)
comf
TMR0
andlw b00001111
; * sta ltima instruccin es optativa ya que los valores que va a tomar el TMR0 sern
; del tipo Fx. Al complementar, F es 0. ej: F9=11111001 00000110 (ya hay
; enmascaramiento)
call
tabla
movwf PORTB
goto
uno
; El microprocesador estar en este bucle hasta que el bit T0IF sea uno, momento en el
; que se producir una interrupcin y el programa saltar a la subrutina de interrupcin
; "inter"
tabla
;
;
;
;
;
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
PCL,F
b'01111101'
b'01101101'
b'01100110'
b'01001111'
b'01011011'
b'00000110'
b'00111111'
;Sumo el
;Retorno
;Retorno
;Retorno
;Retorno
;Retorno
;Retorno
;Retorno
en
en
en
en
en
en
en
W
W
W
W
W
W
W
Definimos la subrutina de interrupcin que mostrar todos los segmentos del display
iluminados durante 1 segundo. Para ello, como se ha comentado al principio, se
emplear tambin el TMR0, ya que su primera funcin de contador ya ha terminado.
Para temporizar 1 segundo, se emplear la temporizacin del ejercicio 6 que era de
10 mseg y la multiplicaremos por 100 (por eso definimos CONT)
;Banco 1.
;Configuramos el registro OPTION_REG para
;que el TMR0 funcione como temporizador.
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
;OPTION_REG = 10000111
;
;
;
;
;
;
bit 7
bit 6
bit 5
bit 4
bit 3
bits 2:0
RBPU =1
Desactivamos las resistencias de pull-up por precaucin.
INTEDG=0 Con un 0, interrupcin activa con flanco descendente en RB0/INT.
T0CS=0
Con 0 seleccionamos los pulsos del reloj interno.
T0SE=0
El incremento de TMR0 se produce por flanco ascendente del reloj.
PSA=0
Asigna el divisor de frecuencias al mdulo del TMR0.
PS2:PS0=1
Selecciona el rango del divisor de frecuencia del TMR0 (256).
bcf
STATUS,RP0
;Vuelvo al banco 0
bcf
INTCON,T0IF
;Borrar T0IF. *
0xFF
PORTB
retardo
PORTB
;El display se
;enciende completamente.
;Subrutina para iluminar durante 1 segundo.
;Borro el display.
goto
stop
; * Todas las subrutinas deben acabar con un retorno, pero creo un bucle infinito porque
; el enunciado dice que para repetir el proceso ser necesario pulsar RESET
; / *** subrutina de retardo *** /
retardo
otravez
dos
;
;
;
;
;
movlw
movwf
bcf
movlw
movwf
btfss
goto
decfsz
goto
return
.100
CONT
INTCON,T0IF
.61
TMR0
INTCON,T0IF
dos
CONT,F
otravez
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
F
N=1
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
FFFF
0000
0000
0000
0000
0000
0000
RB0
FFFE
N=2
FFFE
FFFF
0000
FFFF
0000
FFFE
FFFF
FFFD
N=3
FFFD
;
;
;
;
;
;
;
;
;
;
;
;
;
;
FFFE
FFFE
FFFF
0000
0000
FFFD
FFFE
FFFF
0000
; Hacemos el programa, por ejemplo, para N=6. Para ello, en realidad, deberemos guardar
; el complemento a 2 de 6 para que despus de contar 6 llegue a 0xFFFF y en el siguiente
; pulso se desborde y provoque la interrupcin.
list p=16F876,f=INHX8M
include "P16F876.INC"
N
W_TEMP
STATUS_TEMP
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
equ
equ
org
goto
org
goto
org
0x00
inicio
0x04
inter
0x10
clrf
bsf
clrf
bsf
PORTB
STATUS,RP0
TRISB
TRISC,RC0
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
;
;
;
;
En realidad, esta ltima instruccin no es necesaria, ya que como los impulsos van a
proceder de un oscilador externo (por RC0), deberemos activar el bit T1OSCEN del
registro T1CON. Al activar este bit, las patillas RC0 y RC1 actan como entradas,
independientemente del registro TRISC.
bsf
bcf
PIE1,TMR1IE
STAUS,RP0
movlw b00000111
movwf T1CON
;T1CON = 00000111
; bits 7:6 (no implementados) Preferiblemente se escribirn ceros.
; bits 5:4 T1CKPS1:T1CKPS0=00 Rango del pre-divisor. No seleccionaremos pre-divisor,
;
ya que el temporizador podra saltarse flancos.
; bit 3 T1OSCEN=0 Deshabilitamos el oscilador externo.
; bit 2 T1SYNC=1
No sincroniza la entrada del reloj externo con el interno.
; bit 1 TMR1CS=1
Reloj externo procedente de la patilla RC0/T1OSO/T1CKL.
; bit 0 TMR1ON=1
Habilitacin del TMR1.
clrf
TMR1L
movlw
movwf
movlw
movwf
low-N
TMR1L
high-N
TMR1H
; Los comandos "low" y "high" se emplean para referirse a palabras que ocupan dos
; posiciones de memoria (16 bits). Si el valor de N solo ocupase 8 bits estos comando no
; haran falta.
movlw b11000000
movwf INTCON
;INTCON
; bit 7
; bit 6
; Todas
uno
= 11000000
GIE=1
Activamos el bit general de interrupciones.
PEIE=1
Habilita la interrupcin de los perifricos.
las dems interrupciones deshabilitadas (ceros)
sleep
nop
goto
uno
6:
del TMR1 para asegurar que no se
operacin de escritura.
de N en complemento a 2,
parte baja del TMR1.
de N en complemento a 2,
parte alta del TMR1.
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN II
bcf
PIR1,TMR1IF
movlw b00000001
xorwf PORTB,F
;
;
;
;
;
;
;
;
;
;
;
;
Con esta operacin se consigue que el valor de la patilla RB0 cambie. Al colocar un 1
en el bit cero de W conseguimos que el bit cero del PORTB (RB0) cambie su valor
actual. Las posiciones de W donde hay ceros no alteran el valor de los dems bits de
PORTB. Lo vemos en la tabla de la verdad de la operacin OR-exclusiva:
W | RB0 | Nuevo valor
-----|-----|------------0 | 0 |
0
0 | 1 |
1
1 | 0 |
1
1 | 1 |
0
-----|-----|-------------
end
EJERCICIOS DE PROGRAMACIN II
2003 / 04
EJERCICIOS DE PROGRAMACIN III
Flanco 0
Flanco 1
Periodo
1 captura
;
;
;
;
;
;
;
;
2 captura
La diferencia entre dos flancos ascendentes nos dar el periodo. La primera captura se
almacenar en un registro temporal de 16 bit, ya que el mdulo de captura solo
memoriza la captura actual. Tambin necesito establecer en que instante debo realizar
la resta de valores. Definir una variable llamada "N_FLANCO" de forma que cuando se
produzca el primer flanco, N_FLANCO=0 y cuando se produzca el segundo N_FLANCO=1,
momento en el que realizar la resta.
Como nos dice el enunciado, la velocidad de evolucin del TMR1 oscila entre 1.6seg y
100mseg, por lo que solo podr medir periodos que oscilen entre los 62KHz y los 10 Hz.
list p=16F876,f=INHX8M
include "P16F876.INC"
PERIODO_H
PERIODO_L
CAP_TEMP_H
CAP_TEMP_L
N_FLANCO
W_TEMP
STATUS_TEMP
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
equ
equ
equ
equ
equ
equ
0x20
0x21
0x22
0x23
0x24
0x25
0x26
org
goto
org
goto
org
0x00
inicio
0x04
inter
0x15
clrf
clrf
clrf
clrf
clrf
PERIODO_H
PERIODO_L
CAP_TEMP_H
CAP_TEMP_L
N_FLANCO
;
;
;
;
;
clrf
clrf
bsf
clrf
clrf
bsf
bsf
bcf
PORTB
PORTD
STATUS,RP0
TRISB
TRISD
TRISC,RC2
PIE1,CCP1IE
STATUS,RP0
;Borro el valor de
;los puertos B y D.
;Banco 1.
;Puerto B configurado como salida.
;Puerto D configurado como salida.
;Bit RC2 configurado como entrada.
;Habilito las posibles interrupciones del comparador 1.
;Vuelvo al banco 0.
2003 / 04
EJERCICIOS DE PROGRAMACIN III
clrf
clrf
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
TMR1L
TMR1H
;T1CON = 00110001
; bits 7:6 (no implementados) Preferiblemente se escribirn ceros.
; bits 5:4 T1CKPS1:T1CKPS0=11 Rango del pre-divisor, x8.
; bit 3 T1OSCEN=0 Deshabilitamos el oscilador externo.
; bit 2 T1SYNC=0
Sincroniza la entrada del reloj externo con el interno.
; bit 1 TMR1CS=0
Reloj interno (fosc/4).
; bit 0 TMR1ON=1
Habilitacin del TMR1.
movlw b00110001
movwf T1CON
movlw b11000000
movwf INTCON
= 11000000
GIE=1
Activamos el bit general de interrupciones.
PEIE=1
Habilita la interrupcin de los perifricos.
las dems interrupciones deshabilitadas (ceros).
; Ya estamos preparados para que se produzcan interrupciones cada vez que el mdulo CCP
; detecte un flanco. Programamos ahora el mdulo CCP.
600ns
800ns
;CCP1CON =
; bits 7:6
; bits 5:4
; bits 3:0
movlw b00000101
movwf CCP1CON
00000101
(no implementados)
CCP1X:CCP1Y=00
CCP1M3:CCP1M0=0101
loop 1000ns
1200ns
1400ns
1600ns
movf
movwf
movf
movwf
goto
PERIODO_H,W
PORTB
PERIODO_L,W
PORTD
loop
2003 / 04
EJERCICIOS DE PROGRAMACIN III
Con estas dos instrucciones conseguimos detectar posibles falsas interrupciones que no
son debidas al mdulo CCP1. Si CCP1IF=1 la interrupcin es debida al mdulo CCP1,
saltar una instruccin y continuar con la subrutina de interrupcin. Si este bit es
cero significa que el programa ha entrado en la subrutina de interrupcin pero no por
que CCP1 halla detectado un flanco ascendente. En este caso cancelamos la interrupcin
btfsc N_FLANCO,0
goto medir
movf
movwf
movf
movwf
incf
CCPR1L,W
CAP_TEMP_L
CCPR1H,W
CAP_TEMP_H
N_FLANCO,F
PIR1,CCP1IF
CAP_TEMP_L,W
CCPR1L,W
PERIODO_L
STATUS,C
CAP_TEMP_H
CAP_TEMP_H,W
CCPR1H,W
PERIODO_H
PIR1,CCP1IF
retfie
medir
movf
subwf
movwf
btfss
incf
movf
subwf
movwf
bcf
2003 / 04
EJERCICIOS DE PROGRAMACIN III
swapf W_TEMP,F
swapf W_TEMP,W
;Los registros ya estn recuperados
retfie
end
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
Ejemplo:
Si realizado el proceso, el valor que obtenemos es, por ejemplo:
PERIODO_H | PERIODO_L_
0 0
0 A
Este resultado quiere decir que tenemos 10 eventos de la base de tiempos del TMR1, es
decir:
101.6s = 16s
*Nota: 16s es el valor de nuestro periodo. Como se puede comprobar, los registros
PERIODO_H y PERIODO_L no reflejan el valor real de nuestro periodo, reflejan el valor
en funcin de la base de tiempos (dividido entre 1.6). Para que reflejasen el valor
real hara falta codificar una subrutina de multiplicacin para multiplicar el
resultado por la base de tiempos.
2003 / 04
EJERCICIOS DE PROGRAMACIN III
inicio
;Tipo de procesador.
;Definiciones de registros internos.
equ
equ
0x20
0x21
org
goto
org
goto
org
0x00
inicio
0x04
inter
0x05
clrf
bsf
movlw
movwf
movlw
movwf
bcf
bsf
bcf
PORTB
STATUS,RP0
.6
ADCON1
b00111111
TRISA
TRISB,RB0
PIE1,CCP1IE
STATUS,RP0
movlw b00000010
movwf T1CON
;Configuro el
;temporizador 1.
;T1CON = 00000010
; bits 7:6 (no implementados) Preferiblemente se escribirn ceros.
; bits 5:4 T1CKPS1:T1CKPS0=00 Rango del pre-divisor, 1:1
; bit 3 T1OSCEN=0 Deshabilitamos el oscilador externo.
; bit 2 T1SYNC=0
Sincroniza la entrada del reloj externo con el interno.
; bit 1 TMR1CS=1
Reloj externo procedente de la patilla RC0/T1OSO/T1CKL (flancos
;
ascendentes).
; bit 0 TMR1ON=0
Detiene el temporizador. (Lo habilitar ms tarde).
movlw b00001010
movwf CCP1CON
;CCP1CON =
; bits 7:6
; bits 5:4
; bits 3:0
;
00001010
(no implementados)
CCP1X:CCP1Y=00
CCP1M3:CCP1M0=1010
clrf
clrf
clrf
TMR1L
TMR1H
CCPR1H
bsf
movlw b11000000
movwf INTCON
;INTCON
; bit 7
; bit 6
; Todas
;Configuro el
;mdulo CCP1.
;Configuro las
;interrupciones.
= 11000000
GIE=1
Activamos el bit general de interrupciones.
T0IE=1
Habilita la interrupcin de los perifricos.
las dems interrupciones deshabilitadas (ceros).
2003 / 04
EJERCICIOS DE PROGRAMACIN III
uno
;
;
;
;
sleep
goto
uno
;Duermo al
;microprocesador.
bcf
clrf
clrf
movlw
xorwf
clrf
;Paro el temporizador.
;Borro el posible valor que
;puedan tener los registros.
;Con esto consigo cambiar el valor
;del bit RB0 del puerto B.
;Lo borro por precaucin ya que no lo voy a usar.
T1CON,TMR1ON
TMR1L
TMR1H
b00000001
PORTB,F
CCPR1H
; Ahora hay que fijar cual ser el nmero de flancos a contar, que vendr dado por el
; valor de las patillas RA5:RA0.
movf
PORTA,W
andlw b00111111
movwf CCPR1L
;
;
;
;
;Enmascaramiento de
;bits no empleados.*
;Mando el valor a contar al registro bajo del CCP1.
;(Como se ha comentado antes, el alto no se emplea).
* En teora esta operacin no hace falta ya que el registro PORTA solo utiliza 6 bits
(tantos como patillas tiene el puerto), pero si hay problemas con los buses o
cualquier otro inconveniente se pueden modificar los bits 6 y 7. Los borro y ahorro
posibles problemas.
bsf
bcf
T1CON,TMR1CON
PIR1,CCP1IF
2003 / 04
EJERCICIOS DE PROGRAMACIN III
Como vamos a tener que temporizar 1seg nos har falta la subrutina de temporizacin de
10mseg que hemos venido empleando en algunos de los ejercicios. Adems, nuestro
formato de transmisin ser de 8 bits, que es el tamao de los caracteres del cdigo
ASCII extendido (el que emplean los PCs).
list p=16F876,f=INHX8M
include "P16F876.INC"
CONT
W_TEMP
STATUS_TEMP
inicio
;
;
;
;
;
;
;Tipo de procesador
;Definiciones de registros internos
equ
equ
equ
0x20
0x21
0x22
org
goto
org
goto
org
0x00
inicio
0x04
inter
0x05
clrf
bsf
movlw
movwf
PORTC
STATUS,RP0
b10111111
TRISC
;Configuramos el
;temporizador 0.
;OPTION_REG = 11000111
;
;
;
;
;
;
;
;
;
;
bit 7 RBPU =1
bit 6
bit 5
bit 4
bit 3
bits 2:0
;TXSTA = 00100100
;
;
;
;
;
;
;
;
bit 7 CSRC=0
bit 6
bit 5
bit 4
bit 3
bit 2
2003 / 04
EJERCICIOS DE PROGRAMACIN III
; bit 1 TRMT=0
;
; bit 0 TX9D=0
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
; Todo est preparado para que el programa comience a funcionar, solo falta habilitar la
; USART e inicializar el temporizador 0:
bcf
STATUS,RP0
bsf
movlw
movwf
movlw
movwf
~.195
TMR0
.100
CONT
movlw b10100000
movwf INTCON
;INTCON
; bit 7
; bit 5
; Todas
uno
;Vuelvo al banco 0.
;Para poder
;temporizar 10mseg.
;Para temporizar
;1 segundo.
;Habilitamos la interrupcin
;del temporizador 0.
= 10100000
GIE=1
Activamos el bit general de interrupciones.
T0IE=1
Habilita la interrupcin del TMR0.
las dems interrupciones deshabilitadas (ceros).
goto
uno
;Colgamos al procesador.
2003 / 04
EJERCICIOS DE PROGRAMACIN III
bcf
movlw
movwf
decfsz
retfie
INTCON,T0IF
~.195
TMR0
CONT,F
movlw A
call
tx_dato
movlw .100
movwf CONT
;Recargo el contador
;antes de regresar al bucle uno.
movwf TXREG
; Ahora tendr que estar muestreando el bit de transmisin TRMT continuamente hasta que
; me indique que la transmisin ha finalizado:
dos
bsf
STATUS,RP0
btfss TXSTA,TRMT
goto
dos
return
;Voy al banco 1.
;Cuando el bit sea uno, habr finalizado la transmisin
;Mientras no sea as estar a cero, espero.
end
; *Nota: En el ensamblador MPLAB, no se pueden meter impulsos a TX y RX. No se puede
; simular la transmisin serie. Habra que poner manualmente a uno el bit TRMT para
; simular el fin de transmisin.
2003 / 04
EJERCICIOS DE PROGRAMACIN III
inicio
;Tipo de procesador
;Definiciones de registros internos
equ
equ
0x20
0x21
org
goto
org
goto
org
0x00
inicio
0x04
inter
0x05
clrf
Clrf
bsf
movlw
movwf
PORTC
PORTB
STATUS,RP0
b10111111
TRISC
movlw b00100100
movwf TXSTA
;TXSTA = 00100100
;
;
;
;
;
;
;
;
;
;
;
;
bit 7 CSRC=0
bit 6
bit 5
bit
bit
bit
bit
4
3
2
1
bit 0
PIE1,RCIE
bcf
STATUS,RP0
;Volvemos al banco 0.
movlw b10010000
movwf RCSTA
;RCSTA = 10010000
;
;
;
;
;
;
;
;
;
;
bit 7 SPEN=1
bit 6 RX9=0
bit
bit
bit
bit
bit
bit
5
4
3
2
1
0
SREN=0
CREN=1
ADDEN=0
FERR=0
OERR=0
RX9D=0
2003 / 04
EJERCICIOS DE PROGRAMACIN III
uno
bsf
bsf
INTCON,PEIE
INTCON,GIE
goto
uno
movf
RCREG,W
movwf PORTB
call
tx_dato
movwf TXREG
bsf
STATUS,RP0
btfss TXSTA,TRMT
goto
dos
return
end
; Observaciones:
; Los bits RCIF y TXIF, indicadores de interrupcin, se borran automticamente. No hay
;
que borrarlos por software como ocurra por ejemplo con T0IF.
; Mientras se transmite un dato (el programa est en tx_dato) puede estar recibindose
;
otro dato en RC6. Es una configuracin full-duplex.
Prctica 2
Borrar
puerto B
y N_FLANCOS
NO
SI
Inicializar
puerto B salida
puerto A entrada
Incrementa
CONT
Leer puerto A y
guardar en
N_FLANCOS
SI
N_FLANCOS
=0?
Visualizar CONT
en el puerto B
N_FLANCOS
=0?
(STOP)
NO
RA4=0?
NO
SI
Retardo
RA4=1?
NO
SI
Retardo
Decrementar
N_FLANCOS
PRCTICA 2 - 2
N_FLANCOS
CONT
DELAY1
DELAY2
p=16F876, f=INHX8M
"P16F876.INC"
;Tipo de procesador
;Definiciones de registros internos
equ
equ
equ
equ
0x51
0x52
0x53
0x54
;
;
;
;
org
goto
0x00
inicio
org
0x05
inicio
clrf
clrf
clrf
bsf
movlw
movwf
movlw
movwf
clrf
bcf
N_FLANCOS
CONT
PORTB
STATUS,RP0
b'00000110'
ADCON1
b'00011111'
TRISA
TRISB
STATUS,RP0
;Borra N_FLANCOS.
;Borra CONT.
;Borra los latch de salida.
;Selecciona el banco 1.
;Configurar puerto A
;como E/S digitales.
;Configurar las patillas RA4:RA0
;del puerto A como entrada.
;Configurar puerto B como salida.
;Vuelvo al banco 0.
leer_A
movf
andlw
btfsc
goto
PORTA,W
b'00001111'
STATUS,Z
leer_A
movwf N_FLANCOS
loop0
btfsc PORTA,4
goto
loop0
call
retardo
loop1
btfss
goto
call
decfsz
goto
incf
movf
movwf
goto
PORTA,4
loop1
retardo
N_FLANCOS,F
loop0
CONT,F
CONT,W
PORTB
leer_A
\
| Asignar a las distintas variables
| sus registros correspondientes.
/
;Deteccin de
;flanco de bajada.
;Llamada a subrutina para evitar rebotes mecnicos
;del interruptor.
;Deteccin de
;flanco de subida.
;Si N_FLANCOS no es cero
;vuelve a loop0.
;Si N_FLANCOS es cero incrementa el contador.
;Refleja el valor de CONT a
;la salida del puerto B.
;Vuelve a realizar todo el proceso.
movlw d'66'
movwf DELAY2
PRCTICA 2 - 3
uno
dos
movlw
movwf
nop
decfsz
goto
decfsz
goto
return
0xFB
DELAY1
DELAY1,F
dos
DELAY2,F
uno
end
PRCTICA 2 - 4
Prctica 3
Borrar
puerto B
y N_FLANCOS
NO
N_FLANCOS
=0?
SI
Inicializar
puerto B salida
puerto A entrada
Incrementa
CONT
Leer puerto A y
guardar en
N_FLANCOS
SI
SI
NO
N_FLANCOS
=0?
(STOP)
Tabla
NO
RA4=0?
CONT=20?
(mximo)
NO
Enviar el valor de
CONT convertido al
puerto B (display)
SI
Fin
Retardo
RA4=1?
SI
NO
Tabla
Sumar
desplazamiento al PC
(digito hex.)
Retardo
Localizar valor en
cdigo 7 segmentos
Decrementar
N_FLANCOS
Visualizar en el
puerto B
(display)
Retorna
PRCTICA 3 - 2
N_FLANCOS
CONT
DELAY1
DELAY2
p=16F876, f=INHX8M
"P16F876.INC"
;Tipo de procesador
;Definiciones de registros internos
equ
equ
equ
equ
0x51
0x52
0x53
0x54
;
;
;
;
org
goto
0x00
inicio
org
0x05
inicio
clrf
clrf
clrf
bsf
movlw
movwf
movlw
movwf
clrf
bcf
movlw
movwf
N_FLANCOS
CONT
PORTB
STATUS,RP0
b'00000110'
ADCON1
b'00011111'
TRISA
TRISB
STATUS,RP0
b'00111111'
PORTB
;Borra N_FLANCOS.
;Borra CONT
;Borra los latch de salida.
;Selecciona el banco 1.
;Configurar puerto A
;como E/S digitales.
;Configurar las patillas RA4:RA0
;del puerto A como entrada.
;Configurar puerto B como salida.
;Vuelvo al banco 0.
;Inicializo el display
;con el nmero cero.
leer_A
movf
andlw
btfsc
goto
PORTA,W
b'00001111'
STATUS,Z
leer_A
movwf N_FLANCOS
loop0
btfsc PORTA,4
goto
loop0
call
retardo
loop1
btfss
goto
call
decfsz
goto
incf
PORTA,4
loop1
retardo
N_FLANCOS,F
loop0
CONT,F
movlw
subwf
btfss
goto
goto
d'20'
CONT,W
STATUS,Z
visualizar
inicio
\
| Asignar a las distintas variables
| sus registros correspondientes.
/
PRCTICA 3 - 3
visualizar
movf
andlw
call
movwf
clrf
goto
CONT,W
b'00011111'
tabla
PORTB
PCLATH
leer_A
;Llevo CONT a W
;Enmascaramiento de bits no utilizados.
;Llamo a la subrutina para visualizar en el display.
;Enviar la codificacin de los segmentos al puerto B
;Borro el PCLATH.
;Voy a por el siguiente nmero.
; / *** Subrutina de retardo para evitar los rebotes mecnicos del interruptor *** /
retardo
uno
dos
movlw
movwf
movlw
movwf
nop
decfsz
goto
decfsz
goto
return
d'66'
DELAY2
0xFB
DELAY1
DELAY1,F
dos
DELAY2,F
uno
addwf
nop
;segmentos
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
PCL,F
.gfedcba
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01101111'
b'10111111'
b'10000110'
b'11011011'
b'11001111'
b'11100110'
b'11101101'
b'11111101'
b'10000111'
b'11111111'
b'11101111'
end
PRCTICA 3 - 4
NO
Prctica 4
temporizar
Borrar
puerto B
CONT=50
Inicializar
puerto B salida
puerto A entrada
Borrar T0IF y
cargar el valor para
temporizar 10mseg
TMR0=61
RA4=1?
NO
T0IF=1?
(desbordamiento)
SI
SI
Encender el
led conectado
a RB0
temporizar
Decrementar el
contador
CONT = CONT-1
NO
CONT=0?
SI
Apagar el
led conectado
a RB0
Retorna
temporizar
Fin
PRCTICA 4 - 2
CONT
inicio
p=16F876, f=INHX8M
"P16F876.INC"
;Tipo de procesador
;Definiciones de registros internos
equ
0x50
org
goto
0x00
inicio
org
0x05
clrf
bsf
movlw
movwf
bsf
bcf
movlw
movwf
PORTB
STATUS,RP0
b'00000110'
ADCON1
TRISA,0
TRISB,0
b'10000111'
OPTION_REG
;OPTION_REG = 10000111
;
;
;
;
;
;
;
;
;
;
;
;
bit 7 RBPU =1
bit 6
bit 5
bit 4
bit 3
bits 2:0
uno
dos
STATUS,RP0
;Vuelvo al banco 0.
btfss
goto
bsf
call
bcf
call
goto
PORTA,0
uno
PORTB,0
temporizar
PORTB,0
temporizar
uno
temporizar
otravez
movlw
movwf
bcf
movlw
movwf
d'50'
CONT
INTCON,2
d'61'
TMR0
PRCTICA 4 - 3
preguntar
btfss
goto
decfsz
goto
bcf
return
INTCON,2
preguntar
CONT,F
otravez
INTCON,2
end
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
PRCTICA 4 - 4
Prctica 5
RA5:RA0 del
puerto A como
entradas
RC2/CCP1 como
salida del modo
PWM
Cargar en PR2 el
valor para obtener
2KHz de ciclo PWM
Configurar el
mdulo CCP1 en
modo PWM
Configurar el TMR2
con el valor del
pre-escaler
calculado
Asignar el valor en
puerto A al ciclo de
servicio del PWM
PRCTICA 5 - 2
inicio
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
p=16F876, f=INHX8M
"P16F876.INC"
;Tipo de procesador
;Definiciones de registros internos
org
goto
0x00
inicio
org
0x05
bsf
movlw
movwf
movlw
movwf
clrf
STATUS,RP0
b'00000110'
ADCON1
b'00111111'
TRISA
TRISC
;Selecciona el banco 1.
;Configurar puerto A
;como E/S digitales.
;Configurar RA5:RA0
;como entradas.
;Configurar la patilla RC2/CCP1 como salida
;del modo PWM.
d'156'
PR2
STATUS,RP0
TMR2
movlw b'00001100'
movwf CCP1CON
;CCP1CON =
; bits 7:6
; bits 5:4
; bits 3:0
00001100
(no implementados)
CCP1X:CCP1Y=00
CCP1M3:CCP1M0=11xx
PRCTICA 5 - 3
movlw b'00000110'
movwf T2CON
;T2CON = 00000110
; bit
7 (no implementados)
; bits 6:3 TOUTPS3:TOUTPS0=0000
; bit
2 TMR2ON=1
; bits 1:0 T2CKPS1:T2CKPS0=1x
leer_ciclo
movf
andlw
movwf
goto
PORTA,W
b'00111111'
CCPR1L
leer_ciclo
end
PRCTICA 5 - 4
Prctica 6
interrupcin
RC7/RX entrada
RC6/TX salida
Borrar el flag de
indicacin de
interrupcin por
recepcin RCIF
Configurar los
registros RCSTA y
TXSTA
Guardar el dato
recibido
Configurar la
velocidad de trabajo
del procesador
DATO<A ?
(en la codificacin
ASCII)
NO
Habilitar
interrupciones de
recepcin,
perifricos y global
nop
SI
NO
DATO>Z ?
SI
(en la codificacin
ASCII)
Sumar 32 a
DATO (letra
minscula) y
enviar
Fin de
transmisin?
Enviar el mensaje
Error
NO
Fin de
transmisin?
SI
NO
SI
Retorno
AR
B
RO
PRCTICA 6 M
-P
2
CO
SIN
DATO
STATUS_TEMP
W_TEMP
inicio
p=16F876, f=INHX8M
"P16F876.INC"
equ
equ
equ
0x20
0x21
0x22
org
goto
org
goto
0x00
inicio
0x04
inter
clrf
bsf
movlw
movwf
PORTC
STATUS,RP0
b'10111111'
TRISC
movlw b'00100100'
movwf TXSTA
;Tipo de procesador.
;Definiciones de registros internos.
;TXSTA = 00100100
;
;
;
;
;
;
;
;
;
;
;
;
bit 7 CSRC=0
;
;
;
;
;
;
;
;
;
;
;
;
bit 6
bit 5
bit
bit
bit
bit
4
3
2
1
bit 0
La velocidad son 9600 baudios, K=16 ya que hemos seleccionado modo de alta velocidad
(BRGH=1), fosc son 20MHz y X es el valor a cargar en el registro SPRG, que vendr
determinado por:
(fosc / velocidad) - K
X = -----------------------K
Sustituyendo los valores obtenemos X=129,2. Cargando el valor 129 en el registro
obtenemos una velocidad de aproximadamente 9615 baudios.
movlw .129
movwf SPBRG
bsf
bcf
PIE1,RCIE
STATUS,RP0
AR
B
RO
PRCTICA 6 M
-P
3
CO
SIN
movlw b'10010000'
movwf RCSTA
;RCSTA = 10010000
;
;
;
;
;
;
;
;
;
;
bit 7 SPEN=1
bit 6 RX9=0
bit
bit
bit
bit
bit
bit
5
4
3
2
1
0
SREN=0
CREN=1
ADDEN=0
FERR=0
OERR=0
RX9D=0
uno
bsf
bsf
INTCON,PEIE
INTCON,GIE
goto
uno
;Colgamos al procesador.
error_
bcf
INTCON,T0IF
btfss PIR1,RCIF
retfie
;Comprobar si la interrupcin ha
;sido provocada por el USART.
;Si no es as, retorna.
movf
movwf
movfw
subwf
btfss
goto
movlw
subwf
btfsc
goto
goto
RCREG,W
DATO
'A'
DATO,W
STATUS,C
error_
'Z'
DATO,W
STATUS,C
error_
responder
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
'E'
TXREG
'r'
TXREG
'r'
TXREG
'o'
TXREG
'r'
TXREG
bsf
STATUS,RP0
AR
B
RO
PRCTICA 6 M
-P
4
CO
SIN
dos
btfss TXSTA,TRMT
goto
dos
tres
movlw
addwf
movwf
bsf
btfss
goto
.32
DATO,W
TXREG
STATUS,RP0
TXSTA,TRMT
tres
AR
B
RO
PRCTICA 6 M
-P
5
CO
SIN