Está en la página 1de 29

ELECTRONICA INDUSTRIAL

C5. Introduccin a la Programacin en C con el Pic16


http://www.microchipc.com/index.php Tipos de datos en C para el Pic16 Programar en C: Operadores Instrucciones Trabajo con registros (Puertos E/S)

Subrutinas de retardo
Creacin de funciones Puertos E/S

Introduccin a la Programacin en C con el Pic16

SD-2

TIPOS DE DATOS EN C

E N T E R O S

D E C I M A L E S

Introduccin a la Programacin en C con el Pic16

SD-3

OPERADORES EN C
Operadores ARITMTICOS:
OPERADORES ARITMTICOS (se opera con enteros)
Operador Operacin Suma resta Multiplicacin Divisin Mdulo (resto en una divisin)

EJEMPLO (E1 tiene el valor 0x05 y E2 tiene el valor 0x02)

Expresin E1 + E2 E2 E1 E1 * E2 E1 / E2 E1 % E2

Valor en W 0x07h 0xFD (-3 en CA2) 0x0A 0x02 0x01

+ * / %

Introduccin a la Programacin en C con el Pic16

SD-4

OPERADORES EN C
Operadores LOGICOS y de RELACIN sobre expresiones:
OPERADORES LGICOS Y DE RELACIN Operador Operacin Negacin lgica (NOT) EJEMPLO: E1 tiene el valor 0x20 (VERDADERO) y E2 tiene el valor 0x21 (VERDADERO)

Expresin

Valor en W

! && ||
> < >= <= == !=

!E1 E1 && E2 E1 | | E2
E1> E2 E1 < E2 E1 >= E2 E1 <= E2 E1 == E2 E1 != E2

0x00 0x01 0x01


0x00 0x01 0x00 0x01 0x00 0x01

Producto lgico (AND) Suma lgica (OR)


Mayor que Menor que Mayor o igual que Menor o igual Igual a No igual a

Introduccin a la Programacin en C con el Pic16

SD-5

OPERADORES EN C
Operadores LOGICOS SOBRE BITS:
OPERADORES LGICOS (se opera con los bits de igual posicin de los smbolos y constantes) Operador Operacin EJEMPLO (E1 tiene el valor 0x05 y E2 tiene el valor 0x02)

Expresin

Valor en W

~
& | ^ >> <<

NOT
AND OR OR Exclusivo (XOR) Desplazar a la derecha Desplazar a la izquierda

~E1
E1 & E2 E1 | E2 E1^ E2 E1 >> E2 E1 << E2

0xFB (-5 en CA2)


0x00 0x07 0x07 0x01 0x14

Introduccin a la Programacin en C con el Pic16

SD-6

OPERADORES EN C
Operadores de ASIGNACIN:
Operador Operacin Asignacin aritmtica o lgica Incrementar Decrementar Sumar y asignar Restar y asignar Multiplicar y asignar Dividir y asignar Mdulo y asignar AND y asignar OR y asignar Ejemplo var = 0 var ++ var -var += k var -= k var *= k var /= k var %= k var &= k var |= k Significado var = 0 var = var + 1 var = var -1 var = var + k var = var - k var = var * k var = var / k var = var % k var = var & k var = var | k

= ++ -+= -= *= /= %= &= |=

^=
>>= <<=

XOR y asignar
Desplazar a la derecha y asignar Desplazar a la izquierda y asignar

var ^= k
var >>= k var <<= k

var = var ^ k
var = var >> k var = var << k

rol
ror

Rotar hacia la izquierda y asignar


Rotar hacia la derecha y asignar

var rol 1
var ror 1

Var = var rol 1


Var = var ror 1

Introduccin a la Programacin en C con el Pic16

SD-7

OPERADORES EN C
Operadores de DIRECCION:

Operador

Operacin

Ejemplo

Valor en W

low
high highword

Byte bajo de la direccin


Byte alto de la direccin Byte ms alto de la direccin

x = low etiqueta
x = high etiqueta x = highword etiqueta

Bits 7 a 0 de la direccin etiqueta


