2.1 Pic16f877a 1105
2.1 Pic16f877a 1105
2.1 Pic16f877a 1105
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
f) Clic en Siguiente.
UTCJ JRJ 12
Práctica 0
Uso de MPLAB
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
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
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
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
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
{
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
UTCJ JRJ 35
#include<htc.h>
36
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
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
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
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
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.)
JRJ
DelayMs(250);
DelayMs(250);
}
}
UTCJ
Práctica 8
UTCJ JRJ 49
Práctica 8
Grabación de PICs con PIC-600 y 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
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
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.