You are on page 1of 11

MATERIAL DE ENSEANZA 09

EJERCICCIOS RESUELTOS CON EL COMPILADOR PIC C COMPILER

1.

OBJETIVO. Programar Microcontroladores con lenguaje de alto nivel PIC C COMPILER Familiarizarse con las instrucciones del compilador PIC C COMPILER. Editar y compilar programas para Microcontroladores PIC

2.

EJERCICIOS. como entrada. De manera tal que: portA.0 =1 se enciende todos los leds de salida portA.0 =0 se apaga todos los leds de salida.

2.1 Por el puerto B, que acta como salida es controlado por el bit 0 del puerto A, que acta

SOLUCION: void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // TODO: USER CODE!! for(;;) { if((input(pin_a0))==1) { output_b(0b11111111); } else if((input(pin_a0))==0) { } } output_b(0b00000000); }

2.2 Prender y apagar un led cada 0.5 segundos con un 16F84A por RB0

SOLUCION: void main() { int x=500; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); set_tris_b(0b00000000); output_b(0x00); // TODO: USER CODE!! for(;;) { // if(input(pin_a0)==0) { delay_ms(x); output_b(0x01); delay_ms(x); output_b(0x00); } }}

2.3 Prender y apagar 4 leds cada segundo (RB0 a RB3). 0,5 segundos prendido y 0,5 segundos apagado con un 16F84A

SOLUCION: void main() { int x=500; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // TODO: USER CODE!! set_tris_b(0b00000000); output_b(0x00); for(;;) { delay_ms(x); output_b(0b1111); delay_ms(x); output_b(0b0000); } }

2.4 Segn el estado de los interruptores RA0 y RA1, activar los leds RB0-RB7 conectados a la puerta B, conforme a la siguiente tabla de la verdad:

SOLUCION: void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // TODO: USER CODE!! output_b(0x00); // poniendo 0 a todos los bits del puerto b set_tris_a(0x3F); //todos los bits como entrada set_tris_b(0x00); //todos como salida while(true) { switch(input_a() & 0b00000011) { case 0: output_b(0b10101010);break; case 1: output_b(0b01010101);break; case 2: output_b(0b00001111);break; case 3: output_b(0b11110000);break; default:; delay_ms(100); } } }

2.5 Una lmpara conectada en RB0 se controla mediante dos interruptores conectados en RA0 y RA1. Cuando cualquiera de los interruptores cambie de estado, la lmpara tambin lo har. SOLUCION: void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // TODO: USER CODE!! output_b(0x00); set_tris_a(0x3F); set_tris_b(0x00);

output_low(pin_b0); // INICIO DEL BUCLE DEL PROGRAMA. for(;;) { { if((input(pin_a0)==0) && (input(pin_a1)==0)) output_low(pin_b0); }

else if((input(pin_a0)==1) && (input(pin_a1)==0)) { output_high(pin_b0); }

else if((input(pin_a0)==0) && (input(pin_a1)==1)) { output_high(pin_b0); }

else if((input(pin_a0)==1) && (input(pin_a1)==1)) { output_low(pin_b0); } } }

2.6 Una lmpara conectada en RB0 se controla mediante 3 interruptores conectados en RA0, RA1 y RA2. Cuando 2 interruptores estn en estado alto se activara la salida RB0, en otra condicin la salida estar apagado. SOLUCION: void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // TODO: USER CODE!! output_b(0x00); // poniendo 0 a todos los bits del puerto b set_tris_a(0x3F); //todos los bits como entrada set_tris_b(0x00); //todos como salida for(;;) { } else if((input(pin_a1)==1) && (input(pin_a2)==1) && (input(pin_a0)==0)) { } else if((input(pin_a0)==1) && (input(pin_a2)==1) && (input(pin_a1)==0)) { } else { } } output_b(0b00000000); } output_b(0b00000001); output_b(0b00000001); if((input(pin_a0)==1) && (input(pin_a1)==1) && (input(pin_a2)==0)) { output_b(0b00000001);

