Documente Academic
Documente Profesional
Documente Cultură
COMPLETA
ASSEMBLER PARA
MICROCONTROLADORES
PIC
El Registro PCL
Existe un registro, llamado PCL, ubicado en la posicin 0x02 en el
banco de memoria, tiene mucho que ver con el flujo del programa,
puesto que le asigna un nmero a cada lnea de cdigo. Todo empieza
con la primera instruccin, esta tiene una posicin indicada con un
nmero en el registro PCL, cuando accede a esa posicin, se lee la
instruccin, se decodifica, y luego se ejecuta, una vez echo esto, el reloj
del micro incrementa al contador de programa (PCL) en un unidad, esto
hace que el PCL apunte a la segunda instruccin, ahora se lee esta
segunda instruccin, se decodifica y tambin se ejecuta. Nuevamente,
el reloj del sistema incrementa el PCL para que apunte a la tercera
instruccin, la decodifique y la ejecute. Este proceso se repite hasta que
termina el programa (es decir, cuando encuentra un END).
DIRECCIONAMIENTO INDIRECTO
Estos 2 registros, y en algunos
DIRECCIONAMIENTO INDIRECTO
Registro 04h (FSR)
Es el Registro selector de registros, es un puntero en realidad,
DIRECCIONAMIENTO INDIRECTO
Registro 00h (INDF)
Es el registro para direccionamiento indirecto de datos, a pesar
DIRECCIONAMIENTO INDIRECTO
Ejemplo de direccionamiento indirecto
El Registro 05 contiene el valor 10h
El Registro 06 contiene el valor 0Ah
Se Carga el valor 05 en el registro FSR (FSR = 05)
DIRECCIONAMIENTO INDIRECTO
REFER:
http://perso.wanadoo.es/pictob/micropic16f84.htm#direccionamiento_indirecto
EULER DEZA FIGUEROA
euler_df28@hotmail.com
DIRECCIONAMIENTO INDIRECTO
Veamos otro ejemplo pero en cdigo. Lo que hace
DIRECCIONAMIENTO INDIRECTO
En la programacin de los microcontroladores PIC la mayora de las
designs.com.ar/]
EULER DEZA FIGUEROA
Euler_df28@hotmail.com
DIRECCIONAMIENTO INDIRECTO
Directo vs indirecto
El registro EEADR puede direcconar como mximo 256 bytes de los cuales
slo los 64 primeros estn disponibles, con lo que los dos bits de mayor peso han
de tener el valor de '0'
EULER DEZA FIGUEROA
euler_df28@hotmail.com
55h
EECON2 ; Escribe 55h en EECON2
AAH
EECON2 ; Escribe AAh en EECON2
EECON1,WR ; Pone WR a 1 para comenzar la escritura
Adems, el bit WREN del registro EECON1 debe estar puesto a '1' para habilitar la
operacin de escritura.
EULER DEZA FIGUEROA
euler_df28@hotmail.com
Este registro no est implementado fsicamente, por lo cual no se puede leer. Tan
slo sirve para un proceso de proteccin de escritura que consiste en copiar en l
unos datos especficos, con el fin de evitar que un programa por error pueda
programar la EEPROM, manipulando simplemente los bits del EECON1.
Uso de la EEPROM
A continuacin veremos a fondo cuales son los procesos ms
usuales de escritura y de lectura en la EEPROM.
Lectura de la memoria EEPROM.
EEADR.
Poner a 1 el bit RD del registro EECON, para habilitar la
lectura.
Lectura del dato ledo y espera a que termine la operacin.
El dato est disponible en el registro EEDATA.
Uso de la EEPROM
Veamos dos ejemplos prctico. El primero (LECTURA1) presupone
que el dato en EEDATA estar disponible rpidamente, y el
segundo (LECTURA2) espera hasta confirmarlo
LECTURA1
BCF
MOVLW
MOVWF
BSF
BSF
BCF
MOVF
STATUS,RP0
MEM1
EEADR
STATUS,RP0
EECON1,RD
STATUS,RP0
EEDATA,W
; Selecciona banco 0
; Direccin a leer de
; la EEPROM
; Selecciona banco 1
; Activar lectura
; Selecciona banco 0
; W se carga con el valor
; ledo en eeprom.
Uso de la EEPROM
(LECTURA2) espera hasta confirmarlo
LECTURA2
ESPERA
BCF
STATUS,RP0
MOVLW MEM1
MOVWF EEADR
BSF
STATUS,RP0
BSF
EECON1,RD
BTFSC
EECON1,RD
GOTO
ESPERA
BCF
STATUS,RP0
MOVF
EEDATA,W
; Selecciona banco 0
; Direccin a leer de
; la EEPROM
; Selecciona banco 1
; Activar lectura
; Espera final de lectura
; a que baje la bandera
; Selecciona banco 0
; W se carga con el valor
; ledo en eeprom
Uso de la EEPROM
Escritura de la memoria EEPROM.
El proceso de escritura es an ms complejo ya que deberemos hacer
todo lo anterior y adems escribir un cdigo especial de proteccin.
Estos pasos los vemos en las siguientes lneas:
Poner a 1 (si no lo estaba) el bit WREN del registro EECON1 para
habilitar la operacin de escritura.
Cargar en EEADR la direccin de la posicin a escribir.
Cargar en el registro EEDATA el valor a grabar.
Ejecutar la siguiente secuencia que inicia la escritura de cada byte y
adems sirve de proteccin frente a errores eventuales. Esta secuencia
siempre es la misma y ha de ejecutarse siempre.
MOVLW
55H
MOVWF
EECON2
; Escribe 55h en EECON2
MOVLF
AAH
MOVWF
EECON2
; Escribe AAh en EECON2
BSF
EECON1,WR
; Coloca a 1 el bit de escritura
EULER DEZA FIGUEROA
euler_df28@hotmail.com
Uso de la EEPROM
Escritura de la memoria EEPROM.
Esta ltima instruccin inicia el proceso de escritura. Cuando se
Uso de la EEPROM
Veamos un ejemplo de escritura tpico que no utiliza
interrupciones:
ESCRITURA
ESPERA
Uso de la EEPROM
La escritura de cada byte no se iniciar si la secuencia de introducir 55 y
AA en EECON2, y activar el bit WR no se sigue exactamente.
Considerndo lo anterior, es recomendable que durante la secuencia de
inicio de escritura se deshabiliten las interrupciones, con el fin de evitar
errores no deseados y habilitarlas posteriormente si van a ser utilizadas.
Adicionalmente, el bit WREN de EECON1 debe ser activado para habilitar
la escritura. Para evitar errores, tambin es recomendable que el bit WREN
est desactivado durante todo el programa excepto en el momento de la
escritura. Debemos tener en cuenta que este bit no se pone a cero
automticamente mediante hardware. Una vez iniciado el ciclo de escritura,
si ponemos a cero WREN, esto no afectar a el ciclo de escritura iniciado.
En este caso el bit WR estar inhibido y no se podr poner a uno
. Despus del ciclo, el bit WR es puesto a cero por hardware y el EEIF es
puesto a uno (si EEIE lo est). Si EEIE, est habilitado, EEIF debe ser
puesto a cero por software.
EULER DEZA FIGUEROA
euler_df28@hotmail.com
Uso de la EEPROM
Veamos un ejemplo de escritura tpico que utiliza interrupciones:
ESCRITURA
BCF
STATUS,RP0
; Selecciona el banco 0
; Establecer EEADR y EEDATA
MOVLW MEN1
MOVWF EEADR
; Escribe la direccin en EEADR
MOVLW DATO1
MOVWF EEDATA
; Se escribe el dato en EEDATA
BSF
STATUS,RP0
; Selecciona el banco 1
BSF
EECON1,WREN
; Permiso de escritura activado
BCF
INTCON, GIE
; Deshabilita interrupciones.
;Comienzo de la secuencia de escritura
MOVLW 0x55
MOVWF EECON2
; Se escribe el dato 55 h en EECON2
MOVLW 0xAA
MOVWF EECON2
; Se escribe AA h en EECON2
BSF
EECON1,WR
; Comienza la escritura
BSF
INTCON,GIE
; Habilita las interrupciones.
BCF
EECON1,WREN
; Permiso de escritura desactivado
BCF
STATUS,R0
; Selecciona el banco 0
Uso de la EEPROM
Verificacin de la escritura
Dependiendo de la aplicacin, la experiencia en
programacin dice que los datos escritos en la EEPROM
deben ser verificados comparndolos con el dato que se
acaba de escribir. Esto debe usarse en aplicaciones en
las que un bit de la EEPROM sufre ciclos de
lectura/escritura hasta rozar el lmite de las
especificaciones. Generalmente el fallo de escritura en
un bit de la EEPROM ser un bit que se escribe como un
0 lgico pero devuelve un 1 debido a la prdida de ese
bit. La siguiente porcin de cdigo es un ejemplo de
verificacin del dato escrito:
Uso de la EEPROM
Veamos un ejemplo de escritura tpico que utiliza interrupciones:
BCF
STATUS,RP0
; Nos situamos en el banco 0
MOVF EEDATA,W
; Debemos estar en el banco 0
BSF
STATUS,RP0
; Cambiamos al banco 1
BSF
EECON1,RD
; Leemos el dato que se guarda en
BCF
STATUS,RP0
; EEDATA, y cambiamos a banco 0
; A continuacin se comprueba que los datos en W en EEDATA son los mismos
SUBWF EEDATA,W
; Restamos ambos valores
BTFSS STATUS,Z
; Si la operacin es cero, son iguales
GOTO ERR_ESCRIT
; Si no son iguales, saltamos a ERR_ESCRIT
.....
; Si son iguales, seguimos con el programa.
Rutinas EEPROM
A continuacin se presentan dos rutinas para escribir y leer en la EEPROM:
;**************************************************************
; EEPROM_W:
; Graba un byte en la EEPROM de datos. La direccin ser la contenida
; en EEADR y el dato se le supone previamente introducido en EEDATA
;
EEPROM_W
bsf
STATUS,RP0
;Selecciona banco 1
bsf
EECON1,WREN
;Permiso de escritura
movlw
b'01010101'
;Secuencia de escritura
movwf
EECON2
movlw
b'10101010'
movwf
EECON2
bsf
EECON1,WR
;Orden de escritura
bcf
EECON1,WREN
;Desconecta permiso de escritura
ESPERA
btfss
EECON1,EEIF
;Comprobar bandera de fin de escritura
goto
ESPERA
bcf
EECON1,EEIF
;Reponer flag de fin de escritura
bcf
STATUS,RP0
;Seleccin banco 0
return
;**************************************************************
Rutinas EEPROM
;**************************************************************
; EEPROM_R:
; Lee un byte de la EEPROM. Se supone al registro EEADR cargado
; con la direccin a leer. En EEDATA aparecer el dato ledo.
;
EEPROM_R
bsf
STATUS,RP0
;Seleccin de banco 1
bsf
EECON1,RD
;Orden de lectura
bcf
STATUS,RP0
;Seleccin de banco 0
return
;**************************************************************
Referencia:
http://es.slideshare.net/daveteslandaz/
microcontroladores-asm
TMR0
INTCON
INTCON
INTCON
INTCON
INTCON
INTCON
TIMER0
El bloque funcional TIMER0/WATCHDOG es un contador (registro) de
8 bits, incrementado por hardware y programable. La cuenta mxima
es de 255(el incremento es constante e independiente).
CONTADOR: Cuenta los eventos externos(a travs del pin
RA4/TOCK1)
TEMPORIZADOR: Cuenta los pulsos internos del reloj
Se puede insertar un prescaler, es decir, un divisor de frecuencia
programable que puede dividir por 2, 4, 8, 16, 32, 64, 128 o 256.
La frecuencia de reloj (fosc/4). Posteriormente, con el uso del
prescaler se puede dividir la frecuencia.
El bloque del TIMER0 puede funcionar como WATCHDOG, lo que
permite que durante el funcionamiento normal del microcontrolador,
un desbordamiento (o timeout) del Watchdog provoque un reset
(Watchdog Timer Reset). Para evitar el desbordamiento se debe, cada
cierto tiempo y antes de que llegue el limite, ejecutar una instruccin
CLRWDT que borra el Watchdog y que hace comenzar un nuevo
conteo desde cero
EULER DEZFIGUEROA
Euler_df28@hotmail.com
TIMER0
Se basa en un oscilador RC interno, independiente del oscilador
del microcontrolador y que no requiere ningn componente
externo. El Wachdog cuenta incluso si el reloj conectado a
OSC1/CLK1 y/o OSC2/CLK2 esta parado, por ejemplo por la
ejecucion de una instrucicion SLEEP o por un defecto del cristal
oscilador
Los regisros implicados en la configuracion del TIMER0/WDT son
los siguientes:
OPTION_REG: configura el hardware del TIMER0/WDT.
INTCON: permite trabajar con la interrupcion el TIMER0/WDT
TRISA: habilita la patilla RA4.
EULER DEZFIGUEROA
Euler_df28@hotmail.com
1= RA4/TOCK1
0=Reloj interno
TOSE: Tipo de flanco en el TOCK1/RA4:
1= Flanco descendente
0=Flanco ascendente
PSA: Asignacion del divisor de frecuencias:
1= WDT
0=TMR0
ecuacin:
ecuacion:
TCM = 4/FOSC
EULER DEZA FIGUEROA
Euler_df28@hotmail.com
Bibliografa
"MICROCONTROLADOR PIC16F84. DESARROLLO DE