Professional Documents
Culture Documents
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); }
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.
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); } } }
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.