ejercicios pic c compiler

14
MATERIAL DE ENSEÑANZA 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. 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); } } }

Upload: jhon-pichihua-h

Post on 26-Nov-2015

771 views

Category:

Documents


24 download

TRANSCRIPT

Page 1: Ejercicios Pic c Compiler

MATERIAL DE ENSEÑANZA 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.

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); }

}

}

Page 2: Ejercicios Pic c Compiler

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:

Page 3: Ejercicios Pic c Compiler

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.

Page 4: Ejercicios Pic c Compiler

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:

Page 5: Ejercicios Pic c Compiler

#BYTE TRISA = 0x05 // trisb en 85h.

#BYTE PORTA = 0x05 // portb en 85h.

#BYTE TRISB = 0x06 // 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);

Page 6: Ejercicios Pic c Compiler

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) // Si el pulsador conectado en RA0 es cero "0" ; input(pin_a0)

{A++;

Page 7: Ejercicios Pic c Compiler

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);

}

Page 8: Ejercicios Pic c Compiler

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);

Page 9: Ejercicios Pic c Compiler

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);

Page 10: Ejercicios Pic c Compiler

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

Page 11: Ejercicios Pic c Compiler

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 ascendente-

descendente 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