Está en la página 1de 32

Tema 3

Microcontrolador PIC.
Programación
Programación PIC

1. Introducción
2. CPU y juego de instrucciones
3. Memoria de datos
4. Módulos adicionales
5. Programación en ensamblador
6. Interrupciones
7. Timer0
CPU y juego de instrucciones
La CPU obtiene y ejecuta las instrucciones
La ALU realiza las operaciones aritmético-lógicas y
controla el registro STATUS

El PIC 16F88 tiene 35 instrucciones, clasificadas en cuatro


grupos:
- Operaciones con registros a nivel de byte
- Operaciones con registros a nivel de bits
- Operaciones con constantes
- Instrucciones de salto
Juego de instrucciones
Nivel de byte
Dos operandos: f registro, d destino
Si d=0 destino es w, si d=1 destino es f

Nivel de bit
Dos operandos: f registro, b número de bit

Literales
Un operando: k constante de 8 bits

De Salto
Un operando: dirección de 11 bits

Duración
Todas duran 1 ciclo, excepto cuando hay salto
En ese caso duran 2 ciclos, y en el segundo se ejecuta NOP
Juego de instrucciones
Operaciones a nivel de byte
Mnemónico Ops. Descripción Ciclos Bits afect
ADDWF f,d Suma w y f 1 C,DC,Z
ANDWF f,d w AND f 1 Z
CLRF f Limpia f 1 Z
CLRW - Limpia w 1 Z
COMF f,d Complementa f 1 Z
DECF f,d Decrementa f 1 Z
DECFSZ f,d Decrem., salta si 0 1 (2) -
INCF f,d Incrementa f 1 Z
INCFSZ f,d Increm., salta si 0 1 (2) Z
IORWF f,d w OR f 1 Z
MOVF f,d Mueve f 1 Z
MOVWF f Mueve w a f 1 -
NOP - No opera 1 -
Juego de instrucciones
Operaciones a nivel de byte (cont.)
Mnemónico Ops. Descripción Ciclos Bits afect
RLF f,d Rotar izda, usa carry 1 C
RRF f,d Rotar dcha, usa carry 1 C
SUBWF f,d Resta w de f 1 C,DC,Z
SWAPF f,d Cambia nibbles de f 1 -
XORWF f,d w XOR f 1 Z

Operaciones a nivel de bit


Mnemónico Ops. Descripción Ciclos Bits afect
BCF f,b Limpia bit en f 1 -
BSF f,b Set bit en f 1 -
BTFSC f,b Bit test, salta si 0 1 (2) -
BTFSS f,b Bit test, salta si 1 1 (2) -
Juego de instrucciones
Operaciones con constantes y de control
Mnemónico Ops. Descripción Ciclos Bits afect
ADDLW k Suma k a w 1 C,DC,Z
ANDLW k k AND w 1 Z
IORLW k k OR w 1 Z
MOVLW k Mover k a w 1 -
SUBLW k Restar k de w 1 C,DC,Z
XORLW k k XOR w 1 Z

Operaciones de salto y otras


Mnemónico Ops. Descripción Ciclos Bits afect
CALL k Llama subrutina 2 -
CLRWDT - Limpia watchdog 1 TO,PD
GOTO k Ir a dirección 2 -
RETFIE - Volver de interr. 2 -
RETLW k Devolver k en w 2 -
RETURN - Volver de subrutina 2 -
SLEEP - Modo SLEEP 1 TO,PD
Bits de acarreo en STATUS
Bit DC
Se usa en ADDWF, ADDLW, SUBLW, SUBWF
1 si hay acarreo en el cuarto bit de la operación
0 si no lo hay
La polaridad es la contraria para las restas

Bit C
Se usa en ADDWF, ADDLW, SUBLW, SUBWF
1 si hay acarreo en el bit más significativo
0 si no lo hay
La polaridad es la contraria para las restas
Modificación de STATUS
El registro STATUS puede ser el destino de cualquier operación.

En ese caso, la escritura a Z, DC y C se deshabilita. Tampoco se puede


escribir en TO ni PD.

Por ejemplo,
clrf STATUS
pone a 0 IRP, RP1 y RP0, a 1 Z y no cambia los demás.
Se recomienda que para escribir en STATUS solo se usen
BCF, BSF, SWAPF y MOVWF
que son las únicas que no cambian Z, C ni DC.
Memoria de datos
Registro w

Registros de fichero (file registers), mapeados en


memoria
General purpose registers (GPR)
Special function registers (SFR)

