Professional Documents
Culture Documents
PIC
EL OBJETIVO DE ESTE CURSO ES APRENDER A
PROGRAMAR EN LENGUAJE ASSEMBLER
#DEFINE
#define<nombre> [<valor a reemplazar>]
Explicación: declara una cadena de texto como subtítulo de otra.
END
End
Explicación: indica fin de programa
ETIQUETAS A DIRECCIONES DE PROGRAMA:
Explicación: son muy útiles para usar con instrucciones CALL
(llamada a subrutina) ó GOTO (salto)
PIC Prof. Nelson Añón 14
Introducción a la Programación
en Lenguaje Assembler
EQU
portA equ 0x05
Explicación: define una constante de ensamble
INCLUDE
Include<PIC16F628A.inc>
Explicación: incluye en el programa un archivo con código
fuente
ORG
org 0x00
Explicación: ensambla a partir de la dirección especificada
PIC Prof. Nelson Añón 15
Introducción a la Programación
en Lenguaje Assembler
EQU (Equate – Equivalente):
La directiva EQU permite al programador igualar nombres a
datos ó direcciones. Los nombres utilizados se refieren
generalmente a direcciones de dispositivos, datos numéricos,
direcciones de comienzo, direcciones fijas, posiciones de byte.
ORG (Origin – Origen):
La directiva Origen permite al programador especificar la
posición de memoria donde programas, subrutinas ó datos
residirán. Los programas y los datos pueden estar alojados en
diferentes áreas de memoria dependiendo de la configuración
de memoria, rutinas de comienzo, subrutinas de interrupción y
otros programas deben comenzar en locaciones de memoria
fijados por la estructura del microcontrolador.
PIC Prof. Nelson Añón 16
Introducción a la Programación
en Lenguaje Assembler
La directiva ORG hace al compilador colocar el código que le
sigue en una nueva dirección de memoria (la salida del
compilador no sólo coloca los códigos de operación, sino
también las direcciones de cada instrucción y datos del
programa).
Usualmente se la utiliza para: reset, programa de servicio de
interrupción. Por ej.:
Reset org 0x00
goto inicio
org 0x04; vector de interrupción
goto interrupción
org 0x05
Inicio movf portA,0; aquí comienza el programa (lee portA)
PIC Prof. Nelson Añón 17
Introducción a la Programación
en Lenguaje Assembler
Ejemplo:
Vamos a definir a la variable AZUL en la posición de memoria
expresada en número hexadecimal 20.
1ª Col. 2ª Col. 3ª Col. 4ª Col.
AZUL EQU 0x20 ;definí a la variable AZUL
en la posición 20
MOVF LECTURA
movf f,d
instrucción operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) d=0 W M(f)=posición de memoria
d=1 M(f)
flagZ=1 M(f)=0 Cód. OP:001000dfff ffff
movf d=0
d=1
PIC Prof. Nelson Añón 27
Instrucciones para
Ensamblar Programas
Inicio
movwf 0x30
W M(0x30)
PIC
OK Prof. Nelson Añón 34
Instrucciones para
Ensamblar Programas
4. Project Edit Project Add Node Ej001.asm Aceptar
Project Files
Ej001 [.hex] OK
Ej001 [.asm]
Instrucción Suma:
addlw k flags C, DC, Z Resultado=0
0=< k =< 255 afectados Z=1
w+k w Resultado>255
C=1
PIC Prof. Nelson Añón 39
Instrucción de Suma
Uso del C y DC:
8 7 4 3 0
addwf f,d
instrucción operandos
d={0,1} 0=< f=< 127 M=memoria
W +M(f) W d=0 M(f)=posición de memoria
W +M(f) M(f) d=1
flags afectados C, DC y Z
List p=16F628A
Reset ORG 0x00
movf 0x2C,0
addwf 0x2D,0
movwf 0x2E
end
subwf f,d
instrucción operandos
d={0,1} 0=< f=< 127 M=memoria
M(f) - W W d=0 M(f)=posición de memoria
M(f) - W M(f) d=1
flags afectados C, DC y Z
sublw K
0=<K=< 255
K-W W flags afectados C, DC y Z
C=1 Resultado >= 0 (+)
C=0 Resultado < 0 (-)
Cód. OP:11 110xkkkk kkkk
23 22 21 20
0 0 0 0 0
1 0 0 0 1
2 0 0 1 0
3 0 0 1 1
4 0 1 0 0
5 0 1 0 1
6 0 1 1 0
7 0 1 1 1
8 1 0 0 0
9 1 0 0 1
PIC Prof. Nelson Añón 48
Binario Codificado en Decimal (BCD)
Formato BDC
BCD 23 22 21 20 23 2 2 2 1 2 0
29 0 0 1 0 1 0 0 1
El principio en que se basa el BCD es sencillo.
Para poder codificar los dígitos de 0 a 9 se usan 4 bits (con 3,
sólo se habría podido codificar 8 dígitos) que en principio
servirían para codificar hasta 16 dígitos.
El dígito “1” por ejemplo se representa mediante el código 0001
y el “9” mediante el código 1001.
Desafortunadamente con 4 bits se alcanzan 16 combinaciones
distintas, por lo que las 1010 a 1111 no tiene aplicación, y por lo
tanto no se utilizan, es decir son ilegales en un código BCD.
List p=16F628A
Reset ORG 0x00
movf 0x0A,0
subwf 0x1A,0
movwf 0x2A
end
BIT=0 salida
BIT=1 entrada
PIC Prof. Nelson Añón 56
PIC Prof. Nelson Añón 57
ORGANIZACIÓN DE LA MEMORIA
bsf f,b
set (pone a 1) el bit b de la posición f de la memoria
bcf f,b
reset (pone a 0) el bit b de la posición f de la memoria
Status Register:
El Registro de Estado, mostrado en el registro 3-1, contiene: el
estado aritmético de la ALU, el estado reset y los bits que se
seleccionan para ingresar al banco de la memoria de datos.
El registro de Estado puede ser destino para cualquier
instrucción, y de cualquier otro registro. Si el registro de Estado
es destino de una instrucción, ésta afecta el Z (Cero) y los bits de
medio acarreo y acarreo (DC ó C), entonces él escribe en estos
tres bits que están deshabilitados. Los bits son uno (set), o Cero
(cleared) de acuerdo a la lógica del dispositivo.Además los bits
TO y PD no se pueden escribir. Por consiguiente, el resultado de
una instrucción con el registro de Estado como destino puede ser
diferente al intentado.
PIC Prof. Nelson Añón 62
REGISTRO DE STATUS
REGISTRO de Estado:
Por ejemplo, CLRF STATUS borrara los tres bits altos
y pondrá a uno el bit de Cero (Z). Esto lo vemos como
“000uu1uu” (donde u = unchanged).
Se recomienda el uso solamente de BCF, BSF,
SWAPF and MOVWF, instrucciones usadas para
alterar el Registro de Estado porque estas
instrucciones no afectan ningún bit de estado. Para
otras instrucciones, que no afecten ningún bits de
estado, ver el set de instrucciones.
Programar todas las líneas del PORTA como entrada y todas las
líneas del PORTB como salida
Inicio
bcf 0x03,6
Selecciono Banco1
bcf 0x03,5
movlw 0xFF
0xFF TRISA movwf 0x85
movlw 0x00
0x00 TRISB
movwf 0x86
Instrucción Inicio
GOTO
Programar PORTA
Salto incondicional a
y PORTB
la dirección que
vaya precedida
como (etiqueta)
GOTO
Leer PORTA
GOTO K RUTINA
0<= K <=2047
Pepe btfss portA, 1 Escribir en
PORTB
btfcs portA, 1
GOTO Pepe
PIC Prof. Nelson Añón 70
Aplicación 1: Diagrama de Flujo
clrf
0x00 M(f) borra cualquier posición de memoria
M(f)=posición de memoria
flags afectados Z=1
Z=1 si el resultado es = 0
Z=0 si el resultado es = 0
Cód. OP:00 0001 1fff ffff
INDICE
clrf M (indice)
8 7 0
M (0x00) W 0 W
0 x 1E M (0x00) 1E 0x 20
Poner a Start
0x00 las 0 x 20 FSR apunto con FSR
posiciones
0x20 a
M (0x00) INDF borrado 0 x 20
0x2F del
banco 0
FSR + 1 FSR
No bit 4 de
FSR=1
Si
End
PIC Prof. Nelson Añón 90
Direccionamiento Indirecto
List p=16F628A
INDF EQU 0x00
STATUS EQU 0x03
FSR EQU 0x04
RESET ORG 0x00
bcf Status,7; 0 IRP
movlw 0 x 20;
movwf FSR; FSR apunta a posición 0x20
NEXT clrf INDF; borra posición de memoria
incf FSR; FSR + 1 FSR,incremento puntero
btfss FSR,4; todo borrado
goto NEXT; no borra la siguiente
end ; si continúa el programa
Instrucciones para
Ensamblar Programas
incfsz f,d incremento y salto
M(f) + 1 d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Cód. OP:00 1111 dfff ffff
Andlw K
0=<K=< 255
W·K W
flags afectados Z
Realiza función AND, operación bit a bit
K constante operacional
Cód. OP:11 1001 kkkk kkkk
Andwf f,d
W·M(f) d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Realiza función AND, operación bit a bit
Cód. OP:00 0101 dfff ffff
IORlw K
0=<K=< 255
W+K W
flags afectados Z
Realiza función OR, operación bit a bit
K constante operacional
Cód. OP:11 1000 kkkk kkkk
IORwf f,d
W+M(f) d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Realiza función OR, operación bit a bit
Cód. OP:00 0100 dfff ffff
XORlw K
0=<K=< 255
W + K W
flags afectados Z
Realiza función OR exclusiva, operación bit a bit
K constante operacional
Cód. OP:11 1010 kkkk kkkk
XORwf f,d
W + M(f) d={0,1} d=0 W
d=1 M(f)
flags afectados Z
Realiza función OR exclusiva, operación bit a bit
Cód. OP:00 0110 dfff ffff
Nombre de
la Subrutina
1 MHz
CLK = 1 us
A=2
B = 248
C = 248
DECRE C
NO
C=0
SI
A B 1
1
A B
DECRE B
NO
B=0
SI
DECRE A
NO
A=0
SI
end
List p=16F628A ; demora 0,5 seg
VAR1 EQU 0x21
VAR2 EQU 0x22
VAR3 EQU 0x23
RESET ORG 0x00
INICIO movlw 02 h
movwf VAR1
movlw 248 h
movwf VAR2
movlw 248 h
movwf VAR3
DECO decfsz VAR3,1 ; (VAR1,1)
goto deco
DOS decfsz VAR2,1
goto dos
UNO decfsz VAR1,1 ; (VAR3,1)
goto inicio
nop
end
SUBRUTINAS DE TEMPORIZACIÓN
REGISTRO OPCION:
OPTION Register es un registro de lectura y
escritura, el cual contiene varios bits de control para
configurar el TMRO/WDT prescaler, la interrupción
externa RBO/INT, el TMRO y las resistencias de
pull-up del puerto B.
MODOS DE FUNCIONAMIENTO:
1) CONTADOR DE SUCESO: El contador TMR0 cuenta los
impulsos que se aplican al Pin RA4/TOCK1/CMP2.
Al llegar al valor FF se desborda el contador y con el siguiente
impulso pasa a 00, activando un flag (y provocando una
interrupción ,si están habilitados).
Este flag debe ser luego puesto a 0 por el programa.
2) TIMER: El TMRO se incrementa con cada ciclo de instrucción
(Frec.oscil/4), hasta que dé overflod, pasando de FF a 00,
activando un flags (provocando una interrupción si están
habilitadas). Si el registro TMR0 está escrito, el incremento es
inhibido durante los 2 próximos ciclos de instrucción.
PIC Prof. Nelson Añón 149
TEMPORIZADOR TMR0
Tiempo = Frec.oscil/4
Timer
Cristal
4 MHz T = 250 ns
Ciclo instrucción T x 4 = 1 us
1 MHz T = 1 us
Ciclo instrucción T x 4 = 4 us T (período de instrucción)
REGISTRO TMR0:
El dispositivo 16F628A dispone de un TMR0.
El TMR0 es un contador ascendente de 8 bits,
que puede funcionar como reloj interno ó externo
y ser sensible al flanco ascendente ó
descendente. Se le puede asignar el divisor de
frecuencia. Una novedad importante en el TMR0
es la posibilidad de generar una interrupción
cuando se desborda.
0 x 01 TMR0 0 x 81 OPTION
0 x 0B INTCON 0 x 8B INTCON
REGISTRO INTCON:
El INTCON es un registro de lectura y escritura, el cual contiene
habilitadas varias banderas de bits, todas fuentes de interrupción,
excepto el módulo de comparación.
Mire la Sección 3.2.2.4 “PIE1 Register” y la Sección 3.2.2.5 “PIR1
Register” para una descripción de la habilitación del comparador y
sus bits.
3.2.2.4 “PIE1 Register”: Este registro contiene bits que habilitan
interrupciones
3.2.2.5 “PIR1 Register”: Este registro contiene bits de interrupción.
Nota: Los bits de interrupción se ponen a uno “1” cuando ocurre
una condición de interrupción, guardándose el estado del
correspondiente bit de habilitación ó habilitación global bit, GIE
(INTCON<7>)
PIC Prof. Nelson Añón 158
TEMPORIZADOR TMR0
START
INICIALIZACION
D ‘ 158’............TMR0
0.................TOIF
NO
TOIF = 1
SI
END
500 us
RB0
START
INICIALIZACION
D ‘ 133’............TMR0
0.................TOIF
NO
TOIF = 1
SI
END
START
0 .............CONTADOR
TIMER
CONTADOR+1...CONTADOR
NO CONTAD
FINAL
SI
VOLVER
Causas de Interrupción:
EXTERNOS: un pulso de una línea I/0 RB0/INT, cambio
de estado de los pines RB4 a RB7.
INTERNO: desborde de un contador TMR0.
Modelo de Programa
Reset ORG 0000
goto inicio
ORG 0004
goto interrup
Inicio 0005
----------------------- Programa
----------------------- Principal
-----------------------
PIC Prof. Nelson Añón 188
INTERRUPCIONES
Ejercicio:
Hacer un oscilador de 1 KHz con un PIC 16F628A en la
salida RB0, simultáneamente, leer la puerta B y copiarla
a la posición a M (0x20)
Inicio Interrupción
PROGRAMAR TIMER
GOTO PARA 500 US
RUTINA
Leer PORTB
Volver
W----M(0x20)
REGISTRO TMR1:
El TMR1 es un temporizador/contador ascendente
de 16 bits, por lo que está implementado mediante
dos registros específicos TMR1H y TMR1L, que
contienen el valor del conteo en cada momento.
Estos registros pueden leerse y escribirse. El valor
del registro (TMR1H:TMR1L) evoluciona desde
0000h hasta FFFFh, en cuyo instante activa <<1>>
la bandera TMR1IF (PIR1<0>) y vuelve a 0000h. Se
puede provocar una petición de interrupción
mediante la programación del bit TMR1IE
(PIE1<0>).
PIC Prof. Nelson Añón 197
ORGANIZACIÓN DE LA MEMORIA
REGISTRO TMR1:
El funcionamiento de TMR1 depende de la
programación del registro T1CON (10h). TMR1
puede funcionar como temporizador y como
contador síncrono ó asíncrono. El modo de
funcionamiento viene determinado por el bit 1,
TMR1CS (T1CON<1>). En modo temporizador,
TMR1 se incrementa con cada ciclo de instrucción
(Fosc/4), mientras en modo contador, se incrementa
con cada flanco de subida de la señal del reloj
externa, que se aplica a los pines RB6 y RB7, ó por
impulsos aplicados al pin RB6.
PIC Prof. Nelson Añón 198
ORGANIZACIÓN DE LA MEMORIA
REGISTRO TMR1:
Como fuente de los impulsos de reloj existen tres
alternativas:
1. Generación interna (Fosc/4).
2. Generación mediante un oscilador externo
controlado por cristal que se conecta a los
pines RB6/T1OSO/T1CKI y RB7/T1OSI/CCP2. El
oscilador se activa poniendo a 1 el bit
T1OSCEN del registro T1CON. El bit TMR1CS
del registro T1CON selecciona entre reloj
interno ó externo. En los PIC16F62X los pines
son RB6 y RB7.
PIC Prof. Nelson Añón 199
ORGANIZACIÓN DE LA MEMORIA
REGISTRO TMR1:
3. Trabaja en modo contador de eventos cuando
los impulsos externos a contar se aplican a la
patita RB6/T1OSO/T1CKI. En los PIC16F62X el
pin es RB6.
REGISTRO TMR1:
El funcionamiento de TMR1 depende de la
programación del registro T1CON (10h), Registro 7-1.
El bit 0 TMR1ON gobierna su funcionamiento,
desactivando TMR1 cuando vale 0. El bit 1 TMR1CS
elige la fuente de pulsos; cuando su valor es 1, éstos
proceden de una señal externa. En este caso, si el bit
3 T1OSCEN vale 1, actúan los pines RB6 y RB7 como
entradas del reloj externo. Es posible colocar entre
estos pines un cristal de cuarzo de hasta 200 KHz
que permite que el oscilador siga en funcionamiento
incluso en modo de bajo consumo SLEEP. Si el bit
T1OSCEN vale 0, los pulsos se introducirán por el
PIC pin RB6. Prof. Nelson Añón 201
PIC Prof. Nelson Añón 202
PIC Prof. Nelson Añón 203
PIC Prof. Nelson Añón 204
PIC Prof. Nelson Añón 205
PIC Prof. Nelson Añón 206
PIC Prof. Nelson Añón 207
PIC Prof. Nelson Añón 208
PIC Prof. Nelson Añón 209
PIC Prof. Nelson Añón 210
PIC Prof. Nelson Añón 211
PIC Prof. Nelson Añón 212
PIC Prof. Nelson Añón 213
PIC Prof. Nelson Añón 214
PIC Prof. Nelson Añón 215
TITULO: Timer de 10 segundos con TMR1
PIC16F628A - 4MHz intRC - MCLR
MODIFICACIONES
CONT_POSTSC_SEG EQU 0X20 ; DEFINE DIRECCIÓN DE MEMORIA RAM
CONT_TIME_01 EQU 0X21 ; DEFINE DIRECCIÓN DE MEMORIA RAM
W_TEMP EQU 0X30
STATUS_TEMP EQU 0X31
#DEFINE PA0 PORTA,2 ; DEFINE ENTRADA DEL PULSADOR
#DEFINE PA1 PORTA,3 ; DEFINE ENTRADA DEL PULSADOR
#DEFINE PB0 PORTB,7 ; DEFINE SALIDA DEL LED A ENCENDER
#DEFINE PB1 PORTB,6 ; DEFINE SALIDA DEL LED A ENCENDER
LIST p=16F628A ; PROCESADOR UTILIZADO
INCLUDE "P16F628A.INC“ ; LIBRERIA DE DIRECCIONES CORRESPONDIENTES AL PIC
ORG 0x0000 ;VECTOR RESET (DIR. DE LA MEMORIA FLASH)
GOTO INICIALIZA_MC ; SALTA A LA ETIQUETA "INICIALIZA_MC"
ORG 0x0004 ; VECTOR INTERRUPCION (DIR. DE LA MEMORIA FLASH)
GOTO PUSH ; SALTA A LA ETIQUETA "PUSH" (INTERRUPCIÓN)
INICIALIZA_MC MOVLW B'00000111' ; CONFIGURA PINES DEL COMP. ANÁLOGO COMO I/O DIG.
MOVWF CMCON ; EN EL REGISTRO CMCON
BSF STATUS,RP0 ; CAMBIO AL BANCO 1
MOVLW B'11111111' ; ESCRIBE ESTE VALOR EN EL ACUMULADOR
MOVWF TRISA ; MUEVE ESTE VALOR AL REGISTRO TRISA (ENT 1 - SAL 0)
MOVLW B'00111111' ; ESCRIBE ESTE VALOR EN EL ACUMULADOR
MOVWF TRISB ; MUEVE ESTE VALOR AL REGISTRO TRISB (ENT 1 - SAL 0)
BCF STATUS,RP0 ; CAMBIO AL BANCO 0
CLRF PORTB ; LIMPIA EL REGITRO PORTB
PROGRAMA PRINCIPAL
PROG_PRINCIPAL BTFSC PA0
BSF PB0
GOTO PROG_PRINCIPAL ; SALTA A LA ETIQUETA "LOOP_SINFIN"
RUTINA DE SERVICIO DE INTERRUPCIÓN ;
PUSH MOVWF W_TEMP ; GUARDA EL VALOR DE W EN W_TEMP
SWAPF STATUS,W ; (RUTINA DE SERVICIO DE INTERRUPCIÓN)
MOVWF STATUS_TEMP ; GUARDA EL VALOR DE STATUS EN STATUS_TEMP
RSI DECFSZ CONT_POSTSC_SEG ,F ; RESTA 1 AL REGISTRO Y SALTA CUANDO ES CERO
GOTO FIN_RSI
MOVLW D'20' ; VALOR INICIAL DEL REGISTRO "CONT_POSTSCALA"
MOVWF CONT_POSTSC_SEG ;
DECFSZ CONT_TIME_01,F ; RESTA 1 AL REGISTRO Y SALTA CUANDO ES CERO
GOTO FIN_RSI
MOVLW D'10' ; VALOR INICIAL DEL REGISTRO "CONT_POSTSCALA"
MOVWF CONT_TIME_01 ;
BCF PB0
FIN_RSI MOVLW H'B0' ; VALOR INICIAL DEL REGISTRO "TMR1L"
MOVWF TMR1L ;
MOVLW H'3C' ; VALOR INICIAL DEL REGISTRO "TMR1H"
MOVWF TMR1H ;
BCF PIR1,TMR1IF ; COLOCA EN 0 EL FLAG DE LA INTERRUPCION CORRESP.
POP SWAPF STATUS_TEMP,W ; RECUPERA VALORES DE STATUS
MOVWF STATUS ; MUEVE EL VALOR DE W AL REGISTRO "STATUS"
MOVF W_TEMP,W ; RECUPERA VALORES DE W
RETFIE ; RETORNA DE LA INTERRUPCION HABILITANDO EL BIT GIE"
ORG 0x2007 ; DIR. DE MEM. ROM DE LA PALABRA DE CONFIGURACION
DATA H'3F30' ; VALOR PARA LA PALABRA DE CONFIGURACION
END ; FIN DEL PROGRAMA