Bits 15 a 8 de la direccin etiqueta Bits 15 a 0 de la direccin etiqueta

Introduccin a la Programacin en C con el Pic16

SD-8

INSTRUCCIONES EN C
while(expr==1){ //accin} Ejemplo: If(expr1){ //accin 1} [else if(expr2){ //accin 2}] .. [else { //accin n}] Var=2; If(var==1){ //accin1} else if(var==2){ //accin a ejecutar} else { //accin por defecto}

While(var<10){ var++; } do{//accin}while(expr==1); Ejemplo:

Switch(variable){
Do { var++; }while(var<3); for(var=inic;condicin;paso){//accin} Ejemplo: For(var=0;var<100;var++){ //accion } Case A: //accin Break; Case B: //accin Break; Case Default: //accin Break }

Introduccin a la Programacin en C con el Pic16

SD-9

CUERPO DEL PROGRAMA

Funcin main()
CREACION DE FUNCIONES

Podemos crear nuestras propias funciones. Normalmente se ponen al final del archivo (despus de main()) Deben estar declaradas antes de usarse
Normalmente se aade una lista de declaraciones de funciones antes del main()

Se pueden pasar parmetros de entrada y resultados

Introduccin a la Programacin en C con el Pic16

SD-10

ESTRUCTURA DEL PROGRAMA Se trata de programacin bsica en C, independientemente de la programacin del microcontrolador.
// AQU IRN LOS ARCHIVOS DE DEFINICIONES #include<htc.h> //Incluimos libreria del micro a usar #define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ __CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF); // DECLARACIN DE VARIABLES GLOBALES Int x,y; //DECLARACIN DE FUNCIONES void funcion(void); //AQU COMIENZA EL PROGRAMA PRINCIPAL void main(void){ DECLARACIN DE VARIABLES INTERNAS DEL PROGRAMA // AQU IR EL CDIGO DEL PROGRAMA PRINCIPAL } //AQU IR EL CDIGO DE LAS FUNCIONES DEFINIDAS AL PRINCIPIO Void funcion(void){ // AQU IR EL CDIGO DE LA FUNCION }

Introduccin a la Programacin en C con el Pic16

SD-11

EJERCICIO1 : BSQUEDA DEL VALOR MXIMO DE UNA LISTA


INICIO Inicializar ndice posiciones Inicializar MAXIMO con 0

Incrementar ndice de posiciones

Comparar el primer elemento de la lista con MAX

Elemento Mayor? LAZO SI Elemento a MAX

NO SIGUE

NO

Acab lista? SI FIN

Introduccin a la Programacin en C con el Pic16

SD-12

EJERCICIO 2: CONVERSION BINARIO-DECIMAL-ASCII


El microcontrolador trabaja internamente en binario, pero el resultado hay que sacarlo generalmente al exterior sobre un dispositivo (terminal CRT, impresora) que admite caracteres ASCII. CARCTER ASCII NUMRICO BINARIO HEXADECIMAL DECIMAL 0 0011 0000 30 48 1 0011 0001 31 49 2 0011 0010 32 50 3 0011 0011 33 51 4 0011 0100 34 52 5 0011 0101 35 53 6 0011 0110 36 54 7 0011 0111 37 55 8 0011 1000 38 56 9 0011 1001 39 57 El nmero binario a convertir est contenido en un byte. En decimal puede ser de 0 a 255. Se debe representar con tres caracteres ASCII.
NUMERO: 254 BINARIO: 1111 1110 HEXAD: 0xFE

CENTENA: 2 BINARIO: 0000 0010 HEXAD:0x02 ASCII: 32h = 30h + 02h

DECENA: 5 BINARIO: 0000 0101 HEXAD: 0x05 ASCII: 35h = 30h + 05h

UNIDAD: 4 BINARIO: %0000 0100 HEXAD: 0x04 ASCII: 34h = 30h + 04h

Introduccin a la Programacin en C con el Pic16

SD-13

INICIALIZANDO EL MICROCONTROLADOR

htc.h
Sirve para programar los registros de configuracin Debe estar en el directorio de trabajo
// Comandos Obligatorios para el funcionamiento del debugger #include<htc.h> //Incluimos libreria del micro a usar __CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF); #define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ // Explicacin de los comandos de configuracin utilizados /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ //WRT_OFF = Codigo no Potegido //WDTE_OFF = Watch Dog Timer Desactivado //PWRTE_OFF = Power Activado //FOSC_XT = Osiclador cristal //LVP_OFF = Low Voltage Porgramming Desactivado /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ void main(void){ // AQU IR EL CDIGO DEL PROGRAMA }

Introduccin a la Programacin en C con el Pic16

SD-14

CONFIGURACIN DEL PIC16


__CONFIG
Oscillator
// RC oscillator // HS oscillator // XT oscillator // LP oscillator FOSC_EXTRC FOSC_HS FOSC_XT FOSC_LP WDTE_ON WDTE_OFF PWRTE_OFF PWRTE_ON BOREN_ON BOREN_OFF LVP_ON LVP_OFF CPD_OFF CPD_ON DEBUG_OFF DEBUG_ON CP_OFF CP_ON

Watchdog Timer Enable bit


// WDT enabled // WDT disabled

Power-up Timer Enable bit


// PWRT disabled // PWRT enabled

Brown-out Reset Enable bit


// BOR enabled // BOR disabled

Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit


//RB3/PGM pin has PGM function; // RB3 is digital I/O, HV must be used // Data EEPROM code protection off // Data EEPROM code-protected

Data EEPROM Memory Code Protection bit In-Circuit Debugger Mode bit
// In-Circuit Debugger disabled // In-Circuit Debugger enabled // Code protection off // All program memory code-protected

Flash Program Memory Code Protection bit

Introduccin a la Programacin en C con el Pic16

SD-15

ACCESO A LOS REGISTROS

El fichero <procesador>.h (ej. <pic16F877A.h>) incluye las definiciones de todos los registros de control de perifricos. Cualquier registro de control se puede acceder de dos modos:
En formato byte al registro completo <nombre_registro> (ej. PORTA) Bit a bit: <nombre_registro>bits.<nombre_bit> o <nombre_bit> (ej. PORTAbits.RA0 o RA0)

Introduccin a la Programacin en C con el Pic16

SD-16

Introduccin a la Programacin en C con el Pic16

SD-17

FUNCIONAMIENTO DE LOS PUERTOS


DIAGRAMA DE BLOQUES INTERNO Y ESQUEMA ELCTRICO DE LOS PUERTOS

ES PARTICULAR DE CADA PUERTO INCLUSO EN EL MISMO PUERTO HAY PINES CON CARACTERSTICAS DISTINTAS

ES NECESARIO SABER INTERPRETAR EL ESQUEMA INTERNO PARTICULAR PARA SABER QU CONEXIONES SE PUEDEN HACER

Introduccin a la Programacin en C con el Pic16

SD-18

FUNCIONAMIENTO DE LOS PUERTOS


REGISTROS ASOCIADOS AL PUERTO A (PORTA)
Direccin Registro 05h 85h 9Fh PORTA TRISA Bit 7
-

Bit 6 -

Bit 5 RA5 -

Bit 4 RA4 -

Bit 3 RA3 PCFG3

Bit 2 RA2 PCFG2

Bit 1 RA1 PCFG1

Bit 0 RA0 PCFG0

Valores despus del reset por encendido (POR) o por cada de tensin (BOR) --0x 0000 --11 1111 0--- 0000

Registro de direcciones de datos del PORTA

ADCON1 ADFM

REGISTROS ASOCIADOS AL PUERTO B (PORTB)


Direccin 05h, 106h 86h, 186h 0Bh, 8Bh 10Bh, 18Bh Registro PORTB TRISB Bit 7 RB7 Bit 6 RB6 Bit 5 Bit 4 RB5 RB4 Bit 3 RB3 PSA RBIE Bit 2 RB2 PS2 TOIF Bit 1 RB1 PS1 INTF Bit 0 RB0 PS0 RBIB Valores despus del reset por encendido (POR) o por cada de tensin (BOR) xxxx xxxx 1111 1111 1111 1111 0000 000x

Registro de direcciones de datos del PORTB

81h, 181h OPTION_REG RBPU# INTEDG T0CS T0SE INTCON GIE PEIE TOIE INTE

Introduccin a la Programacin en C con el Pic16

SD-19

FUNCIONAMIENTO DE LOS PUERTOS


REGISTROS ASOCIADOS AL PUERTO C (PORTC)
Direccin 07h 87h Registro PORTC TRISC Bit 7 RC7 Bit 6 RC6 Bit 5 RC5 Bit 4 RC4 Bit 3 RC3 Bit 2 RC2 Bit 1 RC1 Bit 0 RC0 Valores despus del reset por encendido (POR) o por cada de tensin (BOR) xxxx xxxx 1111 1111

Registro de direcciones de datos del PORTC

REGISTROS ASOCIADOS AL PUERTO D (PORTD)


Direccin 08h 88h Registro PORTD TRISD Bit 7 RD7 Bit 6 RD6 Bit 5 RD5 Bit 4 RD4 Bit 3 RD3 Bit 2 RD2 Bit 1 RD1 Bit 0 RD0 Valores despus del reset por encendido (POR) o por cada de tensin (BOR) xxxx xxxx 1111 1111

Registro de direcciones de datos del PORTD

REGISTROS ASOCIADOS AL PUERTO E (PORTE)


Direccin Registro 09h 89h 9Fh PORTE TRISE ADCON1 Bit 7
-

Bit 6 Bit 5 -

Bit 4 -

Bit 3 PCFG3

Bit 2 RE2

Bit 1 RE1

Bit 0 RE0

Valores despus del reset por encendido (POR) o por cada de tensin (BOR)
---- -xxx 0000 -111 0--- 0000

IBF ADFM

OBF IBOV PSPMODE -

Registro de direcciones de datos del PORT PCFG2 PCFG1 PCFG0

Introduccin a la Programacin en C con el Pic16

SD-20

CONEXIONES ASOCIADAS A LA PLACA PICDEM2+ (INPUTS)


PULSADORES

Introduccin a la Programacin en C con el Pic16

SD-21

CONEXIONES ASOCIADAS A LA PLACA PICDEM2+ (OUTPUTS)


LEDS

ZUMBADOR

Introduccin a la Programacin en C con el Pic16

SD-22

EJERCICIO 3: Escribir un programa en C para encender los LEDS EJERCICIO 4: Escribir un programa para que encienda los Leds en funcin de un pulsador. Al pulsar RA4 se encender RB1 y se apagar RB0.

EJERCICIO 5: Controlar el zumbador conectado a RC2 con el pulsador RA4.

#include<htc.h> //Incluimos libreria del micro a usar __CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF); #define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ //Definicin de variables void main(void){ //Configuracin

*******PROGRAMA****** while(1) //Bucle infinito }

Introduccin a la Programacin en C con el Pic16

SD-23

GENERACION DE RETARDOS

Hay tres maneras de generar retardos con el Pic16:


Bucles (similar a ensamblador pero sin control) Funciones de la librera delays.h o htc.h (programadas en ensamblador) Temporizadores (Timers) => Captulo 6

Introduccin a la Programacin en C con el Pic16

SD-24

RETARDOS MEDIANTE BUCLES


TIEMPO DE EJECUCIN

Ciclo de instruccin = de la frecuencia del oscilador 1s para un reloj trabajando a 4MHz.


Ciclo de Instruccin Fases Q1 Q2 Q3 Q4 Q1

Oscilador Tosc

Introduccin a la Programacin en C con el Pic16

SD-25

EJERCICIO 5: Generar un retardo con un bucle for que active y desactive el zumbador conectado a RC2.

Cul es la frecuencia de la seal y el periodo de encendido de los LED?


#include<htc.h> //Incluimos libreria del micro a usar __CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF); #define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ void main(void){

/* PROGRAMA*/
}

EJERCICIO 6: Mostrar una secuencia que vaya encenciendo los LEDs conectados a RB0:RB3 de forma que hagan un contador binario.

Introduccin a la Programacin en C con el Pic16

SD-26

RETARDOS
MEDIANTE LA LIBRERA htc.h

Es necesario definir la frecuencia del oscilador: _XTAL__FREQ

NOP() Retardo de un ciclo de instruccin __delay_us(400) Retardo de x microsegundos __delay_ms(2) Retardo de x milisegundos _delay(1000) Retardo de x ciclos de instruccin

MEDIANTE LA LIBRERA delay.h

DelayUs(x) Retardo de x microsegundos DelayMs(x) Retardo de x milisegundos X es del tipo Unsigned Char < 255

Introduccin a la Programacin en C con el Pic16

SD-27

MEZCLANDO ENSAMBLADOR Y C
El cdigo en lenguaje ensamblador puede mezclarse con el cdigo en C utilizando diferentes tcnicas: 1.- Incluyendo el cdigo en ensamblador en lnea dentro del mdulo en C, que se puede hacer de dos formas diferentes: a) Utilizando las directivas #asm y #endasm al principio y al final del cdigo en ensamblador respectivamente. El bloque generado con estas directivas no obedece las reglas de flujo normales de los programas en C por lo que no se recomienda su utilizacin dentro de estructuras como if(), while() o for(). Sin embargo es la manera ms sencilla de aadir mltiples instrucciones en ensamblador. b) Utilizando la sentencia asm(); para incluir cada nica instruccin en cdigo ensamblador en cualquier punto del programa en C, la cual interactuar correctamente con las estructuras de control de flujo de programa en C. EJEMPLO:

2.- Escribiendo el cdigo en ensamblador en un mdulo separado del cdigo en C Esta es la opcin ms adecuada frente a la anterior ya que se genera un cdigo en ensamblador autocontenido en lugar de un ensamblado en lnea aunque requiere de un mayor control del compilador en C

Introduccin a la Programacin en C con el Pic16

SD-28

FUNCIONES EXTERNAS EN LENGUAJE ENSAMBLADOR


- Se pueden incluir funciones completas en lenguaje ensamblador como mdulos externos separados .as o .asm dentro de un proyecto. - Estas funciones son ensambladas y combinadas a la salida mediante el programa linkador. - Es recomendable seguir una serie de consejos a la hora de escribir rutinas en ensamblador que van a ser llamadas desde CElegir un SECTOR adecuado para ubicar el cdigo en ensamblador Elegir un nombre (etiqueta) para la subrutina que comience por un guin bajo _ Asegurarse de que la rutina es de tipo GLOBAL Elegir un prototipo adecuado para la declaracin de la funcin y argumentos en C Asegurarse de que los smbolos utilizados en la rutina son globalmente accesibles Asegurarse de que los parmetros pasados y los valores retornados se guardan en las posiciones adecuadas - Asegurarse de reservar el espacio necesario para las variables utilizadas en la rutina - Utilizar instrucciones de seleccin de banco de datos - Asegurarse de que el compilador est al tanto en el caso de que la rutina en ensamblador llame a otra rutina en C o rutinas en ensamblador.

EJEMPLO:

Introduccin a la Programacin en C con el Pic16

SD-29

EJERCICIO 7: Escribir un programa en C para monitorizar el estado del bit RB0. Si es Alto, generar pitidos de frecuencia 1kHz, duracin 0.2 segundos cada pitido y a intervalos de 1 segundo. EJERCICIO 8: Crear una funcin que vaya iluminando los LEDS conectados a RB0:RB3 de derecha a izquierda cada 200ms y de forma indefinida.

EJERCICIO 9: Escribir un programa para leer un bit del puerto RA4, esperar 0.5 segundos y enviarlo al puerto RB1 . XTAL=4MHz

#include<htc.h> //Incluimos libreria del micro a usar __CONFIG(WRT_OFF & WDTE_OFF & PWRTE_OFF & FOSC_XT & LVP_OFF); #define _XTAL_FREQ 4000000 //Oscilador Interno de 4MHZ #include <delay.h> void main(void){ // PROGRAMA // }

También podría gustarte