You are on page 1of 23

Programacin C18 - FACULTAD DE INGENIERIA

UNIVERSIDAD DE PIURA

2015

Programacin C18 - FACULTAD DE INGENIERIA

Programacin C18

Contenido
Control de un Display..................................................................................... 3
Conceptos Bsicos:..................................................................................... 3
Descripcin del Circuito:.............................................................................4
Programacin:............................................................................................. 5

Programacin C18
Control de un LED mediante un pulsador
Conceptos Bsicos:

LED (Light-Emitting-Diode): un LED resulta no ser ms que un


diodo, la diferencia con un diodo comn radica en que al estar
polarizado directamente este libera energa en forma de
fotones. Este efecto es llamado electroluminiscencia, el color de
la luz se determina a travs de la banda de energa del
semiconductor.

Descripcin del circuito:

Elementos:
o PIC 18f4550:
o RES:
o LED:
o BUTTON:

Explicacin:
o Se alimenta al microcontrolador mediante la fuente de
poder (POWER) conectada al pin 1, por defecto este
entrega 5V, los necesarios para la alimentacin del
microcontrolador.
o Se conecta un pulsador, el cual uno de sus extremos se
conecta a un POWER y el otro extremo se conecta al pin
RA0 del microcontrolador. Cuando el BUTTON sea pulsado
comunicara una seal de 5V o 1L al PIC, caso contrario la
seal que recibe el PIC ser de 0V o 0L.
o El ejercicio consiste en configurar el pin RA0 como
entrada al microcontrolador, este deber leer la entrada
lgica que registra en este puerto y mostrarla en el pin
RD0

Microcontrolador
Resistencias de 330R y 1K
LED de color rojo para nuestro ejemplo
Botn pulsador

Programacin:

#include <p18f4550.h>
#include <config.h>
uC
void main (void)
{
ADCON1=0x0F;
TRISAbits.TRISA0=1;
TRISDbits.TRISD0=0;
LATDbits.LATD0=0;

//incluimos la libreria del uC


//inlcluimos la libreria que define los parametros de trabajo del

//Todas son definidas como entradas/salidas digitales


//Pin RA0 es definido como entrada (input)
//Pin RD0 es definido como salida (output)
//La salida RD0 se establece en 0 lgico

Control de un Display
while(1)
Conceptos
Bsicos:
{
LATDbits.LATD0=PORTAbits.RA0;
entrada RA0
}
}

//La salida del Pin RD0 toma el valor lgico de la

1. Como primer paso en la programacin se incluye las libreras del


microcontrolador al igual que la librera que define los parmetros de
trabajo del microcontrolador.
2. Al ingresar al programa principal o main lo primero es realizar la
configuracin de los pines de trabajo en el microcontrolador. A
continuacin se detalla la configuracin empleada
a. ADCON1: comando que permite configurar los pines de trabajo
como entradas/salidas digitales, es decir, en cada pin solo se
podr leer 0L o 1L.
b. TRIS: comando que permite configurar los pines de trabajo
como entradas o salidas, escribiendo 1 0 respectivamente. La
sintaxis tiene dos formas: configurar todo el puerto o hacer una
configuracin por bit.
i. TRISA = 1; con esta sintaxis configuro TODOS los bits
del Puerto A como entradas.
ii. TRISAbits.RA0 = 1; con esta sintaxis configuro el bit
RA0 del Puerto A como entradas.
c. LAT: comando que me permite escribir valores lgicos 0L o 1L
en los pines configurados como salidas. Su sintaxis es parecida
a la del TRIS, por lo tanto se puede configurar todo el puerto o
solo los pines deseados.
3. Ingresa al bucle infinito, que me permitir repetir infinitas veces las
lneas de programacin en el incluidas. Para nuestro ejercicio
recoger infinitas veces el valor lgico que posea el pin RA0, pin
donde est conectado el pulsador, y lo escribir en el pin RD0, pin
donde est conectado el LED. De esta forma se encender el LED
cada vez que presionemos el pulsador.

