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 };