MATERIAL DE ENSEÑANZA 09
EJERCICCIOS RESUELTOS CON EL COMPILADOR PIC C COMPILER
1.
2.
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
EJERCICIOS.
2.1 Por el puerto B, que actúa como salida es controlado por el bit 0 del puerto A, que actúa 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.
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 Según 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 lámpara conectada en RB0 se controla mediante dos interruptores conectados en RA0 y RA1. Cuando cualquiera de los interruptores cambie de estado, la lámpara también 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 lámpara conectada en RB0 se controla mediante 3 interruptores conectados en RA0, RA1 y RA2. Cuando 2 interruptores están en estado alto se activara la salida RB0, en otra condición 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(;;) {
if((input(pin_a0)==1) && (input(pin_a1)==1) && (input(pin_a2)==0)) { output_b(0b00000001); } else if((input(pin_a1)==1) && (input(pin_a2)==1) && (input(pin_a0)==0)) {
output_b(0b00000001);
} else if((input(pin_a0)==1) && (input(pin_a2)==1) && (input(pin_a1)==0)) {
output_b(0b00000001);
} else { } }
output_b(0b00000000);
}
2.7 Efecto de luces tipo Auto Fantástico con un 16F84A por el puerto b, RB0 a RB7. SOLUCION: #BYTE TRISA = 0x05
// trisb en 85h.
#BYTE PORTA = 0x05 #BYTE TRISB = 0x06
// portb en 85h. // trisb en 86h.
#BYTE PORTB = 0x06
// portb en 86h.
#BYTE OPTION_REG = 0x81 // OPTION_REG EN 81h. 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);
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 Diseñe 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 D’125’ y pagarlo cuando llegue a D’221’. Repetir el ciclo. SOLUCION: // declaracion de variables. #BYTE TRISA = 0x05
// trisa en 85h.
#BYTE PORTA = 0x05
// porta en 85h.
#BYTE TRISB = 0x06
// trisb en 86h.
#BYTE PORTB = 0x06
// portb en 86h.
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);
// Todo el Puerto B estara apagado
output_bit(pin_a0,0); while(true)
// Bucle Infinito
{if(bit_test(porta,3)==0) input(pin_a0)
// Si el pulsador conectado en RA0 es cero "0" ;
{A++; output_b(A);
// Muestro "A" por el Puerto B
delay_ms(100);
// Retardo
if(a==256) {A=0; } if(a==125) {output_high(pin_a0); } if(a==221) {output_low(pin_a0);
} }
}
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 encenderán 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 encenderán 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 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 estén encendidos todos los demás están apagados). El secuenciador a la izquierda se realiza por medio de la activación de un suiche colocado en RA0 en activo bajo. El secuenciador a
la derecha se realiza por la activación de un suiche
colocado en RA1 en activo bajo. En otros estados de la entrada la salida cera 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 operación 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 función 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 según sea el caso. Muestreos por el Puerto D. Si resultado es mayor o igual de 50 se realizara la multiplicación 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
4.
BIBLIOGRAFIA
Eduardo García Breijo ---- Compilador C CCS