Segundo Parcial Programación en Mikro C para microcontroladores PIC PIC16F877 M.I. Alfredo Santillana Cedillo Operadores a nivel de bits Operador & operacion AND; compara pares de bits y regresa 1 si ambos son 1’s, de otra manera regresa 0. | OR (inclusive); compara pares de bits y regresa 1 si uno o ambos son 1’s, de otra manera regresa 0. ^ OR (exclusiva); compara pares de bits y regresa 1 si los bits son complementarios, de otra manera regresa 0. ~ Complemento (unitario); invierte cada bit << Corrimiento hacia la izquierda; mueve los bits hacia la izquierda, descartando el bit mas a la izquierda y asignando ceros al bit a la derecha. >> Corrimiento hacia la derecha; mueve los bits hacia la derecha, descartando el bit mas a la derecha y asignando ceros al bit a la izquierda. M.I. Alfredo Santillana Cedillo Ejemplos operadores lógicos 0x1234 & 0x5678 /* Igual 0x1230 */ porque... 0x1234 : 0001 0010 0011 0100 0x5678: 0101 0110 0111 1000 ----------------------------------&: 0001 0010 0011 0000 esto es, 0x1230 /* De forma similar: */ 0x1234 | 0x5678; 0x1234 ^ 0x5678; ~ 0x1234; M.I. Alfredo Santillana Cedillo /* Igual 0x567C */ /* Igual 0x444C */ /* Igual 0xEDCB */ Ejemplos a nivel de bits 000001 << 5; 0x3801 << 4; /* Igual 000040 */ /* Igual 0x8010, sobreflujo! */ 0x02F6 >> 4; 0xFF56 >> 4; /* Igual 0x002F */ /* Igual 0x0FF5 */ Corrimiento a la derecha division entre 2n. Corrimiento a la izquierda producto por 2n. M.I. Alfredo Santillana Cedillo Practica No.9 Luces con desplazamiento (algoritmo) 1. 2. 3. 4. 5. 6. Configuración de puerto como salida. Inicializa variable. Envía valor de la variable al puerto. Modifica la variable. Si variable es cero, Inicializa la variable. Regresa a 3. M.I. Alfredo Santillana Cedillo Luces con desplazamiento (diagrama de flujo) Luces Configura puerto como salida Modifica variable si Inicializa variable variable = 0 Envía variable al puerto M.I. Alfredo Santillana Cedillo no Inicializa variable Luces con desplazamiento (programa 1) void main ( void ) { unsigned short dato; TRISD = 0; dato = 0b00000001; while ( 1 ) { PORTD = dato; Delay_ms ( 300 ); dato = dato << 1; if ( dato == 0 ) dato = 0x01; } } M.I. Alfredo Santillana Cedillo Operaciones aritméticas Operador Operación + Suma - Resta * Multiplicación / División % Resto, regresa el residuo de la división entera (no puede ser usado con variables flotantes ++ Como prefijo Incrementa en uno el valor de la variable antes de evaluar la expresión. Como Postfijo suma en uno la variable después de ser evaluado la expresión. -- Como prefijo decrementa en uno el valor de la variable antes de evaluar la expresión. Como Postfijo resta en uno la variable después de ser evaluado la expresión. M.I. Alfredo Santillana Cedillo Luces con desplazamiento (programa 2) void main ( void ) { unsigned short dato; TRISD = 0; dato = 1; while ( 1 ) { PORTD = dato; Delay_ms (250); dato = dato * 2; if ( dato == 0 ) dato = 0x01; } } M.I. Alfredo Santillana Cedillo Practica No. 10 y 11 10. El alumno realizara un programa que envíe al puerto C los siguientes valores utilizando para generarlas, las instrucciones de desplazamiento y/o aritméticas. 1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45 11. Lo mismo que el ejercicio anterior con la siguiente secuencia: 3, 6, 12, 24, 48, 92, 172, 1, 3, 6, 9, 12, 15, 18, 21, 24 M.I. Alfredo Santillana Cedillo Acceso a bits individual • mikroC te permite acceso individual en variables de 8 bits (char and unsigned short). Simplemente usando el selector (.) seguido de uno de los identificadores F0, F1, … , F7, siendo F7 el bit mas significativo. • Ejemplo: // Si RB0 es uno, colocar en uno la terminal RC0: if ( PORTB.F0 ) PORTC.F0 = 1; Los Identificadores F0–F7 no se reconocen en minúsculas. M.I. Alfredo Santillana Cedillo Practica No. 12 Secuencias condicionadas ( problema ) • Realizar un programa que envíe secuencias distintas al puerto D, dependiendo del valor de la terminal RA0. Si RA0 es igual a cero se envía la serie de dos bits desplazados hacia la izquierda, mientras que si RA0 es igual a 1 entonces se envía la serie de tres bits desplazados hacia la derecha. M.I. Alfredo Santillana Cedillo Secuencias condicionadas (algoritmo) 1. Configuración de puertos 2. Inicia contador 3. Si RA0 es igual a 0 entonces envía secuencia_izquierda 4. De lo contrario envía secuencia_derecha 5. Incrementa contador 6. Si contador es igual a 8 entonces contador igual a 0 7. Regresa a 3 M.I. Alfredo Santillana Cedillo Secuencias condicionadas (diagrama de flujo) Luces Envía secuencia_izquierda Configura puertos RD salida, RA entrada Incrementa contador Limpia contador si si Contador = 10 RA0 = 0 no no M.I. Alfredo Santillana Cedillo Envía Secuencia_derecha Limpia contador Secuencias condicionadas (programa) short izquierda[10] = { 0, 1, 3, 6, 12, 24, 48, 96, 192, 128 }; short derecha[10] = { 128, 192, 226, 102, 56, 28, 14, 7, 3, 1 }; void main ( void ) { TRISD = 0; ADCON1 = 6; TRISA = 0x7F; Contador = 0; for ( ; ; ) { Delay_ms ( 500 ); if ( PORTA.F0 = = 0 ) PORTD = izquierda [ contador]; else PORTD = derecha [ contador]; contador + + ; If ( contador = = 10 ) contador = 0; } M.I. Alfredo Santillana Cedillo } Practica No. 13 13. El alumno desarrollara un programa que envíe una secuencia de números BCD a un display de 7 segmentos ubicados en el puerto D. Si la terminal RA1 ubicada en el puerto A, es igual a 0, la numeración debe ser incremental; en caso contrario debe decrementarse. M.I. Alfredo Santillana Cedillo Practica No.13 (esquemático) M.I. ALFREDO SANTILLANA CEDILLO.