Вы находитесь на странице: 1из 60

PRACTICAS

0. Uso de MPLAB
1. E/S digitales
2. Decodificador BCD – 7 segmentos. (Switch-
case)
3. Instrucciones de temporización. (delay.c)
4. Timer0 (Timer).
5. Entradas analógicas.
6. Módulo PWM
7. Memoria EEPROM
8. Grabación de PICs con PIC-600 y USBURN
UTCJ JRJ 2
CIRCUITO

UTCJ JRJ
Práctica 0
Uso de MPLAB
Crear un proyecto en MPLAB para que el
PIC16F877A muestre el numero 4 en un
display de siete segmentos conectado al Puerto
D.

UTCJ JRJ 4
Práctica 0
Uso de MPLAB
a) Iniciar el asistente de proyecto

UTCJ JRJ 5
Práctica 0
Uso de MPLAB

UTCJ JRJ 6
b) Clic en Siguiente
Práctica 0
Uso de MPLAB

c) Seleccionar el PIC16F877A
UTCJ JRJ 7
Práctica 0
Uso de MPLAB

d) Seleccionar el compilador. HI-TECH C Compiler


UTCJ JRJ 8
Práctica 0
Uso de MPLAB

e) Crear nuevo proyecto. Clic en Browse.


UTCJ JRJ 9
Práctica 0
Uso de MPLAB

e) Crear nuevo proyecto. Escribir nombre del proyecto


UTCJ JRJ 10
(PRACT0 para este ejemplo) y clic en Guardar
Práctica 0
Uso de MPLAB

e) Crear nuevo proyecto. Clic en Siguiente.


UTCJ JRJ 11
Práctica 0
Uso de MPLAB

f) Clic en Siguiente.
UTCJ JRJ 12
Práctica 0
Uso de MPLAB

g) El proyecto se ha creado. Clic en Finalizar


UTCJ JRJ 13
Práctica 0
Uso de MPLAB
h) Crear un archivo nuevo. Clic en New File

UTCJ JRJ 14
Práctica 0
Uso de MPLAB
i) Capturar el programa

UTCJ JRJ 15
Práctica 0
Uso de MPLAB
j) Guardar el programa con el nombre de main0.c
Activar la casilla de Add File to Project

UTCJ JRJ 16
Práctica 0
Uso de MPLAB
k) Agregar la librería htc.h. Clic derecho en Header Files
de la ventana de proyecto

UTCJ JRJ 17
Práctica 0
Uso de MPLAB
l) Seleccionar la librería htc.h de
C:\Program files\HI-TECH Software\PICC\lite\9.60\include

UTCJ JRJ 18
Práctica 0
Uso de MPLAB
l) Se muestra el archivo htc.h incluido al proyecto

UTCJ JRJ 19
Práctica 0
Uso de MPLAB
m) Compilar el proyecto. Clic en el botón Build project.

UTCJ JRJ 20
Práctica 0
Uso de MPLAB

m) Resultado de la compilación

UTCJ JRJ 21
Práctica 0
Uso de MPLAB

n) En Proteus, dar doble clic


sobre el PIC16F877A
UTCJ JRJ 22
Práctica 0
Uso de MPLAB

o) Clic en el botón de la carpeta para agregar el


programa compilado para el PIC
UTCJ JRJ 23
Práctica 0
Uso de MPLAB

p) Seleccionar el archivo compilado,


tiene el nombre del proyecto en
MPLAB. Clic en Abrir.

UTCJ JRJ 24
Práctica 0
Uso de MPLAB
q) Cambiar la frecuencia del reloj a 20MHz. Clic en OK

UTCJ JRJ 25
Práctica 0
Uso de MPLAB

r) Clic en el botón Simular


UTCJ JRJ 26
Práctica 1

Por el puerto D se visualiza el valor del puerto


B

UTCJ JRJ 27
// Libreria general para las etiquetas
// de los regisros del PIC
#include<htc.h>
Programa 1
// Palabra de configuracion
// UNPROTECT - Codigo no protegido
// WDTDIS - Watchdog deshabilitado
// PWRTEN - Timer de encendido habilitado
// BORDIS - Reset por bajo voltaje deshabilitado
// LVPDIS - Programacion en bajo voltaje deshabilitado
// HS - Oscilador de cristal de alta velocidad
__CONFIG(UNPROTECT & WDTDIS & PWRTEN & BORDIS & LVPDIS & HS);