Bancos de memoria
Cada instrucción contiene 7 bits para la dirección (128
bytes accesibles)
Se complementan con RP1:RP0 en STATUS.
SFRs y GPRs
Algunos SFR están
mapeados en todos los
bancos

Otros PIC se comportan


de manera diferente, hay
que comprobar el mapa
de memoria
Direccionamiento indirecto
El registro FSR es el puntero

El contenido se mapea en INDF (dirección 0x00)

Se modifica el valor de FSR (normalmente incrementando o decrementando)


para acceder a otras posiciones de memoria

Ej.: poner RAM desde 0x0c a 0x40 a 0 usando dir. Indirecto


movlw 0x0c
movwf FSR
next: clrf INDF
incf FSR
btfss FSR,6 ; 0x40=0100 0000
goto next
Periféricos disponibles
Puertos de E/S
Pines bidireccionales. Registro TRIS para configuración
1 entrada, 0 salida
Se escribe y lee todo el puerto de una vez
PORTA 8 líneas, PORTB 8 líneas

Temporizador
Timer0 en todos los PICs
8 bits, lectura/escritura, prescaler de 8 bits, reloj interno o
externo, interrupción en el desbordamiento, selección de
flanco
Periféricos disponibles
USART (Universal Serial Asynchronous Receiver
Transmitter)
Comunicación serie asíncrona y síncrona
RS-232, SPI, I2C y otros
Full-duplex o half-duplex

Convertidor A/D
Resolución de 8 o 10 bits
De 2 a 16 canales
Condensador de muestreo y retención
Aproximaciones sucesivas
Entradas de tensiones de referencia
Puede funcionar en modo SLEEP
Interrupciones
Interrupción: señal digital
asíncrona que reclama la
atención del procesador

En el 16F88 hay cuatro


fuentes de interrupción

Registro de control de
interrupciones INTCON
Bits INTCON E e INTCON F

Algunas cosas en el registro


OPTION
Fuentes de interrupción
Interrupción externa en RB0
Configurable para flanco de subida/bajada (bit INTEDG de OPTION)

Interrupción de desbordamiento de Timer0


Registro de 8 bits, desborda al pasar de 0xff a 0x00

Cambios en las líneas RB4 a RB7 en el puerto B


Cambio en cualquiera de las líneas. Solo cuentan las que están definidas como
entradas

Periféricos
Cada uno tiene su propia fuente de interrupción y se configura en sus registros
propios
Interrupción en RB4-RB7

Interrupciones anidadas no recomendadas en PICs


Rutinas de interrupción
1. Salvar el valor de w
2. Salvar el valor de STATUS
3. Ejecutar el código pertinente
4. Restaurar el valor de STATUS
5. Restaurar el valor de w
6. Ejecutar instrucción RETFIE para volver

Localización 0x04 en la memoria de programa


org 0x00
goto start
org 0x04
....
retfie
start:
...
Salvar el contexto
Almacenar w es fácil. Almacenar STATUS más complicado.

movwf old_w
swapf status,w
movwf old_status
...
swapf old_status,w
movwf status
swapf old_w,f
swapf old_w,w
retfie
Timer0
Registro de 8 bits que se incrementa con cada ciclo de
instrucción. Se desborda al llegar a 0xff

Se puede leer y escribir por software


Puede usar reloj interno o externo
Puede usar flanco de subida o de bajada
Prescalado de 8 bits programable por software
Puede generar interrupción
Se puede usar como temporizador o como contador
Estructura de Timer0
Operación de Timer0

• TOCS en OPTION elige entre temporizador o contador


– TOCS=1 Contador. El reloj viene de RA4/TOCKI
– TOCS=0 Temporizador. Reloj interno a fOSC/4

El registro TMR0 está mapeado en el banco 0, dir. 0x01


• Se produce interrupción en el desbordamiento si TOIE y GIE en
INTCON están a 1
• La interrupción pone a 1 el bit TOIF en INTCON. La rutina de
interrupción debe ponerlo a 0
Prescaler
PS2:PS0 Divisor TMR0 Divisor WDT
000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

A 4 MHz, para TMR0 Tmin=1us, Tmax=0.256ms


