Microprocesadores y Microcontroladores Ingenieria Control Industrial

Anuncio
Microprocesadores y Microcontroladores Ingenieria Control Industrial
Experiencia No. 02 Microcontroladores
Título: Elementos básicos de código en C para un circuito programable con arquitectura Harvard
Objetivo: identificar componentes elementales de la arquitectura de un MCU PIC 16F877A y características básicas de
programas en lenguaje C.
Materiales: componentes de hardware, hoja de datos 16F877A, MPLAB, Grabador de MCU
Descripción.
Complete el circuito de la experiencia 1, de la sesión pasada, agregando un puerto de entrada como se muestra en la
Figura #2.1. Observe que se conectan solo 4 bits del puerto C. El circuito armado sobre un protoboard debe, al menos,
mostrar una presentación como se muestra en la figura #2.2.
Observación: en el diagrama esquemático no se muestra la alimentación, la cual debe ser conectada
4 MHz
22pFx2
Vdd=+5V
R>=4K7
4K7 x 8
comun
Vdd=+5V
comun
330R x 8
Figura #2.1
Proceda a conectar la alimentación del circuito y verificar su funcionamiento, de acuerdo al código que se muestra a
continuación. Analizar el programa y comprender su interacción con el hardware:
a.- Interacción entrada/salida
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main()
{
while(1)
{
while(input(PIN_C0))
{
output_high(PIN_D0);
delay_ms(50);
output_low(PIN_D0);
delay_ms(500);
}
output_low(PIN_D0);
}
}
Figura #2.2
JEA/jea/exp02.docx
1/4
Microprocesadores y Microcontroladores Ingenieria Control Industrial
A continuación se muestran programas que ilustran las sentencias típicas a ser usadas en aplicaciones construidas con
lenguaje C. Guarde en sus notas personales estos códigos, ya que son un resumen didáctico de todas las instrucciones del
lenguaje.
Analice y estudie estos códigos para una comprensión cabal. Proceda a compilar y cargar en el MCU todos estos programas
y ejecútelos en el circuito. Es obligatorio para superar esta experiencia que usted ejecute en el MCU, las rutinas desde la
(a) hasta la (j). Debe mostrar al profesor o ayudante la ejecución de cada una de estas rutinas
b.- Definición de una variable
/* VARI.C */
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main()
{
int x;
x=0x99;
output_D(x);
}
c.- Lazo iterativo indefinido
/*
ENDLESS.C */
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main() {
int x=0x00;
while(1)
{
output_D(x);
x++;
}
}
d.- Sentencia IF y lectura de entrada
/* IFIN.C */
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main() {
int x=0x00;
output_D(0);
while(1)
{
x = input(PIN_C0);
if(x==1)output_high(PIN_D0);
}
}
e.- Lazo iterativo condicional
/* WHILELOOP.C */
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main() {
while(1)
{
while(input(PIN_C0));
{ output_high(PIN_D0);
delay_ms(300);
output_low(PIN_D0);
delay_ms(500);
}
output_low(PIN_D0);
}
}
Nota: bajar manual de referencia del compilador desde http://www.ccsinfo.com/downloads.php#manuals
JEA/jea/exp02.docx
2/4
Microprocesadores y Microcontroladores Ingenieria Control Industrial
f.- Lazo iterativo con sentencia FOR
/* FORLOOP.C */
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=1000000)
void main()
{
int x;
while(input(PIN_C0)){};
for ( x=0; x<5; x++ )
{
output_high(PIN_D0);
delay_ms(500);
output_low(PIN_D0);
delay_ms(500);
}
while(1){};
}
g.- Sentencia CONTINUE y BREAK
/*
CONTINUE.C
*/
#include "16F877A.H"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main() {
unsigned outbyte;
restart: outbyte=0;
while(1)
{
output_C(outbyte);
delay_ms(10);
outbyte++;
if (!input(PIN_D0)) continue;
if (!input(PIN_D1)) break;
delay_ms(100);
if (outbyte==100) goto restart;
}
}
h.- Comparación entre la sentencia WHILE y DO-WHILE
/*
DOWHILE.C */
#include "16F877A.H"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main() {
int outbyte1=0;
int outbyte2=0;
int count;
count=0;
while (count!=0)
{
output_C(outbyte1);
outbyte1++;
count--;
}
count=0;
do
{ output_C(outbyte2);
outbyte2++;
count--;
} while (count!=0);
while(1){};
}
JEA/jea/exp02.docx
3/4
Microprocesadores y Microcontroladores Ingenieria Control Industrial
i.-Sentencia IF con ELSE
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main()
{
while(1)
{
if (!input(PIN_D0)) output_C(15);
else output_C(0);
}
}
j.- Sentencia Switch
/* Demo of SWITCH .. CASE comparado con IF .. ELSE */
#include "16F877A.h"
#fuses XT,PUT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay (clock=4000000)
void main() {
int8 entrada;
while(1)
{
entrada = input_D();
switch(inbits)
{
case 1: output_C(1);
break;
case 2: output_C(3);
break;
case 3: output_C(7);
break;
default:output_C(0);
}
if (input(PIN_D0)) output_C(1);
if (input(PIN_D1)) output_C(3);
if (input(PIN_D0) && input(PIN_D1))
output_C(7);
else
output_C(0);
}
}
JEA/jea/exp02.docx
4/4
Descargar