Está en la página 1de 58

LENGUAJE C

MPLAB X
{ MPLAB XC8 C COMPILER

GERMÁN ANDRÉS ZAPATA PUERTA


TIPOS DE DATOS ENTEROS
RANGO DE DATOS ENTEROS
TIPOS DE DATOS REALES
RANGO DE DATOS REALES
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
OPERADORES DE
ASIGNACIÓN

Operador Operación
= Asigna el valor a una variable
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 { }.
DO - WHILE
(HAGA - MIENTRAS QUE)

do
{
INSTRUCCIÓN 1;
INSTRUCCIÓN 2;
…….
}
while (EXPRESIÓN);
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>
PLANTILLA INICIAL
EJERCICIOS
PROPUESTOS
FUNCIONES
 Las FUNCIONES, SUBPROGRAMAS o SUBRUTINAS son programas
dentro del programa principal, que pueden ser invocados en cualquier
momento desde éste o desde otra función, y permiten realizar 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ón debe recibir para
realizar su tarea.
 Un tipo de dato de retorno: tipo de dato del valor que la función devolverá
al terminar su ejecución.
 El código u órdenes de procesamiento: conjunto de órdenes y sentencias
que debe ejecutar la subrutina.
FUNCIONES
int 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 uno


Ej: 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};
VECTORES
int vect[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);
}
….
}
VECTORES

APLICACIONES CON VECTORES:

 Display 7 segmentos.
 Matrices de LEDS.
PANTALLAS LCD

 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 del
proyecto, 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 que
se copio en la carpeta del proyecto hay que adicionarlo a header files
(archivos cabeza).
PANTALLAS LCD
PANTALLAS LCD
PANTALLAS LCD

En el proyecto se
debe adicionar:

 En Header Files:
lcd.h

 En Source Files:
lcd.c
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ínea
lcd_puts("PRUEBA LCD...");
lcd_goto(0x40); // selecciono la segunda línea
lcd_puts("HOLA MUNDO");

while (1);

}
NOTA:
lcd_puts(“texto”); //lcd_puts: envía texto
lcd_putch(variable); //lcd_putch: envía variables (variable+48)=ASCII
PANTALLAS LCD
TECLADO MATRICIAL
 Funcionan como una matriz: por filas y
columnas
 Generalmente se van multiplexando las filas y
escaneando las columnas.
 Se deben colocar resistencias en las columnas a

GND o a +5V, o si el teclado esta en el Puerto B


activar las resistencias de pull up.
 Se debe incluir la librería “keydr.h” y
adicionar al proyecto los archivos: keydr.h,
initkey.c y getckey.c
TECLADO MATRICIAL

 Descargar el archivo TECLADO.X.rar de la


página.
TECLADO MATRICIAL
CONVERSOR ANÁLOGO / DIGITAL
(C A/D)
 Resolución = Vref/#bits
 Típicamente se trabaja con Vref = 5V (también
se puede 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 Reg. de control


ADCON1
ANSEL Ent. y Sal. Análogas o
digitales
ANSELH
ADRESL Resultado de la
conversión
ADRESH

Ver Datasheet
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
CONVERSOR ANÁLOGO / DIGITAL
(C A/D)

Ver ejemplo completo en


CAD_LCD.X
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 del


pulso)
 Se recomienda opto-acoplar la salida
PWM
(MODULACIÓN POR ANCHO DE PULSO)

Registros que lo controlan:

CCP1CON Reg. de control

PR2
Config. del Periodo
T2CON
CCPR1L
Config. del Ancho del Pulso
TMR2
Ver Datasheet
PWM
(MODULACIÓN POR ANCHO DE PULSO)

CONFIGURACIÓN TÍPICA:

CCP1CON = 0B00001100;
P1M = 00 (Salida simple – no se va a utilizar
puente 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)

U1
1 25
RE3/MCLR/VPP RB4/AN11/P1D
26
RB5/AN13/T1G
2 27
0 3
RA0/AN0/ULPWU/C12IN0-
RA1/AN1/C12IN1-
RB6/ICSPCLK
RB7/ICSPDAT
28
4
RA2/AN2/VREF-/CVREF/C2IN+
5 11
0 6
RA3/AN3/VREF+/C1IN+
RA4/T0CKI/C1OUT
RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
12
7 13
RA5/AN4/SS/C2OUT RC2/CCP1/P1A
10 14
RA6/OSC2/CLKOUT RC3/SCK/SCL
9 15
RA7/OSC1/CLKIN RC4/SDI/SDA
16
RC5/SDO
21 17
RB0/AN12/INT RC6/TX/CK
22 18
RB1/AN10/P1C/C12IN3- RC7/RX/DT A
23
RB2/AN8/P1B
24
RB3/AN9/PGM/C12IN2- B
PIC16F883
C

D
PWM
(MODULACIÓN POR ANCHO DE PULSO)
MÓDULO USART
(RECEPCIÓNTRANSMISIÓ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 otro


dispositivo como el PC u otro IC.
 Para la comunicación con el PC se requiere un
MAX232 para el acople de niveles de voltaje.
MÓDULO USART

Registros que lo controlan:

TXSTA Reg. de control


RCSTA
SPBRG Config. de la velocidad (Baudios)

TXREG
Reg. de transmisión y recepción
RCREG
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;
}
}
MÓDULO USART
GRACIAS
{ GERMÁN ANDRÉS ZAPATA PUERTA

También podría gustarte