Sei sulla pagina 1di 6

REPUBLICA BOLIVARIANA DE VENEZUELA

I.U.P. SANTIAGO MARIÑO

ESCUELA DE INGENIERIA ELECTRONICA

CATEDRA DE SISTEMAS DIGITALES II

Integrantes:

Ricrado Campos C.I 15404612

Andy Molina C.I 16678943

Enero de 2018
Objetivo:

Se desea comprobar el funcionamiento del PIC 18f4550 para el accionamiento de 3 leds por
medio de 3 pulsadores definiendo puertos y activando variables o fuses para configurar
determinados aspectos del PIC por medio del lenguaje de programación C CCS.

Definiciones principales:

Include:

Define el archivo header del microcontrolador empleado. Para el caso del presente proyecto el
microcontrolador a emplear es el PIC 18f4550.

El nombre de la librería debe declararse en el encabezado de la función main mediante la


directiva #include< >. Si se usan comillas " " en el nombre del archivo, el compilador lo busca
en la carpeta del proyecto creado desde MPLAB. Si se usan brackets < >, entonces lo busca en
la carpeta de instalación del compilador.

Fuses:

Son "variables" que alojan determinadas funciones del PIC, sirven para configurar ciertos
aspectos del microcontrolador. Cada FUSE activa o desactiva una opción de funcionamiento.

Este código lo hemos escrito en lo que se conoce en la jerga técnica como “codigo en C nativo”
ya que usamos las funciones de control de entrada / salida de CCS El código inicia siempre en
lo que se conoce como “cabecera”, es decir el principio. En esta cabecera encontraremos
instrucciones dirigidas al compilador y no al microcontrolador, dichas instrucciones se
denominan “directivas”.

Las directivas se diferencian de las instrucciones en que:

• Siempre se encuentran en la cabecera del programa

• Todas comienzan con el símbolo del numeral #


DESARROLLO DEL PROGRAMA Y MARCO TEORICO

En nuestro caso estas son las directivas:

#include <18f4550.h>

#use delay(crystal=20000000) //configura fusibles de configuración

#fuses XT //Oscilador a cristal estándar

#fuses NOBROWNOUT //sin brownout

#fuses nofcmen. //detector de falla del oscilador principal apagado

La directiva #include, nos permite decirle al compilador para que microcontrolador hemos
escrito el código. Seguidamente con la directiva #use delay(crystal=20000000) le indicamos a
que frecuencia esta funcionando nuestro oscilador. El orden de las directivas es crucial ya que
siempre primero debemos indicarle al compilador cual es el PIC que estamos usando y luego
cual es la frecuencia del oscilador. Posteriormente podemos agregar el resto de directivas. Si
esto no se respeta podemos tener errores en el proceso de compilación sobre todo cuando
usamos alguna función propia del compilador (llamadas funciones embebidas) para manejar
algún periférico, y que la misma necesita saber la frecuencia del oscilador. La directiva puede
tener distintas formas ya que amolda la configuración interna a la frecuencia que le indicamos.
Anteponiendo la palabra NO al fusible de configuración (así se llama al seteo de las
propiedades), se le informa al compilador que el fusible en cuestión está desactivado, mientras
que colocando solo el nombre activamos la propiedad. Por otra parte para activar o desactivar
los distintos fusibles se puede realizar en varias líneas (como en el ejemplo) o se pueden activar
y desactivar en una sola línea separando cada fusible con comas

Ejem: #fuse NOWDT,HS,NOPUT,NOLVP,NOMCLR,NOPROTECT,NOBROWNOUT.

La cabecera además puede incorporar redefinición de nombres de pines, definición de variables


y constantes. Y prototipo de funciones.

Finalizada la cabecera, se escribio el código, que es el que se traducirá en instrucciones al


microcontrolador luego del proceso de compilación. En nuestro caso nuestro código es bastante
sencillo:

void main(void)