void main()
{
TRISB=0xFF; // Puerto B como entradas
TRISD=0; // Puerto D como salidas
PORTD=0xFF; // Puerto D apagado
for(;;) // Ciclo infinito
{
RD0=RB0; // Los primeros 5 bits del puerto D
RD1=RB1; // se reflejan en el puerto B
RD2=RB2;
RD3=RB3;
RD4=RB4;
}
} UTCJ JRJ 28
Práctica 2

Decodificador BCD – 7 segmentos


Implementar un decodificador BCD – 7 segmentos
dependiendo de los interruptores en RB0-RB3
indicar el numero en el display de 7 segmentos
conectado en el puerto D

UTCJ JRJ 29
#include<htc.h>
30

// Palabra de configuracion
__CONFIG(UNPROTECT & WDTDIS & PWRTEN &
BORDIS & LVPDIS & HS);
void main()
{
unsigned int DATO;
TRISB=0xFF; // Puerto B como entradas
TRISD=0; // Puerto D como salidas
Programa 2

PORTD=0xFF; // Puerto D apagado


for(;;) // Ciclo infinito
{
DATO=(~PORTB)&15;
switch(DATO)

JRJ
{
case 0: PORTD=0b01000000; break;
case 1: PORTD=0b01111001; break;
case 2: PORTD=0b00100100; break;
case 3: PORTD=0b00110000; break;
case 4: PORTD=0b00011001; break;
case 5: PORTD=0b00010010; break;
case 6: PORTD=0b00000010; break;
case 7: PORTD=0b01111000; break;
case 8: PORTD=0b00000000; break;
case 9: PORTD=0b00010000; break;
default: PORTD=0b11111111; break;
}

UTCJ
}
}
Práctica 3
Instrucciones de temporización.
(delay.c)
Implementar un contador de 0-9
segundos.
Nota: copiar los archivos delay.c y
delay.h de la carpeta C:\Program files\HI-
TECH Software \ PICC \ lite \ 9.60 \
samples \ LCDemo en la carpeta del
proyecto y agregarlos al proyecto.

UTCJ JRJ 31
Práctica 3
Instrucciones de temporización. (delay.c)
Nota: Abrir el archivo delay.h y cambiar el valor
de la frecuencia del cristal a 20 MHz

UTCJ JRJ 32
#include<htc.h>
#include"delay.h"
33

__CONFIG(UNPROTECT & WDTDIS & PWRTEN &


BORDIS & LVPDIS & HS);
void main()
{
unsigned int tiempo=250;
TRISD=0; // Puerto D como salidas
PORTD=0xFF; // Puerto D apagado
for(;;) // Ciclo infinito
Programa 3

{
PORTD=0b01000000;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b01111001;
DelayMs(tiempo);DelayMs(tiempo);

JRJ
PORTD=0b00100100;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b00110000;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b00011001;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b00010010;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b00000010;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b01111000;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b00000000;
DelayMs(tiempo);DelayMs(tiempo);
PORTD=0b00010000;

UTCJ
DelayMs(tiempo);DelayMs(tiempo);
}
}
Práctica 3.A
Instrucciones de temporización. (delay.c)
Implementar un semáforo que funcione como se
indica en el diagrama.

1 segundo
UTCJ JRJ 34
Práctica 4

Timer0 (Timer) e interrupción.


Utilizar el Timer0 para el destello de un LED y
simultáneamente monitorear los interruptores.
Retardo=4(Tosc)(255-TMR0)(Prescaler)
Si el cristal es de 20MHz, Tosc=0.05 µseg.
4(0.05 µseg)(255-0)(256) = 13 mseg
1 seg / 13 mseg = 76.9 ≈ 77

UTCJ JRJ 35
#include<htc.h>
36

__CONFIG(UNPROTECT & WDTDIS & PWRTEN &


BORDIS & LVPDIS & HS);
//Variable para contar las interrupciones
int conteo=0;
void interrupt isr(void){
// Verifica si se produjo la interrupcion del Timer0
if((T0IE)&&(T0IF)) //Importante verificar siempre la fuente de la interrupción
Programa 4

// Limpia la bandera de interrupcion del Timer0


T0IF = 0;
// Reinicializa el Timer0
TMR0 = 0;

JRJ
//Resta 1 a la variable conteo
conteo--;
// Si conteo llego a cero y la salida es 1,
// cambia la salida a 0
if((conteo == 0)&&(RD5==1))
{
RD5=0;
conteo=38;
}
// en caso de que conteo llego a cero y la
// salida es cero, cambia la salida a 1
else if ((conteo == 0)&(RD5==0))
{

UTCJ
RD5=1;
conteo=38;
}
}
void main()
{
37

// Inicia la variable conteo con 38


conteo=38;
// Configura puerto D como salida
TRISD=0;
// Configura puerto B como entrada
TRISB=0xFF;
// Apagar Puerto D
PORTD=0xFF;
Programa 4

// Configura Timer0 como timer


// Prescaler asignado a Timer0
// Prescaler = 256
OPTION=0b00000111;
// Inicializa Timer0

JRJ
TMR0=0;
// Habilita interrupción del Timer0
T0IE=1;
// Limpia bandera de interrupcion
// del Timer0
T0IF=0;
// Habilita las interrupciones
GIE=1;
for(;;)
{
RD0=RB0; // Ciclo infinito donde
RD1=RB1; // los primeros 5 bits del puerto D

UTCJ
RD2=RB2; // se reflejan en el puerto B
RD3=RB3;
RD4=RB4;
}
}
Práctica 5

