RANGO DE DATOS REALES
Tipo Rango
FLOAT ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038
DOUBLE ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038
LONG DOUBLE ±1.17549435082 x 10-38 .. ±6.80564774407 x 1038
REPRESENTACIÓN
NOTA: Los comentarios se hacen con:
//para una solo línea
/* para iniciar un bloque de comentarios
*/ para finalizar un bloque de comentarios
EXPRESIONES Y OPERADORES
LÓGICOS (AND, OR, NOT…)
ARITMÉTICOS (SUMA, RESTA, MÓDULO…)
ASIGNACIÓN (=)
RELACIONALES (MAYOR, MENOR, IGUAL…)
OPERADORES LÓGICOS
Operador operación
& AND; compara pares de bits y regresa 1 si ambos son 1’s, de otra
manera regresa 0.
| OR (inclusive); compara pares de bits y regresa 1 si uno o ambos
son 1’s, 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.
OPERADORES ARITMÉTICOS
Operador Operación
+ Suma
- Resta
* Multiplicación
/ División
% Módulo, regresa el residuo de la división entera (no puede ser usado
con variables flotantes
++ Incremento
-- Decremento
OPERADORES RELACIONALES
Operador Operación
== igual
!= no igual (diferente de)
> mayor que
< menor que
>= mayor que o igual a
<= menor que o igual a
ESTRUCTURAS DE CONTROL
DECISIÓN O SELECTIVAS
if, else, switch (case)
REPETITIVAS (CICLOS)
while, do – while, for
BIFURCACIÓN DE CONTROL
goto, break, return
DECISIÓN SIMPLE
if (EXPRESIÓN)
{
INSTRUCCIÓN 1;
INSTRUCCIÓN 2;
…….
}
NOTA: Si sólo hay una instrucción no es necesario colocar llaves { }.
IF - ELSE
if (EXPRESIÓN)
{
INSTRUCCIÓN 1;
INSTRUCCIÓN 2;
…….
}
else
{
INSTRUCCIÓN 1;
INSTRUCCIÓN 2;
…….
}
DECISIÓN MULTIPLE (CASOS)switch (EXPRESIÓN)
{
case CONST1: INSTRUCCIÓN 1;
break;
case CONST2: INSTRUCCIÓN 2;
break;
…..
default: INSTRUCCIÓN N;
break;
}
CICLO WHILE (MIENTRAS)
while (EXPRESIÓN)
{
INSTRUCCIÓN 1;
INSTRUCCIÓN 2;
…….
}
NOTA: Si sólo hay una instrucción no es necesario colocar llaves { }.
CICLO FOR (PARA)
for (EXP1; EXP2; EXP3)
{
INSTRUCCIÓN 1;
INSTRUCCIÓN 2;
…….
}
EXP1: CONDICIÓN INICIAL
EXP2: CONDICIÓN FINAL
EXP3: INCREMENTO O DECREMENTO
RETARDOS DE TIEMPO (DELAY)
__delay_ms(tiempo en miliseg.);
__delay_us(tiempo en microseg.);
NOTA: Requiere incluir la librería: <htc.h>
#include <htc.h>
FUNCIONES Las FUNCIONES, SUBPROGRAMAS o SUBRUTINAS son
programas dentro del programa principal, que pueden ser invocadosen cualquier momento desde éste o desde otra función, y permitenrealizar una tarea específica.
DECLARACIÓN DE UNA FUNCIÓN:Las declaraciones de funciones generalmente son especificadas por: Un nombre único: nombre de la función con el que se identifica y se
distingue de otras. No podrá haber otra función con ese nombre. Una lista de parámetros(datos de entrada): especificación del
conjunto de argumentos (pueden ser cero, uno o más) que la funcióndebe recibir para realizar su tarea.
Un tipo de dato de retorno: tipo de dato del valor que la funcióndevolverá al terminar su ejecución.
El código u órdenes de procesamiento: conjunto de órdenes ysentencias que debe ejecutar la subrutina.
FUNCIONESint A,B,C;
int suma(int x, int y);{int z;z = x + y;return z;}
void main(){
….C = suma(A,B);….
}
VECTORES Los vectores son espacios de memoria en los cuales se pueden almacenar
valores que luego serán utilizados en el programa.
Funcionan como las TABLAS en assembler.
Van desde cero hasta el número de elementos menos unoEj: vect[10] : va desde 0 hasta 9
Se definen así:Tipo_de_dato Nombre [#_de_elementos] = {elemento1,elemento2,….elementoN};
Ejemplo:int vect[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X67};
VECTORESintvect[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X67};
int conta;
void main()
{
….
for (conta=0;conta<=9;conta++)
{
PORTB = vect[conta];
__delay_ms(1000);
}
….
}
Visualizan caracteres alfa-numéricos.
Se polarizan con GND y +5V
El contraste se puede manejar con una resistencia a GND.
Se pueden trabajar con 4 u 8 bits de datos.
Manejan el estándar HD44780 de Hitachi.
Solo reciben caracteres ASCII.
NOTA: Hay que copiar los archivos: lcd.h y lcd.c en la carpeta delproyecto, ejemplo: c:\mplabx\lcd\lcd.x
Además el archivo lcd.c que se copio en la carpeta del proyecto
hay que adicionarlo a source files (archivos fuentes) y el archivo lcd.h quese copio en la carpeta del proyecto hay que adicionarlo a header files(archivos cabeza).
PANTALLAS LCD
PANTALLAS LCD#include <pic.h>#include <htc.h>#include "lcd.h“ //Se debe adicionar para el manejo del LCD
void main(){
lcd_init();lcd_goto(0); // selecciono la primera línealcd_puts("PRUEBA LCD...");lcd_goto(0x40); // selecciono la segunda línealcd_puts("HOLA MUNDO");
while (1);
}NOTA:lcd_puts(“texto”); //lcd_puts: envía textolcd_putch(variable); //lcd_putch: envía variables (variable+48)=ASCII
TECLADO MATRICIAL
Funcionan como una matriz: por filas ycolumnas
Generalmente se van multiplexando las filas yescaneando las columnas.
Se deben colocar resistencias en las columnas aGND o a +5V, o si el teclado esta en el PuertoB activar las resistencias de pull up.
Se debe incluir la librería “keydr.h” y adicionaral proyecto los archivos: keydr.h, initkey.c ygetckey.c
CONVERSOR ANÁLOGO / DIGITAL (C A/D)
Resolución = Vref/#bits
Típicamente se trabaja con Vref = 5V (también sepuede trabajar con -5V ≤ Vref ≤ +5V)
Para la familia 16F la conversión es de 10 bits(1024)
Resolución = 5V/1024 = 4.88mV/bit
Calculo de #bits: #bits =Vin / Res
#bits = Vin / 4.88mV/bit
Calculo de Voltaje: Vin = #bits * Res
Vin = #bits * 4.88mV/bit
CONVERSOR ANÁLOGO / DIGITAL (C A/D)
Registros que lo controlan:
ADCON0
ADCON1
ANSEL
ANSELH
ADRESL
ADRESH
Ver Datasheet
Reg. de control
Ent. y Sal. Análogas o digitales
Resultado de la conversión
CONVERSOR ANÁLOGO / DIGITAL (C A/D)
CONFIGURACIÓN TÍPICA:
ADCON0 = 0B11000001;
Reloj = 11 (RC interno 500KHz)
Canal = 0000 = AN0 = RA0
GO = 0 (conversión no iniciada)
ADON = 1 (Módulo C A/D encendido)
CONVERSOR ANÁLOGO / DIGITAL (C A/D)
CONFIGURACIÓN TÍPICA:
ADCON1 = 0B10000000;
ADFM = 1 (Justificación a Derecha)
VCFG1 = 0 (Vref- = VSS)
VCFG0 = 0 (Vref+ = VDD)
ANSEL = 0B00000001; //RA0 = ENT. ANALOGA
ANSELH = 0B00000000; //PORTB = DIGITAL
PWM(MODULACIÓN POR ANCHO DE PULSO)
Control de velocidad para motores
Control de intensidad luz
Control de potencia de cargas
Muy utilizado en la industria
Fácil configuración (Frecuencia y Ancho delpulso)
Se recomienda opto-acoplar la salida
PWM(MODULACIÓN POR ANCHO DE PULSO)
Registros que lo controlan:
CCP1CON
PR2
T2CON
CCPR1L
TMR2
Reg. de control
Config. del Periodo
Config. del Ancho del Pulso
Ver Datasheet
PWM(MODULACIÓN POR ANCHO DE PULSO)
CONFIGURACIÓN TÍPICA:
CCP1CON = 0B00001100;
P1M = 00 (Salida simple – no se va a utilizarpuente H)
DC1B = 00 (Los LSB del Duty en 0)
CCP1M = 1100 (Modo PWM)
PWM(MODULACIÓN POR ANCHO DE PULSO)
CÁLCULO DEL PERIODO:
PWM Periodo = [(PR2) + 1] * 4 * Tosc * (TMR2 Prescaler)
PR2 = [(PWM Periodo) / (4 * Tosc * TMR2 Prescaler)] – 1
NOTA: Tosc = 1 / Fosc
Ej: Frec. = 10 KHz => PWM Periodo = 1/10KHz = 0.1ms
Fosc = 4MHz => Tosc = 0.25us TMR2 Prescaler = 1
PR2 = 99 NOTA: PR2 ≤ 255
PWM(MODULACIÓN POR ANCHO DE PULSO)
CONFIGURACIÓN TÍPICA:
PR2 = 99;
T2CON = 0B00000100;
TMR2ON = 1 (Enciende TMR2)
T2CKPS = 00 (Prescaler = 1)
01 (Prescaler = 4)
1X (Prescaler = 16)
PWM(MODULACIÓN POR ANCHO DE PULSO)
TRISA=0B11111111; //RA0=PULSA_INCRE, RA1=PULSA_DECRE
TRISB=0B11111111;
TRISC=0B11111011; //RC2=SALIDA_PWM
ANSEL=0B00000000; //PORTA=DIGITAL
ANSELH=0B00000000; //PORTB=DIGITAL
CCP1CON=0B00001100; //MODO PWM
PR2=99; //FRECUENCIA A 10KHz
T2CON=0B00000100; //PRESCALER = 1
CCPR1L=0; //DUTY = 0
TMR2=0;
while(1) // Bucle infinito
{
if (RA0 == 1) //PULSADOR PARA INCREMENTAR DUTY
{
CCPR1L++;
if (CCPR1L>99) //COMPARACIÓN PARA QUE NO SE PASE DE 99 (PR2)
{
CCPR1L=99;
}
__delay_ms(200);
}
if (RA1 == 1) //PULSADOR PARA DECREMENTAR DUTY
{
CCPR1L--;
if (CCPR1L == 255) //COMPARACIÓN PARA QUE NO PASE DE 0
{
CCPR1L=0;
}
__delay_ms(200);
}
}
PWM(MODULACIÓN POR ANCHO DE PULSO)
RA0/AN0/ULPWU/C12IN0-2
RA1/AN1/C12IN1-3
RA2/AN2/VREF-/CVREF/C2IN+4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RB0/AN12/INT21
RB1/AN10/P1C/C12IN3-22
RB2/AN8/P1B23
RA7/OSC1/CLKIN9
RA6/OSC2/CLKOUT10
RC0/T1OSO/T1CKI11
RC1/T1OSI/CCP212
RB7/ICSPDAT28
RB6/ICSPCLK27
RB5/AN13/T1G26
RB4/AN11/P1D25
RC7/RX/DT18
RC6/TX/CK17
RC5/SDO16
RC4/SDI/SDA15
RC3/SCK/SCL14
RC2/CCP1/P1A13
RA3/AN3/VREF+/C1IN+5
RB3/AN9/PGM/C12IN2-24
RE3/MCLR/VPP1
U1
PIC16F883
0
0
A
B
C
D
MÓDULO USART(RECEPCIÓN TRANSMISIÓN SINCRONA ASINCRONA
UNIVERSAL)
Módulo de comunicación serie.
Síncrona (Reloj)
Asíncrona (Tiempo - sin reloj)
Maneja el protocolo RS-232.
Permite la comunicación entre el µC y otrodispositivo como el PC u otro IC.
Para la comunicación con el PC se requiere unMAX232 para el acople de niveles de voltaje.
MÓDULO USART
Registros que lo controlan:
TXSTA
RCSTA
SPBRG
TXREG
RCREG
Reg. de control
Config. de la velocidad (Baudios)
Reg. de transmisión y recepción
Ver Datasheet
MÓDULO USART
CÁLCULO DE LA VELOCIDAD (BAUDIOS):
Baudios = Fosc / (B * [SPBRG + 1])
B=64 BRGH = 0 Baja velocidad
B=16 BRGH = 1 Alta velocidad
SPBRG = (Fosc / [B * Baudios]) – 1
Ej: Fosc = 4MHz, 9600 Baudios, B=64 (BRGH=0)
SPBRG = 5 o SPBRG = 6
Fosc = 4MHz, 9600 Baudios, B=16 (BRGH=1)
SPBRG = 25
MÓDULO USART
TRISA=0B11111111; // PORTA todo entradas
TRISB=0B11111110; // RB0 = salida
TRISC=0B10111111; // PORTC7:entrada(RX) PORTC6:salida(TX)
ANSEL=0B00000000;
ANSELH=0B00000000;
TXSTA=0B00100100; //SE CONFIGURA LA TRANSMISION
RCSTA=0B10010000; //SE CONFIGURA LA RECEPCION
SPBRG=25; //SE CONFIGURA LA VELOCIDAD A 9600 BAUDIOS
TXREG='O'; //TRANSMITE EL CARACTER O
__delay_ms(5);
TXREG='K'; //TRANSMITE EL CARACTER K
__delay_ms(5);
RB0=0;
while(1) { // Bucle infinito
if (RCIF==1) //pregunta si recibió algo en la bandera RCIF de reg. PIR1
{
DATO=RCREG; //le lleva a DATO lo que llego por el puerto
RCIF=0; //se coloca la bandera nuevamente en 0
}
if (DATO=='A')
{
RB0=1;
TXREG='O'; //TRANSMITE EL CARACTER O
__delay_ms(5);
TXREG='N'; //TRANSMITE EL CARACTER N
__delay_ms(5);
TXREG=' '; //TRANSMITE EL CARACTER ESPACIO
__delay_ms(5);
DATO=0;
}
if (DATO=='B')
{
RB0=0;
TXREG='O'; //TRANSMITE EL CARACTER O
__delay_ms(5);
TXREG='F'; //TRANSMITE EL CARACTER F
__delay_ms(5);
TXREG='F'; //TRANSMITE EL CARACTER F
__delay_ms(5);
TXREG=' '; //TRANSMITE EL CARACTER ESPACIO
__delay_ms(5);
DATO=0;
}
}