Capıtulo 1 Pr´actica: Dos ejemplos breves

Anuncio
Capı́tulo 1
Práctica: Dos ejemplos breves
Me lo contaron y lo olvidé; lo vi
y lo entendı́; lo hice y lo aprendı́.
∼ Confucio ∼
1.1. Decodificador a 7 segmentos
1
Consiste en la realización de un decodificador a 7 segmentos empleando el microcontrolador
PIC16F88.
La entrada en binario se realiza a través de los pines RA0..RA3 y la salida decodificada se
genera a través de RB0..RB6 para los segmentos A,B,C,D,E,F,G y RB7 para el punto decimal (DP).
A
B
F
C
D
E
F
E
G
DP
Cathode
1
Versión de 12 de marzo de 2008
1
A
B
G
C
D
DP
2
Decodificador a 7 segmentos
0
PUNTO
0
0
0
0
B0
R8
10k
X1
U1
16
15
4MHz
RA7/OSC1/CLKIN
RA0/AN0
RA6/OSC2/CLKOUT
RA1/AN1
RA2/AN2/CVREF/VREFRA5/MCLR RA3/AN3/C1OUT/VREF+
RA4/AN4/T0CKI/C2OUT
4
C1
C2
33pF
33pF
RB0/INT/CCP1
RB1/SDI/SDA
RB2/SDO/RX/DT
RB3/CCP1
RB4/SCK/SCL
RB5/SS/TX/CK
RB6/AN5/T1OSO/T1CKI
RB7/AN6/T1OSI
17
18
1
2
3
R1
6
7
8
9
10
11
12
13
B1
B2
B3
330
Al punto decimal
PIC16F88
La codificación de tablas en los PIC se hace de una forma muy diferente a como se realiza en
otros micros. Ahı́ va un ejemplo en ensamblador:
1
2
3
; El acceso a un elemento de la tabla va a consistir en
; llamar a una subrutina (TABLA) metiendo en el registro de
; trabajo (W) el indice de la misma.
4
5
TABLA
6
7
8
9
ADDWF
RETLW
RETLW
RETLW
RETLW
PCL,F
40
41
42
43
;
;
;
;
;
PCL=PCL+W
Valor devuelto
Valor devuelto
Valor devuelto
Valor devuelto
40
41
42
43
(W=0)
(W=1)
(W=2)
(W=3)
10
11
12
13
14
15
16
17
; Hay que tener mucho cuidado en que el valor de W este
; dentro del rango definido.
; La posicion de la tabla en la memoria de programa deber\’{a}
; encontrarse dentro de una pagina de 256 bytes dado
; que si hay un acarreo del byte inferior (PCL) al byte
; superior del contador de programa, no se accedera’
; correctamente a la tabla
Si lo tuviéramos que escribir desde lenguaje C seria:
1
2
3
4
// Es obligatorio poner const delante de la declaracion
// de la variable para que se situe en memoria de programa (FLASH)
// y no en la memoria de datos RAM
const unsigned char TABLA[]={40,41,42,43};
5
6
// El acceso sera’ como de costumbre en lenguaje C
7
8
i=TABLA[0];
// Asigna a i el primer elemento de la tabla
Capı́tulo 1. Práctica: Dos ejemplos breves
3
1.2. Contador
Se pide realizar un contador (parecido al 74190 de la serie TTL) UP/DOWN de 4 bits con carga
en paralelo usando el mismo microcontrolador.
Los pines RA0..RA3 serán la entrada en paralelo del contador;
RA4 indicará el fin de cuenta. Es una salida que vale uno solo cuando el valor del contador
pasa de 15 a 0 al incrementar o pasa de 0 a 15 al decrementar;
RB0 es la entrada de la señal de reloj (para incrementar o decrementar el contador con el
flanco de subida de esta señal);
RB1 es la patilla de carga en paralelo (activa en baja y ası́ncrona);
RB2 es el indicador del sentido del contaje (1, decrementar, 0, incrementar);
RB3 es la señal de borrado ası́ncrona o puesta a cero del contador (activa en baja) y,
RB4..RB7 es la salida del contador.
Un ejemplo de esquema a continuación:
R1
10k
X1
U1
16
15
4MHz
4
C1
C2
33pF
33pF
RA7/OSC1/CLKIN
RA0/AN0
RA6/OSC2/CLKOUT
RA1/AN1
RA2/AN2/CVREF/VREFRA5/MCLR RA3/AN3/C1OUT/VREF+
RA4/AN4/T0CKI/C2OUT
RB0/INT/CCP1
RB1/SDI/SDA
RB2/SDO/RX/DT
RB3/CCP1
RB4/SCK/SCL
RB5/SS/TX/CK
RB6/AN5/T1OSO/T1CKI
RB7/AN6/T1OSI
PIC16F88
U2
15
1
10
9
14
4
5
11
D0
D1
D2
D3
Q0
Q1
Q2
Q3
RCO
CLK
E
D/U
PL
TC
3
2
6
7
13
17
18
1
2
3
6
7
8
9
10
11
12
13
0
0
0
0
?
D0
D1
D2
D3
FINAL DE CUENTA (TC)
0
RELOJ (CLK)
0
CARGA (PL)
0
DEC/INC (D/U)
0
BORRADO (E)
Q0
Q1
Q2
Q3
12
74190
Para sacar nota
Se recomienda el uso de la funcionalidad doble de la patilla RB0/INT que es capaz de responder por interrupciones a un flanco (de subida o bajada).
Las interrupciones desde C se resuelven de la siguiente manera:
4
1
2
3
4
5
Contador
void interrupt RutinaDeInterrupciones()
{
// Las interrupciones se inhiben automaticamente al entrar
// Se guardan automaticamente W, STATUS y PCLATH en la memoria
//
RAM. Tambien se guardaran las variables que se usen
6
// Deberemos detectar cual es la fuente de interrupciones y
// actuar en consecuencia. Si solo hemos activado una fuente de
// interrupcion entonces esto no es necesario
7
8
9
10
11
// Se recuperan automaticamente de la memoria RAM (posiciones
// fijas, no es una pila) los registros W, STATUS y PCLATH y
// las variables guardadas
// Las interrupciones se activan al salir
12
13
14
15
16
};
Descargar