MATERIAL DE ENSEÑANZA 09 EJERCICCIOS RESUELTOS CON EL COMPILADOR PIC C COMPILER 1. 2. OBJETIVO. Programar Microco
Views 217 Downloads 1 File size 376KB
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