58
MPLAB X MPLAB XC8 C COMPILER LENGUAJE C GERMÁN ANDRÉS ZAPATA PUERTA

LENGUAJE C - files.microcontroladores.webnode.com.cofiles.microcontroladores.webnode.com.co/200000062-bd4f6be491... · lcd_putch(variable); //lcd_putch: envía variables (variable+48)=ASCII

Embed Size (px)

Citation preview

MPLAB X

MPLAB XC8 C COMPILER

LENGUAJE C

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 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);

}

….

}

VECTORES

APLICACIONES CON VECTORES:

Display 7 segmentos.

Matrices de LEDS.

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

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í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

PANTALLAS LCD

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

TECLADO MATRICIAL

Descargar el archivo TECLADO.X.rar de lapágina.

TECLADO MATRICIAL

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

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 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

PWM(MODULACIÓN POR ANCHO DE PULSO)

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;

}

}

MÓDULO USART

G E R M Á N A N D R É S Z A P A T A P U E R T A

GRACIAS