Entradas analógicas
Leer el valor de voltaje en la entrada analógica y
mostrarlo en la barra de LEDs conectado en el
puerto D

UTCJ JRJ 38
#include <htc.h>
39

#include "delay.h"
__CONFIG(UNPROTECT & WDTDIS & PWRTEN & BORDIS &
LVPDIS & HS);
void main()
{
unsigned int DATO=0;
Programa 5

// Inicializacion
TRISD=0; // Puerto d como salidas
CM0=1;CM1=1;CM2=1; // Deshabilita comparadores analógicos
// Configura ADC

JRJ
ADCON1=0b10000100;
//1------- Resultado justificado a la derecha ADFM=1
//-0------ Tad= 8*Tosc = 2.0 us si Fosc=4MHz
//----0100 AN0-AN2 como entrada analógica

UTCJ
for(;;)
40

{
// Convertir canal AN0
ADCON0=0b01000001;
//01------ Tad= 8*Tosc = 2.0 us si Fosc=4MHz
//--000--- Seleccionar canal AN0
//-------1 Encender ADC
Programa 5 (cont.)

DelayUs(20); // Retardo de 15 us
ADGO=1;
while(ADGO);
DATO=(ADRESH*256)+ADRESL;
if(DATO>896)
PORTD=0b00000000;
else if (DATO>768)

JRJ
PORTD=0b10000000;
else if(DATO>640)
PORTD=0b11000000;
else if(DATO>512)
PORTD=0b11100000;
else if(DATO>384)
PORTD=0b11110000;
else if(DATO>256)
PORTD=0b11111000;
else if(DATO>128)
PORTD=0b11111100;
else

UTCJ
PORTD=0b11111110;
}
}
Práctica 6

Modulo PWM
Generar una señal PWM en la terminal CCP1/RC2

UTCJ JRJ 41
Práctica 6
En el circuito, agregar
la terminal
bidireccional y el
osciloscopio como se
muestra en la figura

UTCJ JRJ 42
#include <htc.h>
43

__CONFIG(UNPROTECT & WDTDIS & PWRTEN &


BORDIS & LVPDIS & HS);
void main()
{
// Establecer el periodo PWM escribiendolo
// en el registro PR2
PR2=0xFF;
Programa 6

//Establecer el ciclo util escribiendolo en


// CCPR1L y CCP1X/CCP1Y
CCPR1L=0b10000000;
CCP1X=0;

JRJ
CCP1Y=0;
// Configurar la terminal CCP1 (RC2) como salida
TRISC=0;
// Establecer el valor del prescaler (16)
T2CON=0b00000011;
//Configura CCP1 para funcionar como PWM
CCP1CON=0b00001111;
// Activar el Timer2

UTCJ
TMR2ON=1;
for(;;){}
}
PRACTICA 6.A
• Por medio del potenciómetro conectado en
RA0, controlar el Ciclo útil del modulo
PWM de la terminal CCP1.

UTCJ JRJ 44
Práctica 7

Memoria EEPROM
Realizar un contador de 0-9 que almacene el
numero en la EEPROM para que cuando se reinicie
el microcontrolador, comience a partir del último
valor.

UTCJ JRJ 45
#include<htc.h>
46