LED secuenciales empleando Delays


Conceptos Bsicos:

Para el siguiente ejemplo se utilizara los 8 pines del Puerto D,


de tal manera que se utilizara como una variable de 8 bits, en
la cual se escribir el valor binario de una variable, por
ejemplo al copiar el valor de una variable i que sea igual a 19
en el Puerto D se escribir 00010011 siendo RD0 el bit menos
significativo.

Nmero
1
2
4
8
16
32
64
128

RD7
0
0
0
0
0
0
0
1

RD6
0
0
0
0
0
0
1
0

RD5
0
0
0
0
0
1
0
0

PUERTO D
RD4
RD3
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0

RD2
0
0
1
0
0
0
0
0

RD1
0
1
0
0
0
0
0
0

Descripcin del Circuito:

Elementos:
o PIC 18f4550:
Microcontrolador
o RES16DIPIS:
Barra de 9 resistencias
o LED-BARGRAPH: Barra de 10 LED de color verde
o RES:
Resistencia de 1K

Explicacin:
o Se alimenta al microcontrolador mediante la fuente de
poder (POWER) conectada al pin 1, por defecto este
entrega 5V, los necesarios para la alimentacin del
microcontrolador.
o El ejercicio consiste en configurar el puerto D como salida,
y copiar el valor de una variable i en este puerto, para
que sus valores lgicos enciendan uno a uno los
segmentos de la barra de LED de tal forma que se aprecie
un desplazamiento secuencial descendente.
o La funcin de la barra de resistencias es generar una
cada de tensin en el voltaje que est llegando a los
pines de la barra de LED, para protegerlos.

Programacin:
#include <p18f4550.h>
//incluimos la libreria del uC
#include <delays.h> //inlcuimos la libreria de los delays para poder llamarlos a travs de
funciones
#include <config.h> //incluimos los parametros de configuracion del uC
int i=1;
void main (void)
{
ADCON1=0x0F;
TRISD=0x00;
LATD=0;
while (1)
{
while(i<255)
unico bit en 1L

//definimos una variable a utilizar

//Definimos que las entradas y salidas sern digitales


//Definimos todo el puerto D del PIC como salida (digital)
//Establecemos que el valor inicial del puerto D sea 0.

//Establecemos como condicion de funcionamiento que el

//este como maximo en la posicion 8 del puerto


{
LATD=i;
//El puerto D asume el valor de la variable i
Delay10KTCYx(250);
//Introducimos un retardo de 10*10e3 usegundos
i=i<<1;
//Desplazamos el nico bit en 1L de la variable hacia la
izquierda.
}
i=1;
//Superado el valor de 255, establecemos el valor de la variable en 1

1. Como primer paso en la programacin se incluye las libreras


del microcontrolador al igual que la librera que define los
parmetros de trabajo del microcontrolador, para este ejercicio
en particular se debe utilizar retrasos o delays por lo que
incluiremos tambin estas libreras.
2. Como segundo paso definiremos la variable i que almacenara
los valores mostrados en la tabla al inicio del ejercicio. El
objetivo de almacenar estos valores en una variable es
mostrarlos en el Puerto D y la condicin en comn que poseen
es que todos ellos tienen uno de sus 8 bit con valor de 1L y los
dems con valor de 0L, los cuales ordenados secuencialmente
darn el efecto de un desplazamiento secuencial del LED
encendido. A continuacin algunas consideraciones para esta
variable:
a. Estamos definiendo la variable i como una variable tipo
int con lo cual estamos asignando un espacio de 16 bits
para esta variable, esto quiere decir que con ella
podemos abarcar desde 0 hasta 65535, en nuestro caso
al copiarlo en el Puerto D solo recoger los 8 bits menos
significativos.
b. Adems debemos generar una proteccin para limitar el
valor de i, esto lo explicaremos ms adelante.
3. Entramos al programa principal o main, lo primero que
debemos hacer aqu es establecer la configurar todos los pines
de trabajo, para este ejemplo al igual que el anterior
utilizaremos los comandos ADCON1, TRIS, LAT.
4. Ingresamos al bucle infinito, dentro de l nos encontramos con
dos alternativas referidas a la variable i, esto es parte de la
proteccin que mencionamos antes , tenemos:
a. Cuando el valor de i es menor que 255, haciendo uso del
comando LAT copiamos el valor de i en el Puerto D, a
continuacin introducimos un retraso de 10ms, luego
haciendo uso del operacional << desplazamos el nico
bit de la variable i que se encuentra en 1L y se reescribe
sobre la variable i, dando el efecto de desplazamiento en
la barra de LED, todo esto se repite mientras se cumpla la
condicin. Aqu un diagrama de lo que pasa:

b. Cuando el valor de i no cumple la condicin escrita, en este


momento sale del bucle comentado en el apartado a y pasa a
la siguiente instruccin que es: hacer la variable i igual a 1,
como es evidente esto har que en la siguiente iteracin se
cumpla la primera condicin y el programa volver a realizar la
secuencia antes graficada.
NOTA: es importante entender el porqu de esta proteccin.
Recordemos que la variable i es una variable tipo int, por lo
tanto maneja 16 bits, entonces una vez que el valor de 1L de la
variable se encuentre en el bit RD7, al desplazarse un bit ms
a la izquierda la variable i asumir el valor que le corresponde,
pero en nuestra representacin observaramos toda la barra de
LED apagada, pues los 8 bits que estamos representando estn
en 0L.

10

LED secuenciales empleando timers


Conceptos Bsicos:

11

Interrupciones: una interrupcin es un evento que requiere


que el CPU detenga su programa normal en ejecucin y
desarrolle algn servicio relacionado con el evento 1. Una
interrupcin puede ser generada externamente, por ejemplo
cuando bit capacitado para generar una interrupcin cambia de
estado lgico, o internamente, por ejemplo por desbordamiento
de un timer. Aqu una analoga del funcionamiento de una
interrupcin:
o Como actuarias cuando estas sentado en tu escritorio
leyendo un libro y el telfono empieza a sonar.
Probablemente actuarias as:

Recordaras la pgina que estabas leyendo o


ubicaras alguna referencia, luego cerraras el libro y
lo colocaras aparte.
Contestaras el telfono y diras Hola, .
Esperaras a reconocer la voz del que est hablando
y si es familiar responderas de inmediato.
Hablaras con esta persona.
Colgaras el telfono cuando terminas de hablar con
esta persona.
Abriras el libro y regresaras a la pgina que
estabas leyendo.

De manera similar funcionan las interrupciones dentro de un


microcontrolador, termina la instruccin que est realizando,
guarda la direccin de la siguiente instruccin, realiza la rutina
de interrupcin y una vez terminada regresa a la direccin
guardada.

1 Fuente: pic microcontroller - an introduction to software and hardware


interfacing Cap. 6 Pag. 244

12

Descripcin del Circuito:

Elementos:
o PIC 18f4550:
Microcontrolador
o RES16DIPIS:
Barra de 9 resistencias
o LED-BARGRAPH: Barra de 10 LED de color verde
o RES:
Resistencia de 1K

Explicacin:
o Se alimenta al microcontrolador mediante la fuente de
poder (POWER) conectada al pin 1, por defecto este
entrega 5V, los necesarios para la alimentacin del
microcontrolador.
o El ejercicio consiste en configurar el puerto D como salida,
y copiar el valor de una variable i en este puerto, para
que sus valores lgicos enciendan uno a uno los
segmentos de la barra de LED de tal forma que se aprecie
un desplazamiento secuencial descendente.
o La funcin de la barra de resistencias es generar una
cada de tensin en el voltaje que est llegando a los
pines de la barra de LED, para protegerlos.

13

Programacin:
#include <p18f4550.h>
#include <config.h>
#include <timers.h>
int i=1;
//Definimos una variable tipo int llamada i cuyo valor inicial es 1
int second_counter = 900;
//Definimos una variable tipo int llamada second_counter cuyo
valor inicial es 900
void Interruption_Timer0();//Definimos una subrutina llamada Interruption_Timer0
#pragma code Interrupcion = 0X0008 // Creamos una nueva seccin de cdigo a partir de la
direccin 0x08
void VectorInterrupcion(void){
Interruption_Timer0(); // enlazamos al vector interrupcin
}
#pragma code
// Cerramos seccin.#pragma interrupt Interruption_Timer0 //configuramos Interruption_Timer0 como subrutina por
interrupcin
void Interruption_Timer0(void){
if(INTCONbits.TMR0IF==1) //Nos aseguramos que la interrupcin sea por desbordamiento
del TIMER0
{
INTCONbits.TMR0IF=0; //Regresamos el bit de bandera a 0
WriteTimer0(60);
//Empezamos el contador en 60
second_counter++;
//Aumentamos en 1 el valor de la variable second_counter
if(second_counter==965)
//Esperamos que la variable second_counter sea igual a
965
{
second_counter=0;
//Regresamos a 0 la cuenta de la variable second_counter
LATD=i;
//El puerto D asume el valor de la variable i
if(i<255)
//Establecemos como condicin de funcionamiento que el unico bit en
1L
{
//este como mximo en la posicin 8 del puerto
i=i<<1;
//Desplazamos el nico bit en 1L de la variable hacia la izquierda.
}else
{
i=1;
//Superado el valor de 255, establecemos el valor de la variable en 1
nuevamente
}
}
}
}
void main (void)
{
ADCON1=0x0F;
TRISD=0x00;
LATD=0;
INTCONbits.GIE=1;
RCONbits.IPEN=0;
INTCONbits.T0IE=1;
INTCONbits.PEIE=1;

//Definimos que las entradas y salidas sern digitales


//Definimos todo el puerto D del PIC como salida (digital)
//Establecemos que el valor inicial del puerto D sea 0.
//Global Interruption Enable
//no hay prioridad de interrupciones
// TIMER0 Interruption Enable
// PEripherical Interruption Enable
//Configuramos el OpenTimer0
OpenTimer0(TIMER_INT_ON&T0_8BIT&T0_SOURCE_INT&T0_EDGE_FALL&T0_PS_1_256);

14

1. Como primer paso en la programacin se incluye las libreras

del microcontrolador al igual que la librera que define los


parmetros de trabajo del microcontrolador, a diferencia del
ejemplo anterior esta vez se utilizara contadores internos o
timers por lo que incluiremos tambin estas libreras.
2. Complementando al ejemplo anterior adems de definir la

variable i,
esta vez tambin definiremos la variable
second_counter tipo int, debido a que el PIC no permite
trabajar con retrasos de tiempo muy grandes una alternativa de
solucin es acumular los tiempos de espera, en este caso
acumulados en la variable secon_counter.
3. Definimos la subrutina que se ejecutara una vez que el TIMER0

haya terminado su cuenta. Este se enlaza con el vector


interrupcin Interruption_timer0 que es declarado como
subrutina de interrupcin mediante el comando interrupt
configurado al inicio de esa seccin.
4. Dentro de esta seccin, preguntamos si la interrupcin ha sido
producto del desbordamiento del timer0, esto atendiendo al
encendido del bit de bandera TMR0IF(Timer 0 Interruption Flag).

5. Luego se hace el bit TMR0IF igual a 0 para evitar conflictos,


escribimos el contador en 60 y almacenamos estos tiempos de
espera en la variable second_counter hasta hacerla igual a
965.
6. Una vez que la variable second_counter ha llegado a ser 965,
hacemos esta variable igual 0 y mostramos el valor de la
variable i en el Puerto D igual que en el ejemplo anterior.
Incluimos la proteccin ya comentada cuando el valor de i
supera el valor de 128 debe regresar a ser 1, para que se
encienda el LED en la primera ubicacin.
7. La configuracin del programa principal o main es similar a la
anterior, cabe explicar algunas adiciones:
a. INTCONbits.GIE=1; este comando me permite activar las
interrupciones globales, cuando es igual a 1, dentro de
estas se encuentran las producidas por desbordamiento
de TIMER.

15

b. RCONbits.IPEN=0; este comando me permite desactivar


la prioridad en las interrupciones, cuando es igual a 0, es
decir no hay un tipo de interrupcin que prevalezca.
c. INTCONbits.T0IE=1; activamos las interrupciones que
produce el desbordamiento del TIMER0, hacindolo igual
a 1.

d. INTCONbits.PEIE=1;

este commando nos permite activar


las interrupciones perifericas, al hacerlo igual a 1.

8. Pasamos a la configuracin del TIMER0:


a. TIMER_INT_ON: Activa las interrupciones producto del
desbordamiento del TIMER0.
b. T0_8BIT: Define el espacio del TIMER0, en este caso es de
8 bits por lo tanto tiene la capacidad de contar de 0 a
255.
c. T0_SOURCE_INT: Indicamos que la fuente de reloj que
utilizaremos es el reloj interno del PIC.
d. T0_EDGE_FALL: Configuramos el TIMER para reconocer el
desbordamiento en el flanco de bajada del pulso.
e. T0_PS_1_256: configuramos el pre escalar que me
ayudara en el clculo del tiempo requerido.

16

17

Control de un Display
Conceptos Bsicos:

Figura 1. Display nodo/Ctodo comn.

El primer concepto que debe quedar claro antes de empezar a


programar un display es la diferencia entre nodo comn y
ctodo comn, esta diferencia la explicaremos de una forma
sencilla a continuacin:
o nodo comn: como se aprecia en la Figura 1, esta
configuracin nos presenta todos los pines positivos, de
los LED que forman los segmentos del display,
conectados en un punto comn. Esto me indica que debo
conectar el pin del display a negativo para lograr que se
encienda.
o Ctodo comn: como se aprecia en la Figura 1, esta
configuracin nos presenta todos los pines negativos, de
los LED que forman los segmentos del display,
conectados en un punto comn. Esto me indica que debo
conectar el pin del display a positivo para lograr que se
encienda.

18

Descripcin del Circuito:

Elementos:
o PIC 18f4550:
Microcontrolador
o RES16DIPIS:
Barra de 8 resistencias
o 7SEG-MPX1-CC: Display de 7 segmentos con ctodo
comn

Explicacin:
o Se alimenta al microcontrolador mediante la fuente de
poder (POWER) conectada al pin 1, por defecto este
entrega 5V, los necesarios para la alimentacin del
microcontrolador.
o El ejercicio consiste en configurar el puerto D como
puerto de salida para los valores lgicos que influirn en
el encendido de los segmentos del display, al ser un
display de 7 segmentos con Ctodo Comn necesitamos
dar un valor de 1 lgico o 5V al pin correspondiente al
segmento del display para encenderlo.
o La funcin de la barra de resistencias es generar una
cada de tensin en el voltaje que est llegando a los
pines del display, para protegerlo.

19

Programacin:
#include <p18f4550.h>
#include <config.h>
#include <delays.h>
char number=0;
valor inicial es 0

//Definimos una variable tipo char llamada "number" cuyo

void main(void)
{
ADCON1=15; //Configuramos entradas/salidas digitales
TRISD=0x00; //Configuramos el puerto D como salida
TRISA=0x00; //Configuramos el puerto A como salida
LATD=0;
//Escribimos 0 en todos los pines del puerto D
LATA=0xff;
//Activamos los display a partir del Puerto A
while(1){
if(number==10){
//proteccin para evitar que la variable
number
number=0;
//supere el valor de 9
}
switch(number){

//seleccionamos el caso dependiendo del valor

de number
case 0:
LATD=0b00111111;
break;
case 1:
LATD=0b00000110;
break;
case 2:
LATD=0b01011011;
break;
case 3:
LATD=0b01001111;
break;
case 4:
LATD=0b01100110;
break;
case 5:
LATD=0b01101101;
break;
case 6:
LATD=0b01111101;
break;
case 7:
LATD=0b00000111;
break;
case 8:
LATD=0b01111111;
break;
case 9:
LATD=0b01101111;
break;

//mostramos 0 en el display

//mostramos 1 en el display

//mostramos 2 en el display

//mostramos 3 en el display

//mostramos 4 en el display

//mostramos 5 en el display

//mostramos 6 en el display

//mostramos 7 en el display

//mostramos 8 en el display

//mostramos 9 en el display

20

1. La primera parte de toda programacin en C consiste en llamar


todas las libreras necesarias, para nuestro ejercicio haremos
uso de un retraso o delay, entonces llamaremos a esta librera.
2. Como segundo paso para este ejercicio definiremos la variable
number, esta variable almacenara valores del 1 al 9 los
mismos que sern mostrados en el display. En este paso
debemos tener algunas consideraciones:
a. Estamos definiendo la variable number como una
variable tipo char con lo cual estamos asignando un
espacio de 8 bits para esta variable, esto quiere decir que
con ella podemos abarcar desde 0 hasta 255(desde
00000000 hasta 11111111 en binario).
b. Por condicin del problema, debemos crear una
proteccin para restringir los valores de esta variable. En
el momento en que number sea 10 el programa
automticamente deber asignarle el valor de 0.
3. Entramos al programa principal o main, lo primero que
debemos hacer aqu es configurar nuestros puertos de salida,
en este caso es el Puerto D que recoger los 8 bits de la
variable number, y los almacenara en sus pines desde D0
hasta D7, para luego comunicarlos con los pines del display.
Para empezar escribiremos cero en el Puerto D.
4. Ingresamos al bucle infinito que nos permitir repetir el conteo
de 0 a 9 innumerables veces.
5. Hacemos uso del condicional if para crear la proteccin antes
mencionada. Con este condicional lo que se pretende es:
preguntar para cada iteracin es number igual a 10?. Si
esta condicin se cumple reemplazaremos el valor de number
(igual a 10 en este momento) por 0, caso contrario omitimos
esta lnea y pasamos a la seleccin del caso en el que nos
encontramos.
6. Como se menciono anteriormente las resistencias nos sirven
solo como una proteccin, por ello no influirn demasiado en
nuestra programacin.
7.

Una vez creada la proteccin se asegura que solo se podr


tener 10 casos, cada uno se programara mediante el comando
switch. Bsicamente la configuracin de cada caso consiste en
escribir en cada pin del Puerto D 1L o 0L de tal forma que

21

enciendan en el display los segmentos necesarios para mostrar


el valor que posee number. Esto se puede apreciar mejor en la
siguiente tabla resumen:

Nmero
0
1
2
3
4
5
6
7
8
9

RD7
Dot
0
0
0
0
0
0
0
0
0
0

RD6
G
0
0
1
1
1
1
1
0
1
1

RD5
f
1
0
0
0
1
1
1
0
1
1

RD4
e
1
0
1
0
0
0
1
0
1
0

RD3
d
1
0
1
1
0
1
1
0
1
1

RD2
c
1
1
0
1
1
1
1
1
1
1

RD1
b
1
1
1
1
1
0
0
1
1
1

RD0
A
1
0
1
1
0
1
1
1
1
1

8. Antes de cerrar el bucle infinito incrementamos el valor de la


variable number, este valor incrementado ser mostrado en la
siguiente iteracin. Adems escribimos un retraso para poder
apreciar los cambios en el display, de no ser as ocurriran
demasiado rpido y observaramos todos los segmentos
encendidos siempre.

22

23

You might also like