Você está na página 1de 21

GERENCIA DEL PROYECTO

COMPILADOR

Convierte el programa de cdigo fuente en instrucciones de


cdigo mquina

Estructura del proyecto

CIRCUITO PARA PROGRAMACIN


http://perso.wanadoo.es/chyryes/circuitos/progpic.htm

bajar este programa ensamblador: MPASM

RAM SPECIAL FUNCTION REGISTERS (SFR)

Acrnimos empleados en las instrucciones

SOFTWARE

Slo 35 instrucciones:

18
orientadas a
bytes

4
orientadas a bits

13
Orientadas a
literales y control

Todas las instrucciones se TARDAN en ejecutar un


ciclo de mquina con la excepcin de las
instrucciones de salto que toman dos ciclos.

SET de instrucciones
18

04

13

Ejemplo 1: Puerto B como salida

PNDULO

ESQUEMA PARA TODOS LOS PROGRAMAS

1. Cabecera
2. Equivalencias para
ensamblador
3. Directivas +
Inicializacin

4. Programa principal
5. Subrutinas

;***************************************************************************
; Programa que realiza un pndulo de leds con los 8 bits del port B
; Revisin: 0.0

1. cabecera

; Frecuencia del Reloj: 4MHz Frecuencia de instruccin: 1MHz Ciclo


; de Trabajo: 1us
; Tipo de Reloj: XT
; Perro Guardin: OFF
; Proteccin de Cdigo: OFF
; Realizado por: Fulanito de Tal / Fecha:
;****************************************************************************
; --------------------------------------Igualdades para el Ensamblador ---------------------------------LIST
P=16F84
; Indica al Ensamblador el modelo de PIC
LIST
C=132
; Indica al Ensamblador el tipo de editor (132 col)
; --------------------------------------- Ingualdades para CPU y Memoria -----------------------------PORTA
EQU
0x05
; Puerta A
PORTB
EQU
0x06
; Puerta B
TRISA
EQU
0x05
; Regitro Triestado del Puerto A
TRISB
EQU
0x06
; Regitro Triestado del Puerto B
STATUS
EQU
0x03
; Registro de Estado
RP0
EQU
0x05
; RP0 de STATUS: bit 5
C
EQU
0x00
; Flag C de STATUS: bit 0
CONTA1
EQU
0x0C
; Registro de retardo 1 en direccin
; 0x0C
CONTA2
EQU
0x0D
; Registro de retardo 2 en direccin
; 0x0D
W
EQU
0x00
; d=0 para guardar resultado en w
f
EQU
0x01
; d=1 para gusrdar resultado en f
;-----------------------------------------------------------------------------------------------------------------------; --------------------------------------- Directivas para Ensamblador -------------------------ORG
00h
; direccin del vector de RESET
goto
INICIO
; el programa inicia en 05h (despus del vector de
; interrupcin)
;----------------------------------------------------------------------------------------------------------

2. equivalencias

3. directivas

; ------------------------------------ Inicializacin de variables -----------------------------------ORG


05h
; direccin de inicio del programa
INICIO
bsf
STATUS, RP0
; selecciona el BANCO 1 (pgina 1)
clrf
TRISB
; configura RBi (port B) como salida
bcf
STATUS, RP0
; retorna al BANCO 0 (pgina 0)
clrf
PORTB
; apaga los leds de RBi
clrf
CONTA1
; inicializa en 00h CONTA1
clrf
CONTA2
; inicializa en 00h CONTA2
;------------------------------------------------------------------------------------------------------------

; -------------------------------------- Programa Principal ----------------------------------------------ROTACION


