Escolar Documentos
Profissional Documentos
Cultura Documentos
MICROCONTROLADORES II
(FAMILIA PIC16F87X)
LENGUAJE C PARA PICS
TEMA 1
CARACTERÍSTICAS
• Velocidad de operación: 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.
• 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.
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
CARACTERÍSTICAS (PERIFÉRICOS)
• Timer 0: timer/counter de 8 bits con un pre-
escalador 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 módulos de Captura, Comparación y PWM
(Modulación por anchura de pulso)
– Capture es de 16-bit, max. resolución es 12.5 ns
– Compare es de 16-bit, max. resolución es 200 ns
– PWM max. resolución de 10-bit
CARACTERÍSTICAS (PERIFÉRICOS 2)
• Convertidor analógico a digital de 10-bit multi-
canal
• Puerto serial síncrono (SSP) con SPI. (modo
maestro) e I2C (maestro/esclavo)
• Transmisor-Receptor síncrono-asíncrono
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.
FUNCIONES PORTA
Terminal Funciones
RA0 Ent. Digital Sal. Digital Ent. Analógica
FUNCIONES PORTB
Terminal Funciones
RB0 Ent. Digital Sal. Digital Ent. Interrupción 0
FUNCIONES PORTC
Terminal Funciones
Ent. Digital Sal. Digital Sal. Osc timer 1 Ent. Contador 1
RC0
Ent. Digital Sal. Digital Ent. Osc Timer 1 Captura/Comp/PWM 1
RC1
Ent. Digital Sal. Digital Captura/Comp/PWM 2
RC2
Ent. Digital Sal. Digital Reloj sincrono SPI Reloj síncrono I2C
RC3
Ent. Digital Sal. Digital Datos entrada SPI Datos I2C
RC4
Ent. Digital Sal. Digital Datos salida SPI
RC5
Ent. Digital Sal. Digital Transmisión USART
RC6
Ent. Digital Sal. Digital Recepción USART
RC7
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
FUNCIONES PORTD
Terminal Funciones
RD0 Ent. Digital Sal. Digital Bit 0 puerto paralelo esclavo
FUNCIONES PORTE
Terminal Funciones
RE0 Ent. Digital Sal. Digital Ent. Analógica Lectura PSP
Todos los tipos de datos son por defecto sin signo (unsigned)
salvo los de tipo float.
Para almacenar datos con signo, hay que introducir el
modificador signed delante del tipo. El efecto que se consigue es el
recogido en la siguiente tabla.
Especificación Significado Tamaño Rango
Signed char caractér con 8 bits -128 a 128
signo
Signed int Entero con signo 8 bits -128 a 128
LENGUAJE C. CONSTANTES
OPERADORES ARITMÉTICOS
OPERADORES RELACIONALES
!=
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
OPERADORES LÓGICOS
DECREMENTO
OPERADORES DE CORRIMIENTO
VARIABLES
• Las variables se utilizan para nombrar posiciones de memoria
RAM; se deben declarar, obligatoriamente, antes de
utilizarlas; para ello se debe indicar el nombre y el tipo de
dato que se manejará. Se definen de la siguiente forma:
• TIPO NOMBRE_VARIABLE[=VALOR INICIAL]
– TIPO hace referencia a cualquiera de los tipos de datos
– NOMBRE_VARIABLE puede ser cualquiera y el valor inicial es opcional.
Ejemplos:
byte k = 5;
byte const SEMANAS = 52;
float temp_limit=500.0;
char k, kant=‘0’;
int x,y,z;
VARIABLES
• Las variables pueden ser de tipo LOCAL o GLOBAL.
• Las variables locales sólo se utilizan en la función
donde se encuentran declaradas; las variables
globales se pueden utilizar en todas las funciones del
programa. Ambas deben declararse antes de ser
utilizadas y las globales deben declararse antes de
cualquier función y fuera de ellas. Las variables
globales son puestas a cero cuando se inicia la
función principal main().
GLOBALES
int16 counter; //Variable global
Void FUNCION ( )
{
int dato1, dato2=34; //Variables locales
}
void main()
{
int8 suma; //Variable local
}
DECLARACIONES DE CONTROL
If-else
Cuando la expresión evaluada es verdadera, Las
instrucciones de la sentencia 1 son ejecutadas. Si la expresión es
falsa, las instrucciones de la sentencia 2 son ejecutadas. La
expresión debe ser evaluada a un valor entero. Los paréntesis
que encierra la expresión son obligatorios.
La palabra especial “else sentencia 2” es opcional.
If – else: If – else:
if (expresión) if (expresión) {
sentencia1; sentencia1;}
else else {
sentencia2; sentencia2;}
Prof. Luis Zurita Microcontroladores II
Sentencia if. IUT Cumaná
NO
A=0? C=5
If (A==0) B=10;
SI Else C=5;
B=10
If (A!=1) B=10;
Else C=5;
NO
A>10? If (A>10)
{IF(A>20) B=5;
SI Else B=15;}
NO
A>20? B=15
SI
B=5
NO
A>10? if (A>10)
{IF(A>20) B=15;}
SI else B=5;
B=5
SI
A>20? B=15
NO
SI
switch (A){
A=0? B=1 case 0:
B=1;
NO break;
case 2:
SI B=2;
A=2? B=2
break;
case 3:
NO
B=3;
break;
SI
A=3? B=3 default:break
;}
NO
For(N=1;N<=10;N++)
N=1 {
NO Printf(“%u”,N);
}
NO
N<=10?
SI
IMPRIMIR N
N=N+1 SI
NO
COMENTARIOS
Los comentarios se incluyen en el código fuente para documentar y
orientar al programador sobre el código que se diseña.
Son ignorados por el compilador y no afectan a la longitud ni
rapidez de ejecución del código final.
Un comentario se puede colocar en cualquier lugar del programa y
pueden tener la longitud y el número de líneas que se quiera.
Hay dos formatos posibles para los comentarios:
Formato 1. Empiezan por // y llegan hasta el final de la línea.
// Esto es un comentario.
Formato 2. Empiezan por /* y finalizan por */. No es posible anidar
comentarios con este formato. Ejemplos:
/*Esto también es
un comentario*/
/*Pero esto que /*parece un comentario válido*/ no lo es*/
OTRAS SENTENCIAS
• Return: se emplea para devolver datos en las
funciones.
• Break: permite salir de un bucle, se utiliza
para While, For, Do y Switch.
• Goto: provoca un salto incondicional.
DIRECTIVAS
• Las directivas de pre-procesado comienzan
con el símbolo # y continúan con un comando
específico. La sintaxis depende del comando.
Algunos comandos no permiten otros
elementos sintácticos en la misma expresión.
DIRECTIVAS DE INTERÉS
# DEVICE chip: permite definir el PIC con el que se
realizará la compilación. Ejemplo:
#device PIC16F877
#FUSES options: permite definir la palabra de
configuración para programar un PIC. Ejemplo:
#fuses XT,NOWDT,PUT,NOPROTECT, NOLVP
#INCLUDE <archivo>: permite incluir un fichero en
el programa. Ejemplo:
#INCLUDE <16f877.h>
DIRECTIVAS DE INTERÉS
#USE DELAY (CLOCK=SPEED): permite definir las frecuencias
del oscilador del PIC, el compilador lo utiliza para realizar
cálculos de tiempo. Se puede utilizar M, MHZ, K y KHZ para
definir la frecuencia. Ejemplo:
#use delay(clock=4000000)
Luego de definida en las declaraciones se pueden utilizar
las funciones:
delay_ms(tiempo en milisegundos)
delay_us(tiempo en microsegundos)
delay_cycles(tiempo en base a los ciclos de máquina)
FUNCIONES
• El compilador CCS suministra una serie de funciones
predefinidas para acceder y utilizar el PIC y sus
periféricos. Estas funciones facilitan la configuración
del PIC sin entrar en el nivel de los registros
especiales.
#include <16F877.h>
#fuses XT,NOWDT,NOLVP
#use delay (clock=4000000)
#BYTE TRISB=0x86
#BYTE PORTB=0x06
#BYTE OPTION_REG=0x81
void main ( ) {
bit_clear (OPTION_REG,7);
bit_set (TRISB,0);
bit_clear (TRISB,1);
bit_clear (PORTB,1);
while (1){
if (bit_test(PORTB,0)==1)
bit_clear(PORTB,1);
else
bit_set(PORTB,1);
}
}
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
MANEJO DE PUERTOS
• A través de las directivas
El compilador ofrece funciones predefinidas para trabajar con
los puertos. Estas funciones son:
output_X(valor);
input_X( );
set_tris_X(valor);
port_b_pullups (valor); //True o FALSE
get_tris( );
Ejemplo:
output_A(0xFF);
valor=input_B( );
set_tris_C(0x0F);
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
MANEJO DE PUERTOS
• Existen una serie de funciones asociadas a un pin*. El
parámetro pin se define en el fichero include con un formato
del tipo PIN_Xn, donde X es el puerto y n es el número de pin.
#define PIN_A0 40
#define PIN_A1 41
Las funciones son:
output_low (pin*);
output_high (pin*);
output_bit (pin*,valor);
output_toggle (pin*);
output_float (pin*); // pin de entrada a tensión flotante
input_state (pin*);
Input (pin*);
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
MANEJO DE PUERTOS
• Las funciones output_x() e input_x()
dependen de la directiva tipo #USE_IO que
esté activa. Directivas:
#USE FAST_IO(PUERTO)
Con la función output_x() se saca el valor al
puerto y con la función input_x() se lee el
puerto. La directiva no modifica previamente
el registro TRIS correspondiente.
MANEJO DE PUERTOS
#include <16F877.h>
#fuses XT,NOWDT,NOLVP
#use delay (clock=4000000)
#use fast_io(B)
void main ( ) {
port_B_pullups (TRUE);
set_tris_B(0x01);
output_low(PIN_B1);
while (1){
if (input(PIN_B0)==1)
output_low(PIN_B1);
else
output_high (PIN_B1);
}
}
Prof. Luis Zurita Microcontroladores II
IUT Cumaná
MANEJO DE PUERTOS
#USE STANDARD_IO(PUERTO)
Con la función output_x() el compilador se
asegura de que el terminal, o terminales
correspondientes sean de salida mediante la
modificación del TRIS correspondiente. Con la
función input_x() ocurre lo mismo pero
asegurando el terminal o terminales como
entrada. Es la directiva por defecto. Entonces,
el ejemplo anterior quedaría:
MANEJO DE PUERTOS
#include <16F877.h>
#fuses XT,NOWDT,NOLVP
#use delay (clock=4000000)
#use standard_io(B)
void main ( ) {
port_b_pullups (TRUE);
output_low(PIN_B1);
while (1){
if (input(PIN_B0)==1)
output_low(PIN_B1);
else
output_high (PIN_B1);
}
}
( ciclo while )
// Definición de variables globales
// Definición de funciones
void main(void)
{
// Definición de variables locales
// Configuración de registros (recursos y puertos)
// ciclo infinito
while ( 1 )
{
// Programa de usuario
}
}
Prof. Luis Zurita Microcontroladores II
ESTRUCTURA DE UN PROGRAMA EN C IUT Cumaná
( ciclo for )
// Definición de variables globales
// Definición de funciones
void main(void)
{
// Definición de variables locales
// Configuración de registros (recursos y puertos)
// ciclo infinito
for ( ; ; )
{
// Programa de usuario
}
}
Prof. Luis Zurita Microcontroladores II
ESTRUCTURA DE UN PROGRAMA EN C IUT Cumaná
( ciclo do - while )
// Definición de variables globales
// Definición de funciones
void main(void)
{
// Definición de variables locales
// Configuración de registros (recursos y puertos)
// ciclo infinito
do
{
// Programa de usuario
} while ( 1 ) ;
}
Prof. Luis Zurita Microcontroladores II