Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
Arquitectura interna
Terminales fisicas
PUERTOS
Puerto
PORTA
# funciones
3
Funciones
Entradas digital Salidas digital Entradas analgicas Entradas digital Salidas digital
PORTB
PORTC
PORTD
PORTE
FUNCIONES PORTA
Terminal
RA0
Funciones
Ent. Digital Sal. Digital Ent. Analgica
RA1
RA2 RA3 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
FUNCION PORTC
Terminal Funciones
Ent. Digital Sal. Digital Sal. Osc timer 1 Ent. Digital Sal. Digital Ent. Osc Timer 1 Ent. Digital Sal. Digital Ent. Digital Sal. Digital Reloj sincrono SPI Ent. Digital Sal. Digital Datos entrada SPI Ent. Contador 1 Captura/Comp/PWM 1 Captura/Comp/PWM 2 Reloj sncrono I2C Datos I2C
FUNCIONES PORTD
Terminal RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7 Funciones
Ent. Digital Sal. Digital
Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital Ent. Digital Sal. Digital
FUNCIONES PORTE
Terminal
RE0 RE1
Funciones
Ent. Digital Sal. Digital Ent. Analgica Lectura PSP Ent. Digital Sal. Digital Ent. Analgica Escritura PSP
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 float double long double bytes 4 4 4 Rango 1.17549435082 x 10-38 .. 6.80564774407 x 1038 1.17549435082 x 10-38 .. 6.80564774407 x 1038 1.17549435082 x 10-38 .. 6.80564774407 x 1038
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 PORTB PORTC PORTD PORTE Configuracin TRISA TRISB TRISC TRISD TRISE
Entrada o salida
SALIDA DE DATOS : 0 ENTRADA DE DATOS: 1
Entrada o salida
Si deseamos configurar el puerto C con la siguiente asignacin:
RC0 RC1 RC2 RC3 RC4 RC5 RC6 RC7
o o
Entrada o salida
Si deseamos configurar el puerto D con la siguiente asignacin:
RD0 RD1 RD2 RD3 RD4 RD5 RD6 RD7
o o
Entrada o salida
Si deseamos configurar el puerto A con la siguiente asignacin:
RA0 RA1 RA2 RA3 RA4 RA5 RA6
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 = 0 0 0 0 0 1 1 0
ADCON1 = 6 ;
Delay_ms(1000);
/* Pausa de un segundo */
// Definicin de funciones
void main(void) { // Definicin de variables locales
// Programa de usuario
} }
// Definicin de funciones
void main(void) { // Definicin de variables locales
// Programa de usuario
} }
// Definicin de funciones
void main(void) { // Definicin de variables locales
// 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.
. . .
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
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.
Arreglos (definiciones)
#define MAX 50
int
float float
vector_one[10];
vector_two[MAX]; vector_three[MAX - 20];
/* arreglo de 10 enteros */
/* arreglo 50 flotantes */ /* arreglo 30 flotantes */
char
short long
numero[5];
dato[8]; temperatura[15];
Arreglos (Inicializando)
/* Arreglo el cal contiene el nmero de das de cada mes */
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
Limpia apuntador
apuntador 8 Enva dato apuntado
si
Limpia apuntador
no
// Configura puerto // Limpia apuntador // Ciclo infinito // Enva dato // Incrementa apuntador // Si apuntador 8 // 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
& | ^ ~
<<
AND; compara pares de bits y regresa 1 si ambos son 1s, de otra manera regresa 0. OR (inclusive); compara pares de bits y regresa 1 si uno o ambos son 1s, de otra manera regresa 0. OR (exclusiva); compara pares de bits y regresa 1 si los bits son complementarios, de otra manera regresa 0. Complemento (unitario); invierte cada bit Corrimiento hacia la izquierda; mueve los bits hacia la izquierda, descartando el bit mas a la izquierda y asignando ceros al bit a la derecha. Corrimiento hacia la derecha; mueve los bits hacia la derecha, descartando el bit mas a la derecha y asignando ceros al bit a la izquierda.
>>
&:
0001 0010 0011 0100 0101 0110 0111 1000 ----------------------------------0001 0010 0011 0000
/* De forma similar: */ 0x1234 | 0x5678; 0x1234 ^ 0x5678; ~ 0x1234; /* Igual 0x567C */ /* Igual 0x444C */ /* Igual 0xEDCB */
Corrimiento a la derecha division entre 2n. Corrimiento a la izquierda producto por 2n.
Inicializa variable
variable = 0 Enva variable al puerto
si
Inicializa variable
no
TRISD = 0;
dato = 0b00000001; while ( 1 ) { PORTD = dato; Delay_ms ( 300 ); dato = dato << 1; if ( dato == 0 ) dato = 0x01; } }
Operaciones aritmticas
Operador + * / Suma Resta Multiplicacin Divisin Operacin
%
++
Resto, regresa el residuo de la divisin entera (no puede ser usado con variables flotantes
Como prefijo Incrementa en uno el valor de la variable antes de evaluar la expresin. Como Postfijo suma en uno la variable despus de ser evaluado la expresin.
--
Como prefijo decrementa en uno el valor de la variable antes de evaluar la expresin. Como Postfijo resta en uno la variable despus de ser evaluado la expresin.
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
Limpia contador
si si RA0 = 0 Contador = 10
Limpia contador
no
Enva Secuencia_derecha
no
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 A B C D
1
2 3 4
1
0 0 1
1
1 0 0
0
1 1 0
0
0 1 1
Secuencias de activacin 2
Unipolar.- Movimiento de 1 paso por pulso (mayor velocidad).
Paso A B C D
1
2 3 4
1
0 0 0
0
1 0 0
0
0 1 0
0
0 0 1
Secuencias de activacin 3
Unipolar.- Movimiento de 1/2 paso por pulso.
Paso 0.5 1 1.5 2 2.5 3 3.5 4 A 1 1 0 0 0 0 0 1 B 0 1 1 1 0 0 0 0 C 0 0 0 1 1 1 0 0 D 0 0 0 0 0 1 1 1
Secuencias de activacin 4
Bipolar.- Movimiento de un paso
Paso A C B D
1
2 3 4
1
1 0 0
0
0 1 1
1
0 0 1
0
1 1 0
Secuencia de activacin 5
Bipolar.- Movimiento de medio paso
Paso 0.5 1 1.5 2 2.5 3 3.5 4 A 1 1 1 0 0 0 0 0 C 0 0 0 0 1 1 1 0 B 1 0 0 0 0 0 1 1 D 0 0 1 1 1 0 0 0
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.
Configurar los puertos, inicializacin de variables (unidades = 0 decenas = 0) Envo de decenas Habilitacin de decenas Envo de unidades Habilitacin de unidades Incremento de unidades Si unidades mayor de 9 entonces 9 Sigue 2 Unidades = 0 Incrementa decenas Si decenas mayor de 9 entonces 12 Sigue 2 Decenas=0 Sigue 2
Configura puertos Inicia variables Enva decena Enva unidad Incrementa unidad si Unidades>9 no
Decenas>9 no
si
Limpia decenas
// Incrementa unidades
// Reinicie decenas
Lcd8_Config
Descripcin: Inicializa el LCD usando un bus de datos de 8 bits. Los
puertos de Control (ctrlport) y Datos (dataport) usan la asignacin de terminales especificada. void Lcd8_Config( unsigned short *ctrlport,
unsigned short *dataport, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4, unsigned short D3, unsigned short D2, unsigned short D1, unsigned short D0 );
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(
unsigned short row, unsigned short col, char *text );
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);
Comandos predefinidos
Comando
LCD_FIRST_ROW LCD_SECOND_ROW
Funcin
Mueve el cursor a la 1a. fila. Mueve el cursor a la 2a. fila.
LCD_THIRD_ROW
LCD_FOURTH_ROW LCD_CLEAR LCD_RETURN_HOME LCD_CURSOR_OFF LCD_UNDERLINE_ON
LCD_BLINK_CURSOR_ON
LCD_MOVE_CURSOR_LEFT LCD_MOVE_CURSOR_RIGHT LCD_TURN_ON LCD_TURN_OFF
LCD_SHIFT_LEFT
LCD_SHIFT_RIGHT
Enva mensaje
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 L
. . .
H O LA
H O
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(
unsigned short *ctrl_data_port, unsigned short RS, unsigned short EN, unsigned short WR, unsigned short D7, unsigned short D6, unsigned short D5, unsigned short D4
);
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(
unsigned short row, unsigned short col, char *text );
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(
unsigned short row, unsigned short col, char character );
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
pasar a la funcin una de las constantes predefinidas. Los comandos son los mismos para ambos modos de manejo del LCD (bus 8 o 4 bits).
Enva mensaje
Lcd_Out(1, 6, mensaje);
while(1) { Lcd_Cmd(LCD_SHIFT_RIGHT); Delay_ms(200); } }
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.
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.
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.
// Inicializa un apuntador con 6 espacios // txt es " -4220" (un espacio en blanco)
LongToStr
Descripcin: Crea una cadena de salida de un numero largo con
signo (Valor numrico de una variable long). La cadena esta ajustada a un ancho de 11 caracteres; Las posiciones a la izquierda que no se usan en la conversin se rellenan con espacios.
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.
Inicializa contador
Enva a LCD ASCII
Incrementa contador
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
operaciones aritmticas. El desplegado debe hacerse de la forma mostrada en las siguientes figuras. Se utiliza la segunda fila, presentando hasta 3 numeros consecutivos, un numero a la izquierda, uno mas al centro y otro a la derecha.
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
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 Contador 00-99 cada 500 mseg 01 Contador 00-99 cada 500 mseg 02
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
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.
Keypad_Released();
Convierte a ASCII
Enva a LCD
// '*' // '0'
// '#'
// Imprime en 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: Cual es el numero de 3 cifras: 025
Cual es el numero de 3 cifras: 025 El producto por 2 es: 050 La divisin entre 2 es: 012