bsf
PORTB , 0 ; enciende RB0
bcf
STATUS , C ; borra el bit de Carry del STATUS
ROTA_IZQ
call
TEMPO
; llama subrutina TEMPO
rlf
PORTB , f ; rota 1 bit a izq en PORTB
; Carry RB7 ... RB0 Carry
btfss
PORTB , 7 ; bit test file skip set: si RB7=1 salta
; una instruction.
goto
ROTA_IZQ
; sigue rotando a izquierda, an no
; llega a RB7
bcf
STATUS , C ; borra el Carry: C=0
ROTA_DER
call
TEMPO
; llama a subrutina TEMPO
rrf
PORTB , f ; rota 1 bit a der en PORTB
; Carry RB7 ... RB0 Carry
btfss
PORTB , 0
; bit test file skip set: si RB0=1 salta
; una instruccin.
goto
ROTA_DER ; sigue rotando a derecha, an no
; llega a RB0
goto
ROTACION
; lleg a RBO=1 reinicia proceso
;------------------------------------------------------------------------------------------------------------------; ----------------------------------- Subrutina TEMPO ----------------------------------------------TEMPO
clrf
CONTA1
; borra el registro CONTA1
clrf
CONTA2
; borra el registro CONTA2
BUCLE1
decfsz
CONTA1, f
; dec file skip zero file
; CONTA1 = CONTA1 - 1
; CONTA1 = FFh 00h
; Si CONTA1 = 0 salta una
; instruccin
goto
BUCLE1
; CONTA1 0 sigue en
; BUCLE1
decfsz
CONTA2, f
; CONTA2 = CONTA2 - 1
; CONTA2 = FFh 00h
; Si CONTA2 = 0 salta una
; instruccin
goto
BUCLE1
; CONTA1 2 sigue en
; BUCLE2
FIN
return
; Retorno de la subrutina
;------------------------------------------------------------------------------------------------------------END

inicializacin

4.
Programa
principal

5.
Subrutinas

1. Cabecera

;***************************************************************************
; Programa que realiza un pndulo de leds con los 8 bits del port B
; Revisin: 0.0
; Frecuencia del Reloj: 4MHz Frecuencia de instruccin: 1MHz Ciclo
; de Trabajo: 1us
; Tipo de Reloj: XT
; Perro Guardin: OFF
; Proteccin de Cdigo: OFF
; Realizado por: Fulanito de Tal
; Fecha: lunes, 14 de octubre de 2014
;****************************************************************************

2. Igualdades para el Ensamblador


; --------------------------------------- Igualdades para el Ensamblador ---------------------------------LIST
P=16F84 ; Indica al Ensamblador el modelo de PIC
LIST
C=132
; Indica al Ensamblador el tipo de editor (132 col)
; --------------------------------------- Ingualdades para CPU y Memoria -----------------------------PORTA
EQU
0x05
; Puerta A
PORTB
EQU
0x06
; Puerta B
TRISA
EQU
0x05
; Regitro Triestado del Puerto A
TRISB
EQU
0x06
; Regitro Triestado del Puerto B
STATUS EQU
0x03
; Registro de Estado
RP0
EQU
0x05
; RP0 de STATUS: bit 5
C
EQU
0x00
; Flag C de STATUS: bit 0
CONTA1 EQU
0x0C
; Registro de retardo 1 en direccin
; 0x0C
CONTA2 EQU
0x0D
; Registro de retardo 2 en direccin
; 0x0D
W
EQU
0x00
; d=0 para guardar resultado en w
f
EQU
0x01
; d=1 para gusrdar resultado en f
;------------------------------------------------------------------------------------------------------------------------

Cuidar las maysculas y minsculas W w

10

3. Datos para el Ensamblador


;
; --------------------------------------- Directivas para Ensamblador -------------------------ORG

00h

; direccin del vector de RESET

goto

INICIO

; el programa inicia en 05h (despus del vector de


; interrupcin)

;---------------------------------------------------------------------------------------------------------;

DIRECCIN

CONTENIDO (DATO)

00 h

goto INICIO

ORG 00h

01 h

Memoria
de

02 h

programa

Reservado para
interrupciones

03 h
04 h

ORG 05h INICIO=05h

05 h

bsf STATUS, RP0

06 h

4. Inicializacin
; ------------------------------------ Inicializacin de variables -----------------------------------INICIO

ORG

05h

; direccin de inicio del programa

bsf

STATUS, RP0

; selecciona el BANCO 1 (pgina 1)

clrf

TRISB

; configura RBi (port B) como salida

bcf

STATUS, RP0

; retorna al BANCO 0 (pgina 0)

clrf

PORTB

; apaga los leds de RBi

clrf

CONTA1

; inicializa en 00h CONTA1

clrf

CONTA2

; inicializa en 00h CONTA2

;------------------------------------------------------------------------------------------------------------

1 entrada
0 salida

03h
05h

02h

11

SINTAXIS EN LENGUAJE ENSAMBLADOR


STATUS EQU 0x03
RP0

EQU 0x05

bcf

STATUS, RP0
de bits

TRISB EQU 0x06


Clrf

TRISB
de registro

Bit clear file

Clear file

Bit set file

Clear W

0 f 127
0x 00 f 0x 7F

f es una
direccin de la
memoria de
datos RAM
Solamente se puede
acceder a un banco a
la vez, empleando f.
El banco
correspondiente se
escoge cambiando el
bit RP0 del registro
STATUS.

12

6. Programa Principal
; -------------------------------------- Programa Principal ----------------------------------------------ROTACION
bsf
PORTB , 0
; enciende RB0
bcf
STATUS , C
; borra el bit de Carry del STATUS
ROTA_IZQ
call
TEMPO
; llama subrutina TEMPO
rlf
PORTB , f
; rota 1 bit a izq en PORTB
; Carry RB7 ... RB0 Carry
btfss
PORTB , 7
; bit test file skip set:
; si RB7=1 salta una instruction.
goto
ROTA_IZQ
; sigue rotando a izquierda, an no
; llega a RB7
bcf
STATUS , C
; borra el Carry: C=0
ROTA_DER
call
TEMPO
; llama a subrutina TEMPO
rrf
PORTB , f
; rota 1 bit a der en PORTB
; Carry RB7 ... RB0 Carry
btfss
PORTB , 0
; bit test file skip set: si RB0=1 salta
; una instruccin.
goto
ROTA_DER
; sigue rotando a derecha, an no
; llega a RB0
goto
ROTACION
; lleg a RBO=1 reinicia proceso
;-------------------------------------------------------------------------------------------------------------------

5V/0V

instrucciones

211=2048
[A10-A0]

13

Algoritmo bsico para temporizar

Para 3 bits

2^3=8

(1) 0

0 - 1 = 7

1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0

1
1
0
0
1
1
0
0
1
1
0
0
1
1
0
0

1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0

7
6
5
4
3
2
1
0
7
6
5
4
3
2
1
0

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

6
5
4
3
2
1
0
7
6
5
4
3
2
1
0
7

Cada decremento tarda


1 ciclo mquina

8
decrementos

Cada salto tarda


2 ciclos mquina
Si se carga con 000(1000=8)
tarda 8 ciclos mquina
en llegar a cero

8
decrementos

Si se carga con 101(5)


tarda 5 ciclos mquina
en llegar a cero
Si se carga con N, tarda N
ciclos mquina en llegar a cero

Para n=8 bits2n=28=

256

7. Subrutina TEMPO END


; ----------------------------------- Subrutina TEMPO ----------------------------------------------TEMPO clrf
CONTA1
; borra el registro CONTA1
clrf
CONTA2
; borra el registro CONTA2
BUCLE1 decfsz
CONTA1, f
; dec file skip zero file
; CONTA1 = CONTA1 - 1
; CONTA1 = FFh 00h
; Si CONTA1 = 0 salta una
; instruccin
goto
BUCLE1
; CONTA1 0 sigue en
; BUCLE1
decfsz
CONTA2, f
; CONTA2 = CONTA2 - 1
; CONTA2 = FFh 00h
; Si CONTA2 = 0 salta una
; instruccin
goto
BUCLE1
; CONTA1 2 sigue en
; BUCLE2
FIN
return
; Retorno de la subrutina
;------------------------------------------------------------------------------------------------------------END

14

instrucciones

a) 1+1 = 2 ciclos

SUBRUTINA TEMPO

b) 256+(255*2)+2 = 768 c
TEMP0

CICLOS TOTALES
--------------------

2+
768*256+
256+
2*255+
2+
2+
= 197380 ciclos

(a)
clrf
clrf

CONTA1 1c
CONTA2 1c

CONTA1 = 00h
CONTA2 = 00h

BUCLE1

255X2

256

(b)
decfsz
goto

BUCLE1

0.197380 s = aprox 0.2 s

CONTA1 = CONTA1-1

CONTA1,f
BUCLE1

Cada ciclo=1us.

NO