#include"delay.h"
// Palabra de configuracion
__CONFIG(UNPROTECT & WDTDIS & PWRTEN &
BORDIS & LVPDIS & HS);
unsigned int DATO;
void main()
{
TRISB=0xFF; // Puerto B como entradas
Programa 7

TRISD=0; // Puerto D como salidas


PORTD=0xFF; // Puerto D apagado
//Leer EEPROM
//a) Escribir la direccion en EEADR

JRJ
EEADR=0x10;
//b) Limpiar el bit EEPGD para apuntar a la memoria de datos EEPROM
EEPGD=0;
//c) Poner a 1 el bit RD de EECON1 para iniciar la lectura
RD=1;
//d) Leer el dato del registro EEDATA
DATO=EEDATA;
for(;;) // Ciclo infinito
{
// Aumenta el valor de DATO
DATO++;
// Si DATO>9 lo inicializa a cero

UTCJ
if(DATO>9)
{
DATO=0;
}
// Escritura del DATO en EEPROM en la direccion 0x10
47

//a) Escribir la direccion en EEADR


EEADR=0x10;
//b) Escribir el valor a guardar en EEDATA
EEDATA=DATO;
//c) Limpiar el bit EEPGD para apuntar a la EEPROM
EEPGD=0;
//d) Poner a 1 el bit WREN para permitir la operacion
Programa 7 (cont.)

WREN=1;
//e) Deshabilitar las interrupciones (si estan habilitadas)
GIE=0;
//f) Ejecutar la secuencia de seguridad
EECON2=0x55;
EECON2=0xAA;
WR=1;

JRJ
//g) Esperar el final del proceso de escritura
// de la EEPROM
do{}while(EEIF=0);
//h) Limpiar el indicador
EEIF=0;
//i) Deshabilitar la escritura de la EEPROM
WREN=0;
// Prepara el valor de DATO para mostrarlo en el
// display de siete segmentos

UTCJ
switch(DATO)
48

{
case 0: PORTD=0b01000000; break;
case 1: PORTD=0b01111001; break;
case 2: PORTD=0b00100100; break;
case 3: PORTD=0b00110000; break;
case 4: PORTD=0b00011001; break;
case 5: PORTD=0b00010010; break;
Programa 7 (cont.)

case 6: PORTD=0b00000010; break;


case 7: PORTD=0b01111000; break;
case 8: PORTD=0b00000000; break;
case 9: PORTD=0b00010000; break;
default: PORTD=0b11111111; break;
}
DelayMs(250);
DelayMs(250);

JRJ
DelayMs(250);
DelayMs(250);
}
}

UTCJ
Práctica 8

Grabación de PICs con PIC-600 y USBURN


Grabar el programa de la practica 0 al PIC16F877A

UTCJ JRJ 49
Práctica 8
Grabación de PICs con PIC-600 y US-BURN

1. Conectar el grabador PIC-600 a la computadora.

2. Insertar el microcontrolador en el zócalo ZIF. (Verificar


la orientación del microcontrolador)

3. Ejecutar el programa US-BURN.

UTCJ JRJ 50
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
4. En la seccion «IC-Socket / ICSP», seleccionar la opción
«28 / 40 Pins» y dar clic en «Identify PIC in Programmer»

UTCJ JRJ 51
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
5. Aparece el PIC16F877A en la ventana de resultados.

UTCJ JRJ 52
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
6. Agregar el código fuente al PIC.
Clic en «Select HEX-File as source».

UTCJ JRJ 53
Práctica 8
Grabación de PICs con PIC-600 y US-BURN

7. Abrir el archivo .hex de la


compilación de la practica 0.

UTCJ JRJ 54
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
8. Se muestra la información del código fuente. En caso
de que no contenga los datos de configuración, se pueden
cambiar en la pestaña «PIC-Configuration».

UTCJ JRJ 55
Práctica 8
Grabación de PICs con PIC-600 y US-BURN

9. En esta sección se pueden modificar la configuración


del PIC, cuando no se configuró desde el programa

UTCJ JRJ 56
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
10. Grabar el archivo .hex en el PIC.
Clic en el botón «Write HEX-File into PIC»

UTCJ JRJ 57
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
11. Se muestra la grabación en una barra de
progreso.

UTCJ JRJ 58
Práctica 8
Grabación de PICs con PIC-600 y US-BURN
12. Si concluyo correctamente la grabación, puede
liberar el PIC del zócalo ZIF y montar en el
circuito de prueba

UTCJ JRJ 59
Fuentes consultadas y
enlaces recomendados
• Hoja de datos del PIC16F877A.
www.microchip.com.
• www.htsoft.com. Página web del compilador HI-
TECH C.

• Microcontroladores PIC. Diseño práctico de


aplicaciones 2ª parte. Angulo Usategui, Romero
Yesa, Angulo Martínez. Editorial McGraw-Hill.

• PIC C. An introduction to programming the


Microchip PIC in C. Nigel Gardner.
UTCJ JRJ 60

Вам также может понравиться