2.7 Efecto de luces tipo Auto Fantstico con un 16F84A por el puerto b, RB0 a RB7. SOLUCION: #BYTE TRISA = 0x05 #BYTE PORTA = 0x05 #BYTE TRISB = 0x06 #BYTE PORTB = 0x06 void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); // TODO: USER CODE!! while (TRUE) {output_b(0b00000001); delay_ms(100); output_b(0b00000010); delay_ms(100); output_b(0b00000100); delay_ms(100); output_b(0b00001000); delay_ms(100); output_b(0b00010000); delay_ms(100); output_b(0b00100000); delay_ms(100); output_b(0b01000000); delay_ms(100); output_b(0b10000000); delay_ms(100); output_b(0b01000000); delay_ms(100); // trisb en 85h. // portb en 85h. // trisb en 86h. // portb en 86h.

#BYTE OPTION_REG = 0x81 // OPTION_REG EN 81h.

output_b(0b00100000); delay_ms(100); output_b(0b00010000); delay_ms(100); output_b(0b00001000); delay_ms(100); output_b(0b00000100); delay_ms(100); output_b(0b00000010); delay_ms(100); } }

2.8 Disee un contador de 8 bits, que se incrementa cada vez que se pulsa P (RA3). Visualice el resultado por el puerto B. Activar un led (RA0), cuando el contador llegue a D125 y pagarlo cuando llegue a D221. Repetir el ciclo. SOLUCION: // declaracion de variables. #BYTE TRISA = 0x05 #BYTE PORTA = 0x05 #BYTE TRISB = 0x06 #BYTE PORTB = 0x06 int A=0; void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); //Setup_Oscillator parameter not selected from Intr Oscillotar Config tab // TODO: USER CODE!! output_b(0x00); output_bit(pin_a0,0); while(true) // Bucle Infinito // Todo el Puerto B estara apagado // trisa en 85h. // porta en 85h. // trisb en 86h. // portb en 86h.

{if(bit_test(porta,3)==0) input(pin_a0) {A++; output_b(A); delay_ms(100); if(a==256) {A=0; } if(a==125) {output_high(pin_a0); } if(a==221) {output_low(pin_a0); } } }

// Si el pulsador conectado en RA0 es cero "0" ;

// Muestro "A" por el Puerto B // Retardo

2.9 Utilizando un PIC16F877 realice un Juego de Luces de 8 leds, donde por medio de un Pulsador de Inicio el Juego se coloque en funcionamiento. El Juego se comportara de la siguiente manera: Los leds inicialmente se encendern solo uno a la vez en secuencia, de izquierda a derecha y de derecha a izquierda; Este proceso lo realizara 5 veces, donde al terminar pasara a la siguiente secuencia que se comportara de la siguiente manera: El secuenciador ser de 8 leds donde encendern uno por uno, y al estar todos encendidos se apagaran; Este Proceso se realizara 4 veces. Luego todo este proceso se realizara nuevamente. Nota: Utilice las instrucciones RLF y RRF. SOLUCION: void main() { int i=1,ii=1,h=1; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); set_tris_d(0b00000000); for(;;) { if(input(pin_b0)==1)

{ output_d(0b00000000); delay_ms(100); } else if(input(pin_b0)==0) { for(i==1;i<=5;i++) { output_d(0b10000000); delay_ms(70); output_d(0b01000000); delay_ms(70); output_d(0b00100000); delay_ms(70); output_d(0b00010000); delay_ms(70); output_d(0b00001000); delay_ms(70); output_d(0b00000100); delay_ms(70); output_d(0b00000010); delay_ms(70); output_d(0b00000001); delay_ms(70); output_d(0b00000010); delay_ms(70); output_d(0b00000100); delay_ms(70); output_d(0b00001000); delay_ms(70); output_d(0b00010000); delay_ms(70); output_d(0b00100000); delay_ms(70); output_d(0b01000000); delay_ms(70); output_d(0b10000000); delay_ms(70); output_d(0b00000000); delay_ms(100);

if(i==5) { for(ii==1;ii<=4;ii++) { output_d(0b10000000); delay_ms(70); output_d(0b11000000); delay_ms(70); output_d(0b11100000); delay_ms(70); output_d(0b11110000); delay_ms(70); output_d(0b11111000); delay_ms(70); output_d(0b11111100); delay_ms(70); output_d(0b11111110); delay_ms(70); output_d(0b11111111); delay_ms(70); output_d(0b00000000); delay_ms(100); } i=1; ii=1; } } } } 2.10 Utilizando un PIC16F877 realice un Contador de 4 en 4 que cuando llegue a 40 realice el encendido de una alarma por medio del Pin RA4, luego de ello se debe realizar el contador de 4 en 4 de forma descendente y al terminar se debe realizar todo el proceso nuevamente. SOLUCION: #include <lcd.c> void main() { int a=0,i=0; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF);

setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); // TODO: USER CODE!! // set_tris_a(0x3F); //todos los bits como entrada set_tris_a(0x00); while (true) { a=0; i=0; for(i==1;i<=10;i++) { lcd_init(); printf(lcd_putc,"%d",a); delay_ms(200); a=a+4; } output_a(0b00011000); delay_ms(200); output_a(0b00000000); a=40; i=0; for(i==0;i<=10;i++) { lcd_init(); printf(lcd_putc,"%d",a); delay_ms(200); a=a-4; } } }

3.

EJERCICIOS PROPUESTOS 1. Utilizando un PIC16F84, realice un contador binario de 5 a 55 por medio de leds, en bucle infinito. 2. Utilizando un PIC16F84 realice un secuenciador de 8 leds de izquierda a derecha y de derecha a izquierda por el Puerto B. Se deben ir encendiendo los leds de 3 en 3 en forma secuencial. (Mientras tres leds estn encendidos todos los dems estn apagados). El secuenciador a la izquierda se realiza por medio de la activacin de un suiche colocado en RA0 en activo bajo. El secuenciador a apagado 3. Se tienen 2 suiches que de acuerdo a las combinaciones de estos se realizaran uno de los siguientes procesos: Si el SW1 = 1 y SW2 =0 se realiza la intermitencia de 8 leds 10 veces. Si el SW1=0 y el SW2=1 encender 8 leds de 2 en 2 de adentro hacia fuera y de afuera hacia adentro. Este proceso se debe ejecutar 5 veces. Si el SW1=0 y el SW2=0 el valor actual del puerto debe mantenerse. Si el SW1=1 y el SW2=1 se realizara un contador de 6 en 6 hasta 36 4. Se desea tomar un numero introducido por el Puerto B y uno Introducido por el Puerto C para realizar lo siguiente: Realizar una operacin suma con ambos registros para luego realizar el siguiente: Si el resultado es menor de 50, se debe realizar un contador ascendentedescendente de 0 a 128 que realizara su funcin cada vez que se presione un pulsador colocado en RE0 para hacer un incremento o un pulsador colocado en RE1 para hacer un decremento. Cada vez que se presione el pulsador correspondiente se incrementara o excrementar solo un valor segn sea el caso. Muestreos por el Puerto D. Si resultado es mayor o igual de 50 se realizara la multiplicacin de este resultado por 4. Muestreos por el Puerto D. Si el resultado es mayor o igual de 100 se realizara 8 secuencias de luces diferentes por el puerto D Si el resultado es mayor o igual de 180 la puerto D permanecer apagado BIBLIOGRAFIA Eduardo Garca Breijo ---- Compilador C CCS la derecha se realiza por la activacin de un suiche colocado en RA1 en activo bajo. En otros estados de la entrada la salida cera

4.

You might also like