CONTA1 = 0?

SI

768

256

(c)
decfsz
goto

255X2

CONTA2 = CONTA2-1

CONTA2,f
BUCLE1

NO

CONTA2 = 0?

Por cada condicin no satisfecha


(CONTA2 0) se suman 3ciclos uno
del decfsz y dos del goto, cuando
se satisface la condicin (CONTA2 =
0), se suma dos ciclos por el SI.

SI

(d)
return

2c

Retorna

El return suma dos ciclos ms.

15

SUBRUTINA TEMPO MODIFICADA

Si CONTA3=00h

TEMP0

(256*197,380)+(255+2)+(255*2)

(a)
clrf
clrf
movlw
movwf

CONTA1
CONTA2
05h
CONTA3

1c
1c
1c
1c

= 50530,047

CONTA1 = 00h
CONTA2 = 00h
CONTA3 = 05h

CONTA3

TOTAL:
BUCLE1

C = 5+ 50530,047 + 2
= 50530,054 ciclos

(b)
decfsz
goto

CONTA1,f 255 (1c) + (2c) del salto por SI


BUCLE1 255 (2c) de cada NO

CONTA1 = CONTA1-1

NO

CONTA1 = 0?

(c)
decfsz
goto

CONTA2,f 255 (1c) + (2c) del salto por SI


BUCLE1 255 (2c) de cada NO

t =50.530054 s
-------------------------------Si CONTA3=n
Decrementar n veces

SI

CONTA2 = CONTA2-1

NO

CONTA2 = 0?

197380 c

C =

SI

(d)
CONTA3 = CONTA3-1

decfsz
goto

CONTA3,f 255 (1c) + (2c) del salto por SI


BUCLE1 255 (2c) de cada NO

CONTA3 = 0?

SI

2c

return

NO

C =

4+
n* 197380+
n+
(n-1)*2 +
2+
2+

inicializacin
lazos internos
decrementos
saltos goto
Salto condicin
retorno

n*197,382+6 ciclos

CONTA3=0x05
T = 986,916 ciclos
T = 0.986916 seg

Retorna

0<n<255

DOS TIPOS DE TEMPORIZADORES


1) Temporizador/Contador TMR0:

Temporizador:
-

El TMR0 se incrementa en cada ciclo de instruccin


(fck/4)

Cuando 0xFF+1 0x00


-

El bit T0IF = 0 1 (SRF INTCON)

Se produce una interrupcin (si se ha habilitado).

Contador ascendente de 8 bits (0255)


-

Dando un valor inicial al SFR: TMR0

Se incrementa con ( ) del :


-

Internamente (Reloj interno),

Externamente (Reloj externo en pin RA4/T0CK1)

Cuando 0xFF+1 0x00


-

El bit T0IF = 0 1 (SRF INTCON)

Se produce una interrupcin (si se ha habilitado).

2) Watch Dog WDT:


Es un contador interno que se incrementa con
cada ciclo de instruccin, y que genera un
RESET cuando se desborda.
Para evitar que se desborde, el programador tiene
que REFRESCARLO borrndolo antes que se
desborde con:

CLRWDT: borra WDT y reinicia cuenta.


SLEEP: borra WDT, Bajo consumo, pero WDT
sigue incrementndose hasta su desbordamiento
RESET.

Su control de tiempos es independiente del TMR0.


Se activa con el bit WDTE (CONFIGURATION
WORD @ 0x2007)
Se escribe solamente durante la programacin del
uC.

Configuracin: Temporizador Contador:


-

Bit T0CS (SFR OPTION)


-

T0CS = 0 TEMPORIZADOR

T0CS = 1 CONTADOR

Bit TOSE (SRR OPTION)


-

TOSE = 0 Se incrementa con flanco de subida .

TOSE = 1 Se incrementa con flanco de bajada .

16

STATUS REGISTER (03h y 83h): Registro de Estado (B0 y B1)

Activacin del banco:


0/1
Bit de Tiempo Finalizado. Se activa
por: POWER ON, WDT, CLRWDT,
SLEEP, y se desactiva por WDT.

Se activa al encender, o al CLRWDT.


Se apaga con un SLEEP.

Se activa si el resultado de cualquier