Cuenta de tiempo
• Asignar valor a TMR0 y esperar el desbordamiento
– Retraso = 4*(256-V)*P/fCLK
– V valor asignado, P divisor del prescaler, fCLK frec. de
reloj
• Retrasos largos
– Frec. Mínima con prescaler: 15.26 Hz
– Cuenta de 1 segundo
• 15 desbordamientos: error 2%
• 3906 incrementos: error 0.008%
• 1 000 000 incrementos sin prescaler: error 0%
– Tamaño del registro que se necesita para contar
Detección del desbordamiento
• Leer TMR0 y comprobar Z
wait:
movf tmr0, w
btfss status, z
goto wait ; 2 ciclos
Mejor comprobar un valor bajo
wait1:
movlw 0x03
subwf tmr0, w ; w – TMR0
btfsc status, c
goto wait1
Al escribir en TMR0, la cuenta se inhabilita durante
dos ciclos
Uso como contador
• Reloj externo en TOCKI (TOCS a 1)
• Sin prescaler, el ciclo de reloj externo debe ser al
menos de 2 ciclos de reloj interno + 20 ns
• Con prescaler, al menos de 4 ciclos + 40ns
Ejemplo: parpadeo de un LED
portB equ 0x06
count equ 0x0c
tmr0 equ 0x01

org 0x000
start clrwdt ; clear watchdog timer
movlw b'11010111' ; assign prescaler, internal clock
; and divide by 256
option
movlw 0x00 ; set w = 0
tris portB ; port B is output
clrf portB ; port B all low
go bsf portB, 0 ; RB0 = 1, thus LED on
call delay
bcf portB, 0 ; RB0 = 0, thus LED off
call delay
goto go ; repeat forever

delay clrf tmr0 ; clear TMR0, start counting


again btfss tmr0, 7 ; if bit 7 = 1
goto again ; no, then check again
return ; else exit delay

end
Ejemplo: recepción serie asíncrona
tmr0 equ 0x01 ; Timer/counter register
status equ 0x03 ; Status word register.
portA equ 0x05 ; Port A register
portB equ 0x06 ; Port B register
intCon equ 0x0b ; Interrupt control register
rcvReg equ 0x0c ; General purpose register
count equ 0x0d ; General purpose register
temp equ 0x0e ; General purpose register
optReg equ 0x81 ; File register in Bank 1
trisA equ 0x85 ; File register in Bank 1
trisB equ 0x86 ; File register in Bank 1
Ejemplo: recepción serie asíncrona
org 0x000

start bsf status, rp0 ; Switch to Bank 1.


movlw b'00000101' ; A0, A2 input, the rest output
movwf trisA
movlw b'00000000' ; Port B: all output
movwf trisB
bcf status, rp0 ; Switch back to Bank 0
clrf portB
clrf rcvReg
switch btfsc portA, 2 ; Is A2 equal 0?
goto switch ; No, so keep checking
doThis call rcv4800 ; Yes, to serial in subroutine
movf rcvReg, w ; Get byte received
movwf portB ; Display byte on the 8 LEDs
circle goto doThis ; Done
Ejemplo: recepción serie asíncrona
rcv480 bcf intCon, 5 ; Disable tmr0 interrupts
bcf intCon, 7 ; Disable global interrupts
clrf tmr0 ; Clear timer/counter
clrwdt ; Clear wdt prep prescaler assign
bsf status, rp0 ; to page 1
movlw b'11011000' ; set up timer/counter
movwf optReg
bcf status, rp0 ; Back to page 0
movlw 0x08 ; Init shift counter
movwf count
sbit btfsc portA, 0 ; Look for start bit
goto sbit ; For Mark
movlw 0x98 ;
movwf tmr0 ; Load and start timer/counter
bcf intCon, 2 ; Clear tmr0 overflow flag
Ejemplo: recepción serie asíncrona
time1 btfss intCon, 2 ; Has the timer (bit 2) overflowed?
goto time1 ; No
btfsc portA, 0 ; Start bit still low?
goto sbit ; False start, go back
movlw 0x30 ; real, define N for timer
movwf tmr0 ; start timer/counter - bit time
bcf intCon, 2 ; Clear tmr0 overflow flag
time2 btfss intCon, 2 ; Timer overflow?
goto time2 ; No
movlw 0x30 ; Yes, define N for timer
movwf tmr0 ; Start timer/counter
bcf intCon, 2; ; Clear tmr0 overflow flah
movf portA, w ; Read port A
movwf temp ; Store
rrf temp, f ; Rotate bit 0 into carry flag
rrf rcvReg, f ; Rotate carry into rcvReg bit 7
decfsz count, f ; Shifted 8?
goto time2 ; No
time3 btfss intCon, 2 ; Timer overflow?
goto time3 ; No
return ; Yes, byte received
end
Ejercicios

¿Cómo se convertirán las siguientes sentencias
en C a ensamblador del PIC?
– unsigned char a,b,c,*p;
– a=b+2;
– a=b+c;
– a=*p;
– p=&a; *p++=b;

¿Qué diferencia hay entre un prescaler y un postscaler?

También podría gustarte