Cap´tulo 1 ı Pr´ ctica: Dos ejemplos breves a

Me lo contaron y lo olvid´; lo vi e y lo entend´; lo hice y lo aprend´. ı ı ∼ Confucio ∼

1.1. Decodificador a 7 segmentos
´ Consiste en la realizacion 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 e genera a trav´ s de RB0..RB6 para los segmentos A,B,C,D,E,F,G y RB7 para el punto decimal (DP). e
1

A B F C D E F E G DP Cathode
1

A

B

G

C

D DP

´ Version de 12 de marzo de 2008

1

llamar a una subrutina (TABLA) metiendo en el registro de . Ah´ va un ejemplo en ensamblador: ı 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 .42. trabajo (W) el indice de la misma. TABLA ADDWF RETLW RETLW RETLW RETLW PCL. . que si hay un acarreo del byte inferior (PCL) al byte . superior del contador de programa.41. El acceso a un elemento de la tabla va a consistir en . correctamente a la tabla Si lo tuvi´ ramos que escribir desde lenguaje C seria: e 1 2 3 4 5 6 7 8 // 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.F 40 41 42 43 . no se accedera’ . . PCL=PCL+W Valor devuelto Valor devuelto Valor devuelto Valor devuelto 40 41 42 43 (W=0) (W=1) (W=2) (W=3) . . La posicion de la tabla en la memoria de programa deber\’{a} . // El acceso sera’ como de costumbre en lenguaje C i=TABLA[0]. // Asigna a i el primer elemento de la tabla . Hay que tener mucho cuidado en que el valor de W este . dentro del rango definido.2 Decodificador a 7 segmentos 0 R8 X1 10k PUNTO B0 B1 B2 B3 U1 16 15 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 17 18 1 2 3 6 7 8 9 10 11 12 13 4MHz 4 0 0 0 0 R1 330 C1 33pF C2 33pF Al punto decimal ´ La codificacion de tablas en los PIC se hace de una forma muy diferente a como se realiza en otros micros.43}. . encontrarse dentro de una pagina de 256 bytes dado . .

RB1 es la patilla de carga en paralelo (activa en baja y as´ncrona).. ˜ RB0 es la entrada de la senal de reloj (para incrementar o decrementar el contador con el ˜ flanco de subida de esta senal). 0. Pr´ ctica: Dos ejemplos breves ı a 3 1. ı RB4. decrementar.2. ˜ RB3 es la senal de borrado as´ncrona o puesta a cero del contador (activa en baja) y. 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. ı RB2 es el indicador del sentido del contaje (1.RB7 es la salida del contador.Cap´tulo 1.RA3 ser´ n la entrada en paralelo del contador. incrementar). Las interrupciones desde C se resuelven de la siguiente manera: .. Es una salida que vale uno solo cuando el valor del contador a pasa de 15 a 0 al incrementar o pasa de 0 a 15 al decrementar. a RA4 indicar´ el fin de cuenta. Los pines RA0. ´ Un ejemplo de esquema a continuacion: R1 X1 10k U1 16 15 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 17 18 1 2 3 6 7 8 9 10 11 12 13 4MHz 4 0 0 0 0 ? 0 0 0 0 Q0 Q1 Q2 Q3 D0 D1 D2 D3 FINAL DE CUENTA (TC) RELOJ (CLK) CARGA (PL) DEC/INC (D/U) BORRADO (E) C1 33pF C2 33pF U2 15 1 10 9 14 4 5 11 D0 D1 D2 D3 CLK E D/U PL TC 74190 Q0 Q1 Q2 Q3 RCO 3 2 6 7 13 12 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).

Tambien se guardaran las variables que se usen // Deberemos detectar cual es la fuente de interrupciones y // actuar en consecuencia. . STATUS y PCLATH en la memoria // RAM. STATUS y PCLATH y // las variables guardadas // Las interrupciones se activan al salir }.4 Contador 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void interrupt RutinaDeInterrupciones() { // Las interrupciones se inhiben automaticamente al entrar // Se guardan automaticamente W. Si solo hemos activado una fuente de // interrupcion entonces esto no es necesario // Se recuperan automaticamente de la memoria RAM (posiciones // fijas. no es una pila) los registros W.