operacin es CERO
Acarreo
en el
CUARTO
bit.

Acarreo
en el
OCTAVO
bit.

OPTION REGISTER (81h): Registro de Opciones

Resistencias PULLUP del puerto


B antivadas o desactivadas
La interrupcin de RB0/INT funciona
con el flanco de subida o con el
flanco de bajada.
El TIMER 0 funciona con la entrada
externa RA4/T0CK1, o con el ciclo de
instruccin interna.
El TIMER 0 se incrementa en el
flanco ascendente o en el
descendente de RA4

Valor por el que se dividir la


frecuencia del OSCILADOR (Ej.
4MHz) para incrementar el TIMER 0
el PERRO GUARTIN

17

INTCON REGISTER (0Bh,8Bh): Configuracin de interrupciones

Se [concede/no concede] permiso a


cualquier interrupcin

Se [concede/no concede] permiso a


interrupcin de MEMORIA EPROM
Se [concede/no concede] permiso a
interrupcin TMR0

Se [concede/no concede] permiso a


interrupcin RB0/INT EXTERNA
Se [concede/no concede] permiso a
interrupcin DEL PUERTO B
Bandera de rebosamiento del
TMR0
Bandera de
interrupcin externa
INT producida. Se
borra por software
Bandera que indica
cambio en PORT.

Pre-escala

Se puede dividir los pulsos empleados


para los temporizadores aplicndoles
una pre-escala, es decir, dividiendo la
frecuencia interna (fclk/4).
La pre-escala slo se puede asignar a
TMR0 WDT, mas no a ambos.
Cuando se le asigna al WDT, la preescala del TMR0 es 1:1.
Los cdigos escritos en los bits
[PS2,PS1,PS0] significan pre-escalas
diferentes para el TMR0 y el WDT.
Ej:
Fi = Fosc/4 = 4MHz/4 = 1MHz
Si SFR OPTION = [x,x,x,x,0,0,1,1]
FTMR0 = 1x106/16 = 62.5 KHz

18

- INTCON
- TMR0
- PORTB

- EECON1

Manejo del TMR0


El PIC16F84, PIC16F877 contienen un contador
de 8 bits (TMR0) ubicado en la direccin 0x1 de
la memoria de datos.
Este contador se incrementa con pulsos de reloj
que se aplican ya sea:
- al pin RA4/TOCKI o
- de acuerdo a una seal interna proveniente del reloj
de instrucciones del mC.

La razn del incremento se puede determinar por


un pre-escalador (divisor de frecuencia)
localizado en el registro OPTION (0x81).
Este contador activa un flag de desbordamiento
(INTCON) cuando la cuenta pasa de FFH a 00H,
pudiendo generar una interrupcin.

19

Interrupciones del PIC16F84


1. El PIC16F84 tiene 4

fuentes de interrupcin:

2.

3. 1.- T0I Por desbordamiento del TMR0. Overflow.


4. 2.- INT Pulso externo.
5. 3.- RBI Cambio en los pines RB7:RB4 del puerto B.
6. 4.- EEI Fin de grabacin de la memoria EEPROM.

Para producir una interrupcin hay que habilitar los


bits correspondientes
de cada una de las fuentes:
-TOIE, INTE, RBIE, EEIE
-y el bit global GIE.
Cuando una interrupcin se produce, se indica
mediante el sealizador o flag correspondiente.
El mC guarda en pila el PC+1 y toma el valor
almacenado en la direccin 0004H.
Flag*Enable = interrupcin

20

INTCON REGISTER (0Bh,8Bh): Configuracin de interrupciones


bits de habilitacin

bit 6

bit 5

bit 4

bits de sealizacin

bit 3

bit2

bit1

Se [concede/no concede] permiso a


cualquier interrupcin

Se [concede/no concede] permiso a


interrupcin de MEMORIA EPROM
Se [concede/no concede] permiso a
interrupcin TMR0

Se [concede/no concede] permiso a


interrupcin RB0/INT EXTERNA
Se [concede/no concede] permiso a
interrupcin DEL PUERTO B
Bandera de rebosamiento del
TMR0
Bandera de
interrupcin externa
INT producida. Se
borra por software
Bandera que indica
cambio en PORT.

21

Você também pode gostar