Microcontroladores Programacion
Microcontroladores Programacion
Short
Int 8 bit 0 a 255 Entero
Int8
Int16 16 bit 0 a 65,535 Entero de 16 bit
Long
Int32 32 bit 0 a 4,294,967,295 Entero de 32 bit
Float 32 bit 1.5x10-45 a 3.402x1038 Coma flotante
Char 8 bit 0 a 255 Carácter
Void - - Sin valor
Signed Int8 8 bit -128 a +127 Entero con signo
Signed Int16 16 bit -32,768 a +32,767 Entero largo con signo
Signed Int32 32 bit -2147483648 a +2147483647 Entero 32 bits con signo
Variables
• Se debe declarar obligatoriamente, de acuerdo a las reglas ANSI del lenguaje C
Ejemplo:
• int voltaje = 20;
• int1 LED;
Reglas de Variables
• Deben empezar con una letra o guión bajo. Ejemplo: amperios, _7segmentos;
• No debe tener el mismo nombre que una “palabra reservada” del lenguaje. Ejemplo: for,
if, int, while, do, entre otras son palabras reservadas del lenguaje que no pueden ser
usadas.
• No pueden llevar tildes. Ejemplo: Número, ecuación, lección, dígito; son palabras que
tienen tilde y no deben usarse.
• No debe existir espacios en blanco. Ejemplo: la ciudad. Hay un espacio en blanco entre
las palabras la y ciudad. En esta forma no se puede utilizar.
Variables
#include <18F4550.h>
#fuses HS
#use delay (clock=12000000)
Las variables pueden ser de tipo
LOCAL o GLOBAL. Las variables
int puertos; //variable global
locales se utilizan sólo en la función
void main()
donde se encuentran declaradas y {
las globales en todas las funciones int8 voltaje; //variable local
del programa. Ambas variables }
deben declararse antes de cualquier void función (void)
función y fuera de ella. Las variables {
globales son puestas a cero cuando float res ; //variable local
se inicia la función principal main (). }
Operadores
Los operadores aritméticos que soporta el compilador CCS.
Símbolo Significado
+ Suma
- Resta
* Multiplicación
/ División
% Módulo, resto de una división entera
++ Incremento
-- Decremento
Sizeof Determina el tamaño, en bytes de un operando
De Asignación
Símbolo Significado
+= Asignación de suma: m +=n, es lo mismo m= m+n
-= Asignación de resta: m -=n, es lo mismo m= m-n
*= Asignación de multiplicación: m *=n, es lo mismo m= m*n
/= Asignación de división: m /=n, es lo mismo m= m/n
%= Asignación del resto de la división: m %=n, es lo mismo m= m%n
<<= Asignación de desplazamiento a la izquierda: m <<=n, es lo mismo m= m<<n
Símbolo Significado
~ Complemento a 1 (Inversión)
|| OR | OR
Operadores de desplazamiento
a. x= 11000101 << 1 En todos los casos los “unos” son reemplazados por “ceros”,
b. x= 11000101 << 2 desde el bit menos significado y los bits que superan la
c. x= 11000101 << 3 capacidad del entero del bit más significativo se desbordan y
d. x= 11000101 >> 1 desaparecen
e. x= 11000101 >> 2
f. x= 11000101 >> 3
Operadores de desplazamiento
El 3 después del signo << indica que los bits se desplazarán tres
posiciones a la izquierda. Por tanto, el nuevo valor de x es
x= 11000101 << 3 00101000. En este caso es lo mismo que realizar una multiplicación
al número binario por 8
Operadores de desplazamiento
Para el desplazamiento a la derecha, los “unos” son reemplazados por “ceros” desde el bit más
significativo y al superar la capacidad del número el bit menos significativo desparece.
El 1 después del signo >> indica que los bits se desplazarán una
x= 11000101 >> 1 posición a la derecha. Por tanto, el nuevo valor de x es 01100010. En
este caso es lo mismo que realizar una multiplicación al número
binario por 2.
El 2 después del signo >> indica que los bits se desplazarán dos
x= 11000101 >> 2 posiciones a la derecha. Por tanto, el nuevo valor de x es 00110001.
En este caso es lo mismo que realizar una multiplicación al
número binario por 4.
• IF - ELSE
• WHILE
• DO – WHILE
• FOR
• RETURN
• BREAK
• GOTO
• SWITCH – CASE
• CONTINUE
Instrucciones de control ( condiciones)
IF – ELSE
Sirve para tomar decisiones en un
programa.
Ejemplo
Si la condición es
if (condición){ if (x==1) { verdadera (True o 1) se
Instrucción1; ejecuta la Instrucción1.
} bit_set(port_b,0);
Else { si es falsa (False o 0) se
}
Instrucción2; ejecuta la instrucción2
else {
}
bit_set(port_b,1);
}
Instrucciones de control ( condiciones)
WHILE DO WHILE
Repite una serie de instrucciones, mientras Con DO WHILE la expresión se evalúa al final de las instrucciones
la expresión sea cierta (TRUE o 1). do
while (expresión) {
{ instrucciones;
instrucciones; }
} while(expresión)
Se puede ejecutar un bucle sin fin. Las instrucciones primero se ejecutan y se evalúa la
expresión al final, si ésta resulta cierta (TRUE), se repite el bucle
while (1) hasta que la condición sea falsa (FALSE).
{
instrucciones; También con DO WHILE, se puede ejecutar un bucle
} sin fin. Por ejemplo:
O también utilizando el formato: do
{
while (TRUE) instrucciones;
{ }
instrucciones; while(1);
}
Instrucciones de control ( condiciones)
FOR
Es el más usado en la mayoría de lenguajes de
programación. En CCS es similar al formato del Un bucle sin fin usando FOR se genera mediante el siguiente
ANSI C original, formato:
for ( ; ; )
for (valor_inicial, valor_final, incremento) {
{ instrucciones;
instrucciones; }
}
Gama baja
• Microcontroladores de 8 bits, de bajo coste, de 6 pines y bajas prestaciones. Algunos PIC’s de las serie
PIC10 se conocen como gama enana.
• PIC12: microcontroladores de 8 bits, de bajo coste, de 8 pines y bajas prestaciones.
Gama media
• PIC16: microcontroladores de 8 bits, con gran variedad de número de pines y prestaciones medias.
Gama alta
• PIC17 y PIC18: microcontroladores de 8 bits, con gran variedad de número de pines y prestaciones
medias/altas.
• PIC24: microcontroladores de 16 bits.
• PIC32: microcontroladores de 32 bits.
• dsPIC’s. Microcontroladores especializados para el procesamiento de señales digitales.
Familias de microcontroladores PIC
CARACTERÍSTICAS PICF16F84A PIC16F627A PIC16F628A PIC16F648A PIC16F88
Memoria FLASH
(Words) 1024 1024 2048 4096 4096
Memoria EEPROM
(bytes) 64 128 128 256 256
Memoria SRAM
68 224 224 256 368
(bytes)
Puertos I/O 2 2 2 2 2
Pines de I/O 13 16 16 16 16
Oscilador Externo Interno/Externo Interno/ Externo Interno/Externo Interno/Externo
Fuentes de interrupción 10 10 10 10 12
AUSART, SSP
Comunicación serial USART USART USART USART
(SPI e I2C)
Comparadores - 2 2 2 2
7 canales
Conversores AD - - - -
mulltiplexados
CARACTERÍSTICAS PIC16F877A PIC16F887
Frecuencia Máxima 20MHZ 20MHZ
Memoria FLASH (Words) 8192 8192
Memoria EEPROM (bytes) 256 256
Memoria SRAM (bytes) 368 368
Puertos I/O 33 35
Timer (8/16 bits) ½ ½
Oscilador Externo Interno/Externo
Comparadores 2 2
Conversores AD 8 canales (10 bits) 14 canales (10 bits)
Frecuencias INTOSC - 31 KHZ-8 MHZ
Fuentes de interrupción 15 15
ECCP/CCP 0/2 ½
Comunicación serial USART/MSSP EUSART/MSSP
Modos de oscilador 4 8
Los fuses
Todos los microcontroladores PIC tienen incorporados circuitos especiales que se pueden activar o desactivar
según los requerimientos de la aplicación o algún caso en particular.
Los fuses internamente en el microcontrolador son controlados por registros internos y que se pueden habilitar o
deshabilitar mediante software o por medio del equipo programador. CCS provee de instrucciones de alto nivel
que permiten de forma transparente configurar los FUSES (fusibles)
Los fuses
FUSE DESCRIPCIÓN
LP Low power osc < 200 kHz
XT Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
HS High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
RC Resistor/Capacitor Osc with CLKOUT
EC External clock with CLKOUT
EC_IO External clock
H4 High speed osc with HW enabled 4X PLL
RC_IO Resistor/capacitor osc
RC Resistor/Capacitor Osc with CLKOUT
INTRC_IO Internal RC Osc, no CLKOUT
INTRC Internal RC Osc
NOFCMEN Fail-safe clock monitor disabled
FCMEN Fail-safe clock monitor enabled
IESO Internal External Switch Over mode enabled
NOIESO Internal External Switch Over mode disabled
PUT Power up timer
NOPUT No power up timer
BROWNOUT Reset when brownout detected
Configuración del reloj
La mayoría de los microcontroladores PIC de la familia 16F y 18F tienen incorporado un sistema
de reloj para ser utilizado según las necesidades del diseño. El hardware de control del oscilador es el
registro OSCCON (Oscillator Control Register) y el registro oscilador de ajuste OSCTUNE (Oscillator
Tuning Register), se utiliza para ajustar frecuencia interna vía software.
Tipos de osciladores:
Donde, n es el nombre del puerto (A, B, C, D, E) y la variable Dir la dirección en la memoria RAM.
Ejemplo:
#BYTE tris_b = 0xF93
#BYTE port_b = 0xF81
Gestión de puertos
Definidas las variables se pueden controlar los puertos por comandos de
asignación.
Ejemplos:
• tris_a = 0xFF ; Define todo el puerto a como entrada
• tris_b = 0x00; Define todo el puerto b como salida
• tris_d = 0x0F; Define los 4 primeros bits del puerto d como entrada y los 4
bits (MSB) como salida.
1. En el programa primero debemos definir el microcontrolador a utilizarse, para lo cual se utiliza la directiva:
#include <18F4550.h> //Librería para usar el PIC18F4550.
2. Se procede a configurar los fusibles. Dependerá de la aplicación que se esté desarrollando, pero el fusible que
siempre se debe incluir es el reloj que se utilice. En este caso definimos un cristal de alta velocidad HS
#fuses HS,NOWDT,NOPROTECT,PUT, NOPBADEN //Configuración de fusibles.
5. Se establece l registro TRISB que está definido en la localidad 0xF93 como indica en las hojas técnicas del
microcontrolador PIC18F4550
#byte tris_b = 0xF93
Ejemplo1: Prender y apagar un LED conectado en el puerto B0
Otro aspecto importante que se debe tomar en cuenta dentro de la programación es la definición del
puerto como salida. La instrucción tris_b = 0x00; configura el puerto como salida, para que permita
establecer los niveles lógicos de 0 y 1.
#include <18F4550.h> //Librería para usar el PIC18F4550.
#fuses HS, NOWDT, NOPROTECT, PUT, NOPBADEN //Configuración de fusibles.
#use delay (clock=12000000) // FOSC =12MHz.
#byte tris_b = 0xF93 //Define el registro tris b en la localidad 0xF93.
#bit b0= 0xF81.0 //Define el bit b0 en la localidad 0xF81.0.
void main() //Función principal main.
{
disable_interrupts (GLOBAL); //Deshabilita las interrupciones globales
tris_b = 0x00; //Configura el puerto B como salida.
do{ //Inicio del bucle infinito.
b0= 0; //El puerto RB0 = 0.
delay_ms( 500 ); //Retardo de 500 ms.
b0 =1; //El Puerto RB0 = 1.
delay_ms(500); //Retardo de 500 ms.
} while ( TRUE ); //Bucle infinito.
} //Fin del bucle main.
Ejemplo1: Prender y apagar un LED conectado en el puerto B0
Ejemplo2: Prender y apagar un LEDs conectado en el puerto B0
VDD
VSS
VEE
5 39
RW
RS
D0
D1
D2
D3
D4
D5
D6
D7
RV1 RA3/AN3/VREF+ RB6/PGC
E
6 40
RA4/T0CKI/C1OUT RB7/PGD
10K 7
RA5/AN4/SS/C2OUT
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
RC0/T1OSO/T1CKI
8 16
48%
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
D4
D5
D6
D7
RS
E
RW
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
R1 RD0/PSP0
20
E
10K RD1/PSP1 RS
21
RD2/PSP2 RW
22
RD3/PSP3
27
RD4/PSP4 D4
28
RD5/PSP5 D5
29
RD6/PSP6 D6
30
RD7/PSP7 D7
PIC16F877A
Ejemplo 6 : configurar puesto analógico – digital .
# include <16f877a.h>
#include <lcd.c>
long VOLTAJE_ADC;
void main()
{
lcd_init();
setup_adc_ports(AN0); // CONFIGURA LOS PUERTOS COMO ANALOGICOS
setup_adc(adc_clock_internal); // SELECCIONA EL MODO PARA HACER LA CONVERCION SI ES RELOJ INTERNO O DIVISORES DE RECUENCIA)
while(true)
{
set_adc_channel(0); // SELECCIONA EL CANAL QUE SE OCUPARA Q VAN DESDE 0 HASTA 7
delay_us(2);
VOLTAJE_ADC = read_adc(); // LEE EL VALOR ANALOGICO EN EL PIN AN0
lcd_gotoxy(1,1);
printf(lcd_putc, "Voltaje: %Lu", VOLTAJE_ADC);
delay_ms(100);