{ //abrimos la función principal

port_b_pullups (true); // activamos las resistencias pullups en las entradas del puerto B

while(1) //creamos un bucle infinito

{ //abrimos el bucle
while(!input(PIN_B3)) // creamos un bucle para el pin 3 y 0

{ // Si se presiona RB3

output_toggle(PIN_B0); // Cambia el estado del pin RB0

delay_ms(100); // Retardo antirebotes

while(!input(PIN_B3));

while(!input(PIN_B4)) //creamos un bucle para el pin 4 y 1

{ // Si se presiona RB4

output_toggle(PIN_B1); // Cambia el estado del pin RB1

delay_ms(100); // Retardo antirebotes

while(!input(PIN_B4));

while(!input(PIN_B6)) //creamos un bucle para el pin 6 y 2

{ // Si se presiona RB6

output_toggle(PIN_B2); // Cambia el estado del pin RB2

delay_ms(100); // Retardo antirebotes

while(!input(PIN_B6));

} // Cerramos bucle

} // cerramos bucle infinito

} // cerramos función principal

} //cerramos el bucle

} //cerramos la función principal

Todo programa siempre inicia en una rutina principal. En el lenguaje C las rutinas se denominan
funciones. Las funciones son un conjunto de sentencias u ordenes que realizan una operación
determinada, como lo hacen las rutinas, sin embargo las funciones tiene una característica extra;
a ellas se les puede pasar valores de variables para que las procesen, y son capaces de
devolvernos los resultados de dichos procesos.

Todo programa C siempre inicia en la función principal, la cual se denomina main. Dicho
nombre no puede ser distinto, todo programa debe tener una función main, de lo contrario el
compilador nos indicará un error. La función encierra una serie de sentencias, las cuales forman
el bloque de dicha función. Dicho bloque inicia con una llave { y finaliza con otra llave }. Entre
estas dos llaves se encuentran las sentencias y las estructuras lógicas.

La función main es una función especial ya que no puede recibir ningún valor, ni tampoco
puede devolver uno. Por lo tanto va acompañada por la palabra void lo cual en el lenguaje C
significa vacío; es decir que no devuelve ningún valor.

La primera línea o sentencia le indica al compilador que debe activar las resistencias en
configuración pullup del puerto B.

Es importante resaltar que las etiquetas siempre van en mayusculas, mientras que las
instrucciones se escriben en minúscula. Es muy importante que se respete el orden mayúscula-
minúscula pues el compilador es sensible a ello. Si escribimos una instrucción con mayúscula,
NO LA IDENTIFICARÁ. Debe observarse también que las sentencias siempre terminan con un
punto y coma. La siguiente sentencia de nuestro código es una instrucción estructural:

While; El while es una instrucción condicional la cual determina la ejecución de una o mas
instrucciones en tanto y en cuanto se cumpla una condición, la cual se encierra entre paréntesis.
En programación, si una condición se cumple, se dice que es verdadera, y esto se simboliza con
el número 1; por el contrario, si la condición no se cumple, es falsa y se simboliza con el
número 0. En un while, lo que este dentro del bloque del mismo, se ejecutará, siempre que la
condición de verdadera, caso contrario no se ejecutará ninguna sentencia que se encuentre
dentro del while. Es decir que las sentencias encerradas dentro del bloque while (limitado por
las llaves{}), se ejecutaran por siempre. Observe que dentro del while usamos también
funciones embebidas: output_toggle, Estas son funciones de salida de datos, se encargan de
poner en uno o en cero un puerto. Entre paréntesis le indicamos el PIN a encender o apagar

A continuación presentamos el código que se escribió para el proyecto pedido:

Encender 3 leds por medio de 3 pulsadores utilzando el PIC 18f4550. Cada led debe cambiar su
estado y mantenerlo al accionar el pulsador y cambiarlo al accionar de nuevo el pulsador
correspondiente.

#include <18f4550.h>

#fuses xt, nowdt, nofcmen, nobrownout

#use delay(crystal = 20MHz)

void main(void)

port_b_pullups(true);

while(true)
{

while(!input(PIN_B3))

{ // Si se presiona RB3

output_toggle(PIN_B0); // Cambia el estado del pin RB0

delay_ms(100); // Retardo antirebotes

while(!input(PIN_B3));

while(!input(PIN_B4))

{ // Si se presiona RB4

output_toggle(PIN_B1); // Cambia el estado del pin RB1

delay_ms(100); // Retardo antirebotes

while(!input(PIN_B4));

while(!input(PIN_B6))

{ // Si se presiona RB6

output_toggle(PIN_B2); // Cambia el estado del pin RB2

delay_ms(100); // Retardo antirebotes

while(!input(PIN_B6));

Potrebbero piacerti anche