Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PIC16F877 Con MikroC
PIC16F877 Con MikroC
en lenguaje C para
microcontroladores PIC
PIC16F877
Caractersticas
Velocidad de operacin: hasta 20 MHz de
reloj
8K x 14 bits por palabra de memoria de
programa FLASH
368 x 8 bytes de memoria de datos (RAM)
256 x 8 bytes de memoria de datos
EEPROM
Caractersticas (2)
14 fuentes de interrupciones
Memoria de pila (stack) de 8 niveles de
profundidad
Protecciones:
Power-on Reset (POR)
Power-up Timer (PWRT)
Oscillator Start-up Timer (OST)
Watchdog Timer (WDT) independiente del
cristal.
Caractersticas (perifricos)
Timer 0: timer/counter de 8 bits con un preescalador de 8 valores.
Timer 1: 16-bit timer/counter con pre-escalador
Timer 2: 8-bit timer/counter con registro de
estado de 8-bit, pre-escalador y post-escalador
Dos mdulos de Capture, Compare, PWM
Capture es de 16-bit, max. resolucin es 12.5 ns
Compare es de 16-bit, max. resolucin es 200 ns
PWM max. resolucin de 10-bit
Caractersticas (perifricos 2)
Convertidor analgico a digital de 10-bit
multi-canal
Puerto serial sncrono (SSP) con SPI. (modo
maestro) e I2C (maestro/esclavo)
Transmisor-Receptor sncrono-asncrono
universal (USART/SCI) con 9-bit
Puerto paralelo esclavo (PSP) con 8-bits de
ancho, con terminales de control RD, WR y
CS
Arquitectura interna
Arquitectura HARVARD.
Buses separados (datos e instrucciones).
Memoria de programa : 14 bits.
Memoria de datos: 8 bits.
Recursos mapeados en memoria de
datos.
Arquitectura interna
Terminales fisicas
PUERTOS
Puerto
# funciones
Funciones
PORTA
Entradas digital
Salidas digital
Entradas analgicas
PORTB
Entradas digital
Salidas digital
PORTC
Entradas digital
Salidas digital
Medios de comunicacin
PORTD
Entradas digital
Salidas digital
Puerto paralelo esclavo
PORTE
Entradas digital
Salidas digital
Entradas analgicas
Control del puerto paralelo esclavo
FUNCIONES PORTA
Terminal Funciones
RA0
RA1
RA2
VREF -
RA3
VREF +
RA4
RA5
FUNCIONES PORTB
Terminal
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
Funciones
Ent. Digital Sal. Digital Ent. Interrupcin 0
Ent. Digital Sal. Digital
Ent. Digital Sal. Digital
Ent. Digital Sal. Digital PGM ( funcin LVP )
Ent. Digital Sal. Digital
Ent. Digital Sal. Digital
Ent. Digital Sal. Digital PGC ( funcin LVP )
Ent. Digital Sal. Digital PGD ( funcin LVP )
FUNCION PORTC
Terminal Funciones
RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7
Ent. Contador 1
Captura/Comp/PWM 1
Captura/Comp/PWM 2
Datos I2C
FUNCIONES PORTD
Terminal Funciones
Ent. Digital Sal. Digital
RD0
Ent. Digital Sal. Digital
RD1
Ent. Digital Sal. Digital
RD2
Ent. Digital Sal. Digital
RD3
Ent. Digital Sal. Digital
RD4
Ent. Digital Sal. Digital
RD5
Ent. Digital Sal. Digital
RD6
Ent. Digital Sal. Digital
RD7
FUNCIONES PORTE
Terminal Funciones
RE0
RE1
RE2
Tipos de datos
Tipo
(unsigned) char
signed char
(signed) short (int)
unsigned short (int)
(signed) int
unsigned (int)
(signed) long (int)
unsigned long (int)
bytes
1
1
1
1
2
2
4
4
Rango
0 .. 255
- 128 .. 127
- 128 .. 127
0 .. 255
-32768 .. 32767
0 .. 65535
-2147483648 .. 2147483647
0 .. 4294967295
Tipos de datos 2
Tipo
bytes
Rango
float
double
long double
Asignacin de datos
Decimal
int i = 10;
int j = -10;
int p = 0;
/* decimal 10 */
/* decimal -10 */
/* decimal 0 */
Hexadecimal
short x = 0x37;
short y = 0x7F;
int z = 0x125;
/* decimal 55 */
/* decimal 127 */
/* decimal 293 */
Asignacin de datos
Octal
int m = 023;
short n = 016;
/* 19 */
/* 14 */
Binario
char dato = 0b00001111;
short dat = 0b10101010;
unsigned char sig = 0b11001100;
ASCII
char dat = a;
char m = 5;
Registros asociados
Entrada/salida
PORTA
Configuracin
TRISA
PORTB
TRISB
PORTC
TRISC
PORTD
TRISD
PORTE
TRISE
Entrada o salida
SALIDA DE DATOS :
ENTRADA DE DATOS: 1
La asignacin es individual
correspondiente a cada terminal del
puerto.
Entrada o salida
Si deseamos configurar el puerto C con la
siguiente asignacin:
RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7
entrada
entrada
entrada
entrada
salida
salida
salida
salida
TRISC = 0b00001111;
TRISC = 0x0F; o
TRISC = 15;
Entrada o salida
Si deseamos configurar el puerto D con la
siguiente asignacin:
RD0
RD1
RD2
RD3
RD4
RD5
RD6
RD7
entrada
salida
entrada
salida
entrada
salida
entrada
salida
TRISD = 0b01010101;
TRISD = 0x55; o
TRISD = 85;
Entrada o salida
Si deseamos configurar el puerto A con la siguiente
asignacin:
RA0
RA1
RA2
RA3
RA4
RA5
RA6
salida
salida
salida
salida
entrada
entrada
entrada
ADCON1 = 6;
\\ instruccin indispensable para usar el
puerto A y el puerto E como entrada o
salida
de datos digitales
TRISA = 0b01110000;
o
TRISA = 0x70;
o
TRISA = 112;
ADCON1
ADCON1 =
ADCON1 = 6 ;
Delay_ms(1000);
/* Pausa de un segundo */
Estructura de un programa en C
( ciclo while )
// Definicin de variables globales
// Definicin de funciones
void main(void)
{
// Definicin de variables locales
// Configuracin de registros (recursos y puertos)
// ciclo infinito
while ( 1 )
{
// Programa de usuario
}
}
Estructura de un programa en C
( ciclo for )
// Definicin de variables globales
// Definicin de funciones
void main(void)
{
// Definicin de variables locales
// Configuracin de registros (recursos y puertos)
// ciclo infinito
for ( ; ; )
{
// Programa de usuario
}
}
Estructura de un programa en C
( ciclo do - while )
// Definicin de variables globales
// Definicin de funciones
void main(void)
{
// Definicin de variables locales
// Configuracin de registros (recursos y puertos)
// ciclo infinito
do
{
// Programa de usuario
} while ( 1 ) ;
}
Apaga bit
Enciende bit
Retardo de 300 ms
Retardo de 1000ms
Ejercicios propuestos 1
1. El alumno encender y apagara en forma
alternada dos leds ubicados en los bits 2 y 3
del puerto B. Los retardos sern de 500
milisegundos (ambos). Usando asignacin
directa a bits.
2. El alumno encender y apagara un led
ubicado en el bit 5 del puerto C. Los retardos
sern de 100 milisegundos y 2 segundos,
respectivamente. Usando asignacin de byte.
Secuencia :
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
.
.
.
9. Envo de ultimo dato al puerto de salida
10. Regresar a 2
Enva 00000100
Enva 00100000
Enva 00000001
Enva 00001000
Enva 01000000
Enva 00000010
Enva 00010000
Enva 10000000
// CICLO INFINITO
PORTD = 0b00000001;
Delay_ms(500);
PORTD = 0b00000010;
Delay_ms(500);
PORTD = 0b00000100;
Delay_ms(500);
PORTD = 0b00001000;
Delay_ms(500);
PORTD = 0b00010000;
Delay_ms(500);
PORTD = 0b00100000;
Delay_ms(500);
PORTD = 0b01000000;
Delay_ms(500);
PORTD = 0b10000000;
Delay_ms(500);
}
}
Ejercicios propuestos 2
1. El alumno enviara una secuencia de datos distinta por
el puerto B, utilizando retardos por software de
distintas duraciones, con incrementos de 100
milisegundos entre si.
2. El alumno enviara la secuencia de datos por el puerto
A, utilizando retardos por software con duracin de 800
milisegundos.
100001
010010
001100
010010
100001
Arreglos (definiciones)
#define
MAX 50
int
vector_one[10];
/* arreglo de 10 enteros */
float
vector_two[MAX];
/* arreglo 50 flotantes */
float
vector_three[MAX - 20];
/* arreglo 30 flotantes */
char
numero[5];
short
dato[8];
long
temperatura[15];
unsigned peso[7];
unsigned short d[3];
Arreglos (Inicializando)
/* Arreglo el cal contiene el nmero de das de cada mes */
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
/* La declaraciones es identica a la anterior */
int *days = {31,28,31,30,31,30,31,31,30,31,30,31};
/* Las dos declaraciones son identicas */
const char msg1[ ] = {'T', 'e', 's', 't', '\0'};
const char msg2[ ] = "Test";
Condicionante if
if (expresin) conjunto 1 [else conjunto 2]
Cuando la expresin evaluada es verdadera,
Las instrucciones del conjunto 1 son ejecutadas.
Si la expresin es falso, las instrucciones del
conjunto 2 es ejecutada. La expresin debe ser
evaluada a un valor entero. Los parntesis que
encierra la expresin son obligatorios.
La palabra especial else conjunto 2 es
opcional.
Smbolos de condicin
Operador
==
!=
>
<
>=
<=
Operacin
igual
no igual
mayor que
menor que
mayor que o igual a
menor que o igual a
Incrementa
apuntador
si
Limpia apuntador
apuntador 8
Enva dato
apuntado
no
Limpia
apuntador
Ejercicios propuestos 3
1. El alumno enviara una secuencia por el
puerto B usando los valores almacenado
en un arreglo.
00000011
00000110
00001100
00011000
00110000
01100000
11000000
&
<<
>>
/* Igual 0x1230 */
/* De forma similar: */
0x1234 | 0x5678;
0x1234 ^ 0x5678;
~ 0x1234;
/* Igual 0x567C */
/* Igual 0x444C */
/* Igual 0xEDCB */
/* Igual 000040 */
/* Igual 0x8010, sobreflujo! */
0x02F6 >> 4;
0xFF56 >> 4;
/* Igual 0x002F */
/* Igual 0x0FF5 */
Modifica
variable
si
Inicializa variable
variable = 0
Enva variable
al puerto
no
Inicializa
variable
Operaciones aritmticas
Operador
Operacin
Suma
Resta
Multiplicacin
Divisin
++
--
Ejercicios propuestos 4
1. El alumno realizara un programa que enve al
puerto C los siguientes valores utilizando para
generarlas, las instrucciones de desplazamiento
y/o aritmticas.
1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45
Enva
secuencia_izquierda
Incrementa
contador
Limpia contador
si
RA0 = 0
no
si
Enva
Secuencia_derecha
Contador = 10
no
Limpia
contador
Ejercicios propuestos 5
1. El alumno desarrollara un programa que
enve una secuencia de nmeros BCD a
un display de 7 segmentos ubicados en
el puerto D. Si la terminal RA1 ubicada
en el puerto A, es igual a 0, la
numeracin debe ser incremental; en
caso contrario debe decrementarse.
MOTOR A PASOS 1
Unipolar.- Tiene 4 bobinas independientes (A, B, C,
D) y una terminal comn a todas ellas.
MOTOR A PASOS 2
Unipolar.- Tiene 4 bobinas independientes (A, B,
C, D) y dos terminales comunes.
MOTOR A PASOS 2
Bipolar.- Tiene 2 bobinas (A C, B D)
Secuencias de activacin 1
Unipolar.- Movimiento de 1 paso por pulso
(mayor torque).
Paso
Secuencias de activacin 2
Unipolar.- Movimiento de 1 paso por pulso
(mayor velocidad).
Paso
Secuencias de activacin 3
Unipolar.- Movimiento de 1/2 paso por pulso.
Paso
0.5
1.5
2.5
3.5
Secuencias de activacin 4
Bipolar.- Movimiento de un paso
Paso
Secuencia de activacin 5
Bipolar.- Movimiento de medio paso
Paso
0.5
1.5
2.5
3.5
Ejercicios propuestos 5
2.- El alumno desarrollara un programa que
enve la secuencia de activacin de un
motor a pasos ubicado en el puerto D. Si
la terminal ubicada en el puerto A, RA6,
sea igual a 0, el motor debe girar a la
derecha, en caso contrario debe girar a
la izquierda.
Configura puertos
Inicia variables
Enva decena
Enva unidad
Incrementa unidad
si
Unidades>9
no
Decenas>9
si
no
Limpia decenas
// Programa principal
// Configuracin de puertos
// Inicializacin de variables
// Programa de usuario
// Enva decenas
// Habilita el display de decenas
// Enva unidades
// Habilita el display de decenas
// Incrementa unidades
// Reinicia unidades
// Incrementa decenas
// Reinicie decenas
Lcd8_Config
Lcd8_Init
Lcd8_Out
Lcd8_Out_Cp
Lcd8_Chr
Lcd8_Chr_Cp
Lcd8_Cmd
Lcd8_Config
Lcd8_Config 2
Ejemplo:
Lcd8_Config(&PORTC,&PORTD,0,1,2,0,1,2,3,4,5,6,7);
Lcd8_Init
Descripcin: Inicializa el LCD usando un bus de 8 bits.
Los puertos de Control (ctrlport) y Datos (dataport) usan
la siguiente asignacin de terminales.E ctrlport.3
RS ctrlport.2
R/W ctrlport.0
D7 dataport.7
D6 dataport.6
D5 dataport.5
D4 dataport.4
D3 dataport.3
D2 dataport.2
D1 dataport.1
D0 dataport.0
Lcd8_Init 2
Ejemplo:
Lcd8_Init(&PORTB, &PORTC);
Lcd8_Out
Descripcin: Imprime mensaje en el LCD en la
fila y columna especificada (row y col).
void Lcd8_Out(
Ejemplo:
-Imprime Hello! en el LCD en la linea 1, columna 3
Lcd8_Out(1, 3, "Hello!");
Lcd8_Out_Cp
Descripcin: Imprime mensaje en el LCD
en la posicin actual del cursor.
void Lcd8_Out_Cp(char *text);
Ejemplo: Imprime Here! en la posicin
actual del cursor
Lcd8_Out_Cp("Here!");
Lcd8_Chr
Descripcin: Imprime un caracter en el LCD en
la fila y columna especificada (row y col).
void Lcd8_Chr( unsigned short row,
unsigned short col,
char character );
Lcd8_Chr_Cp
Descripcin: Imprime un caracter en el
LCD en la posicin actual del cursor.
void Lcd8_Chr_Cp(char character);
Ejemplo: Imprime la letra e en la
posicin actual del cursor
Lcd8_Chr_Cp('e');
Lcd8_Cmd
Descripcin: Enva un comando al LCD.
Se puede pasar a la funcin una de las
constantes predefinidas.
void Lcd8_Cmd(unsigned short command);
Ejemplo: Limpia el LCD
Lcd8_Cmd(LCD_CLEAR);
Comandos predefinidos
Comando
Funcin
LCD_FIRST_ROW
LCD_SECOND_ROW
LCD_THIRD_ROW
LCD_FOURTH_ROW
LCD_CLEAR
Limpia el display.
LCD_RETURN_HOME
LCD_CURSOR_OFF
Apaga el cursor.
LCD_UNDERLINE_ON
LCD_BLINK_CURSOR_ON
LCD_MOVE_CURSOR_LEFT
LCD_MOVE_CURSOR_RIGHT
LCD_TURN_ON
Enciende el display
LCD_TURN_OFF
Apaga el display
LCD_SHIFT_LEFT
LCD_SHIFT_RIGHT
Enva mensaje
Enva comando de
Corrimiento a la izq.
Ejercicios propuestos 7
1. Programa que forme la palabra HOLA en un
LCD, configurado para utilizar un bus de 8 bits.
Las letras deben desplazarse de derecha a
izquierda. Primero debe aparecer la H,
moviendose desde la derecha a la primer
columna a la izquierda. Enseguida debe
aparecer la O, tambien saliendo de la derecha
y terminando a la derecha de la letra H. Lo
mismo debe suceder para las letras L y A. El
programa debe ser ciclico.
Ejercicio propuesto 8
H
H O
HO
.
.
.
HOLA
Lcd_Config
Lcd_Init
Lcd_Out
Lcd_Out_Cp
Lcd_Chr
Lcd_Chr_Cp
Lcd_Cmd
Lcd_Config
Descripcin: Inicializa LCD usando un bus de datos
de 4 bits. El puerto de Control (ctrlport) y Datos
(dataport) tiene las asignaciones de terminales
especificadas.
void Lcd_Config(
);
Lcd_Config 2
Ejemplo:
Lcd_Config(&PORTC,0,1,2,4,5,6,7);
Lcd_Init
Descripcin: Inicializa el LCD usando un bus de
4 bits. El puerto de Control (ctrlport) y Datos
(dataport) tiene la siguiente asignacin de
terminales.E ctrl_data_port.3
RS ctrl_data_port.2
D7 ctrl_data_port.7
D6 ctrl_data_port.6
D5 ctrl_data_port.5
D4 ctrl_data_port.4
void Lcd_Init(unsigned short *ctrl_data_port);
Lcd_Init 2
Ejemplo:
Lcd_Init(&PORTB);
Lcd_Out
Descripcin: Imprime mensaje en el LCD en la
fila y columna especificada (row y col).
void Lcd_Out(
Ejemplo:
-Imprime Hello! en el LCD en la lnea 1, columna 3
Lcd_Out(1, 3, "Hello!");
Lcd_Out_Cp
Descripcin: Imprime mensaje en el LCD en la
posicin actual del cursor.
void Lcd_Out_Cp(char *text);
Ejemplo:
- Imprime Here! en la posicin actual del cursor
Lcd_Out_Cp("Here!");
Lcd_Chr
Descripcin: Imprime un caracter en el LCD en
la fila y columna especificada (row y col).
void Lcd_Chr(
Ejemplo:
- Imprime la letra i en el LCD en la lnea 2,y columna 3
Lcd_Out(2, 3, 'i');
Lcd_Chr_Cp
Descripcin: Imprime un caracter en el LCD en
la posicin actual del cursor.
void Lcd_Chr_Cp(char character);
Ejemplo:
- Imprime la letra e en la posicin actual del cursor
Lcd_Chr_Cp('e');
Lcd_Cmd
Descripcin: Enva un comando al LCD. Se puede
Enva mensaje
Enva comando de
Corrimiento a la der.
ByteToStr
Descripcion: Crea una cadena de salida de un pequeo
numero sin signo (valor numrico menos a 0x100). La cadena
esta ajustada a un ancho de 3 caracteres; Las posiciones a la
izquierda que no se usan en la conversin se rellenan con
espacios.
void ByteToStr(unsigned short number, char *output);
Ejemplo:
unsigned short t = 24;
char *txt= ;
//se inicializa un apuntador a 4 espacios
ByteToStr(t, txt);
ShortToStr
Descripcin: Crea una cadena de salida de un numero
pequeo con signo (valor numrico menor a 0x100). La
cadena esta ajustada a un ancho de 4 caracteres; Las
posiciones a la izquierda que no se usan en la conversin
se rellenan con espacios.
WordToStr
Descripcin: Crea una cadena de salida de un numero sin
signo (Valor numrico de una variable unsigned). La
cadena esta ajustada a un ancho de 5 caracteres; Las
posiciones a la izquierda que no se usan en la
conversin se rellenan con espacios.
void WordToStr(unsigned number, char *output);
Ejemplo:
unsigned t = 437;
char *txt=
;
WordToStr(t, txt);
IntToStr
Descripcin: Crea una cadena de salida de un numero con
signo (Valor numrico de una variable int). La cadena esta
ajustada a un ancho de 6 caracteres; Las posiciones a la
izquierda que no se usan en la conversin se rellenan con
espacios.
LongToStr
Descripcin: Crea una cadena de salida de un numero largo con
FloatToStr
Descripcin: Crea una cadena de salida de un numero de
punto flotante. La cadena contiene un formato normalizado de
un numero (mantisa entre 0 y 1) con signo en la primera
posicin. La mantisa esta ajustada a un formato de 6 dgitos,
0.ddddd; Hay siempre 5 dgitos a continuacin del punto
decimal.
Configura el LCD
Inicializa el contador
Convierte a ASCII el valor del contador
Enva valor en ASCII al LCD
Incrementa el contador
Regresa a 3
Contador 0-9 :
1
Contador 0-9 :
2
Contador 0-9 :
3
Contador 0-9 :
4
Contador 0-9 :
5
Contador 0-9 :
6
Contador 0-9 :
9
Ejercicio propuesto 8
1. Programa que utilice un LCD, configurado
para usar un bus de 8 bits. En el LCD deben
aparecer en forma secuencial, los nmeros de
la secuencia 1 2 4 8 16 32 64 128
256 512 1024 2048 4096 8192 16384 32768. Los numero deben ser generados por
Ejercicio propuesto 8
Serie de numeros
Serie de numeros
1
Serie de numeros
1
2
Serie de numeros
1
2
Serie de numeros
8
Serie de numeros
8
16
Serie de numeros
8
16
32
Serie de numeros
8192
16384
32768
Ejercicio propuesto 9
1. El alumno diseara un programa en
donde se muestre en un LCD los
nmeros desde 00 hasta el 99. Con un
intervalo de tiempo entre cambio igual a
500 milisegundos.
Ejercicio propuesto 9
Contador 00-99 cada 500 mseg
00
Keypad_Init
Descripcin: Inicializa el puerto para trabajar con el
teclado. Las terminales del teclado deben estar
conectadas de la siguiente forma:
port.F0
port.F1
port.F2
port.F3
port.F4
port.F5
port.F6
port.F7
columna 1
columna 2
columna 3
columna 4
fila 1
fila 2
fila 3
fila 4
Keypad_Init 2
Ejemplo:
Keypad_Init(&PORTB);
Keypad_Read
Descripcin: Verifica si alguna tecla fue presionada. La funcin
regresa 1 a 12, dependiendo la tecla presionada, o 0 si no existe
tecla presionada.
1
2
9
*
0
#
1
2
9
10
11
12
Ejemplo:
kp = Keypad_Read();
Keypad_Released
Descripcin: La llamada a la funcin Keypad_Released es
una funcin blocking call: La funcin espera hasta que cualquier
tecla sea presionada y liberada. Cuando se libera, la funcin
regresa de 1 a 12, dependiendo de la tecla presionada.
Convierte a ASCII
Enva a LCD
Ejercicio propuesto 9
1. El alumno realizara un programa que
tome 3 nmeros desde un teclado
matricial, los guarde en un arreglo, los
convierta a un numero que se guarde en
una variable tipo entera. Con este
numero el alumno deber proporcionar el
producto por 2 y divisin entre 2
resultantes. Visualizando los resultados
en un LCD.
Ejercicio propuesto 9
Cual es el numero de 3 cifras: