1. Hi-Tech Compiler for
PIC18 Introducción a la
programación en C
1.-Introduccion Esto asume que el usuario fabricara las librerías
de manejo de los periféricos del
El Hi-Tech para PIC es un compilador microcontrolador.
profesional estándar que fue por una compañía
muy bien establecida como un proveedor de
desarrollo de sistemas de herramientas. Hi tech
suministra compiladores en C para un gran
rango de microcontroladores en el Mercado:
PIC16,18,24,32 y dsPIC(Procesadores de señal
digital) como también los microcontroladores
de Motorola (freescale) 68000,ARM,derivados
del 8051, Textas Instruments, Dispositivos
MSP430, y otros productos.
Las características notables son las siguientes:
1.-ANSI C – Completa característica y portable.
2.-Fiable
3.-Multiple niveles de optimizaciones en C
4.-Un optimización por ensamblador Diagrama de secuencia de inicialización de compilación
5.-Relocaliza las variables locales para disminuir
el uso de la RAM. 1.1.- Estructura de un Programa
6.-Una buena librería en C.
Los procesadores PIC18 tienen algunas
La optimización lleva a la reducción del tamaño localidades que contienen la configuración de
del código final para remover códigos los bits llamados fuses estos bits pueden ser
redundantes y modifica la versión del establecidos usando el macro de configuración.
ensamblador para reducir el número de
instrucciones para la mínima. El macro tiene el formato:
La más obvia desventaja de este compilador es __CONFIG(n,X);
que solo las funciones de la librería estándar
para conversión de datos, manejo de la Donde n es el número de registro de
memoria, operaciones matemáticas y básicas configuración y X es el valor que es para
E/S están proporcionadas. establecer la configuración de palabra. El macro
2. Introduccion a la programacion en HI-TECH 2011
es definido en <htc.h> hay que asegurar incluir
esta librería cada vez que iniciemos un proyecto
con un micro.
Ejemplo
#include <htc.h>
__CONFIG(1, RC); Formato radix para Constantes
__CONFIG(2, BW8 & PWRTDIS & WDTPS1 & WDTEN);
__CONFIG(4, STVRDIS); 1.4 Tipos de Variables
Las variables pueden ser localizadas como uso
interno en cada función o si se desea ser una
Después podemos definir la velocidad de reloj:
variable visible en todas las funciones.
#define _XTAL_FREQ 4000000 Por ejemplo:
//Oscilador Interno de 4MHZ
int value;
Void función(void){
Value=100;
1.2 Tipo de Datos
}
El compilador Hi tech C PRO para la familia
PIC18 soporta tipo de datos básicos con 1, 2,3 y
4 byte. La función puede usar la variable value ya que
es una variable global, mientras:
Void función(void){
Int value;
Value=100;
}
1.3 Constantes La función puede usar la variable value ya que
es una variable interna y solo ella puede usarla,
El formato de constantes especifica su radix. Hi mientras si existiera otra función no puede
tech C PRO para la familia PIC18 soporta el tomar el valor de la variable porque no existiría
Radiz estándar ANSI especifica cual establece en ella.
constantes binarios en código C.
En la tabla siguiente se observa como son
definidas las constantes.
2 Introducción a la programación en C en Hi tech Compiler for PIC18
3. Introduccion a la programacion en HI-TECH 2011
1.5 Operadores
Las asignaciones son de gran ayuda para reducir memoria de programa del microcontrolador ya que
simplifica la manera de ser una operación. Por ejemplo:
var=var+3000; var+=3000;
07DB 0870 MOVF 0x70, W 07DD 30B8 MOVLW 0xb8
07DC 3EB8 ADDLW 0xb8 07DE 07F0 ADDWF 0x70, F
07DD 00F0 MOVWF 0x70 07DF 1803 BTFSC 0x3, 0
07DE 0871 MOVF 0x71, W 07E0 0AF1 INCF 0x71, F
07DF 1803 BTFSC 0x3, 0 07E1 300B MOVLW 0xb
07E0 3E01 ADDLW 0x1 07E2 07F1 ADDWF 0x71, F
07E1 3E0B ADDLW 0xb
07E2 00F1 MOVWF 0x71
3 Introducción a la programación en C en Hi tech Compiler for PIC18
4. Introduccion a la programacion en HI-TECH 2011
Las operaciones aritméticas son las que están en la tabla siguiente:
+ Suma
- Resta
* Multiplicación
/ División
% Modulo, Resto de una división entera
-- Decremento
++ Incremento
sizeof Determina el tamaño en bytes de un
operando
Ejemplo:
Var=var2+var3; //suma
Unsigned char var[8];
Var2=sizeof(var); //var2=8 ya que es el tamaño del arreglo
Las relaciones sirven para hacer la comparación de una variable con otro donde al cumplir cierta
relación conlleve a una acción.
< Menor que
> Mayor que
>= Mayor o igual que
<= Menor o igual que
== Igual
¡= Distinto
?: Expresión
Condicional
Por ejemplo:
Var=100;
Var2=2200;
Var!=var2?var++:var2--; //Entra a var++ si es cierta la condición sino
entra a var2—
4 Introducción a la programación en C en Hi tech Compiler for PIC18
5. Introduccion a la programacion en HI-TECH 2011
Las operaciones lógicas son usadas para realizar operaciones de comparación entre varios elementos:
! NOT
&& AND
|| OR
Ejemplo:
If(var==100 && var2==2000);
Las operaciones de bits sirven para separar ciertos bits donde se desean solo tener como comparación.
~ Complemento en 1
& AND
^ OR exclusiva
| OR
>> Desplaza a Derecha
<< Desplaza a Izquierda
Ejemplo:
Var=~0xFF; Var=0x00;
Var=0xFF&0Xf0; Var=0Xf0;
1.6 Funciones
Las funciones son bloques de sentencias, todas las sentencias se deben de enmarcar dentro de las
funciones. Al igual que las variables, las funciones deben definirse antes de utilizarse.
Una función puede ser invocada desde una sentencia de otra función. Una función puede devolver un
valor a la sentencia que la ha llamado. El tipo de dato se indica en la definición de la función; en el caso
de no indicarse nada se entiende que es unsigned char y en el caso de no devolver un valor se debe de
especificar el valor VOID. La función, además de devolver un valor, puede recibir parámetros o
argumentos.
La estructura de una función :
Tipo_dato nombre_funcion(tipo parámetro,parametro2…){
(sentencia);
}
5 Introducción a la programación en C en Hi tech Compiler for PIC18
6. Introduccion a la programacion en HI-TECH 2011
Ejemplo:
void main(void){
Var=suma(10,20);
}
int suma(int x,int y){
int z;
z=x+y;
return z;
}
2.- Declaraciones de Control
Las declaraciones son usadas para controlar el proceso de ejecución del programa.
Hi tech admite las siguientes:
• If-else
• While
• do-while
• for
• switch-case
• return
• break,continue y goto
2.1 if-else
if (expr){
sent_1;
}[else
sent_2;]
Primero entra a la comparación de la expr si es cierta entra a ejecutar la sentencia sent_1 sino entra a la
sentencia sent_2.
Nota
Los elementos que estén encerrados en corchetes [] son opcionales
6 Introducción a la programación en C en Hi tech Compiler for PIC18
7. Introduccion a la programacion en HI-TECH 2011
if (expr){
sent_1;
}[else if(expr2){
sent_2;
} else
sent_3;
]
Si al evaluar la expresión expr resulta falsa entonces entrara a la comparación expr2 pero si ninguno de
los dos son ciertas entonce entrara a ejecutar a sent_3.
If(A==10) B=0;
Else b=1;
If(A==0){
If(B==3) A=0;
}else
B=0;
2.2.- switch-case
Una manera rápida de acceder a una decisión múltiple es usar la sentencia switch-case:
Var=1;
Switch(Var){
case 0://
7 Introducción a la programación en C en Hi tech Compiler for PIC18
8. Introduccion a la programacion en HI-TECH 2011
case 1: B=0; break;
default: //
}
Cuando entra a la sentencia switch realiza la búsqueda de valor deseado, en este caso cuando la variable
Var es igual a 1, entra en el case 1 ya que este caso contiene el valor correspondiente a la variable Var
pero si no existe ninguna igualdad en los case simplemente entrara a default.
Nota
No puede haber dos CASE con la misma constante
switch(A){
case 0: B=10; break;
case 1: B=20; break;
case 2: B=40; break;
default: break;
}
2.3.- for
En las expresiones del for la inicialización es una variable a la cual se le asigna un valor inicial con el
controlar el bucle. La condición de finalización sirve para evaluar ANTES de ejecutar las sentencias si es
cierta o no, en el caso de ser cierta se ejecutan las sentencias y en caso contrario se sale del for. Por
último, la expresión de incremento o decremento modifica la variable de control DESPUÉS de ejecutar el
bucle.
8 Introducción a la programación en C en Hi tech Compiler for PIC18
9. Introduccion a la programacion en HI-TECH 2011
for(n=0;n<10;n++){
Printf(n);
}
2.4 while/do-while
While se usa para repetir sentencias.
while(expresión){
Sentencias;
}
Primero evalua la expresión si es cierta sigue ejecutando la sentencia hasta que la expresión sea
totalmente falsa.
Do-While es diferente de while y for ya que tiene que entrar por lo menos una vez para ejecutar la
sentencia y después evalúa la expresión.
do{
Sentencias;
}while(expresión);
9 Introducción a la programación en C en Hi tech Compiler for PIC18
10. Introduccion a la programacion en HI-TECH 2011
while(n<5 || x>10){
b=100;
a=10;
}
do{
b++;
printf(b);
}while(b<100);
return: sirve para devolver datos.
break: Sirve para salir de bucles como son for,while,do-while
goto: Provoca un salto incondicional
10 Introducción a la programación en C en Hi tech Compiler for PIC18
11. Introduccion a la programacion en HI-TECH 2011
3. Comentarios
Los comentarios sirven para facilitar la comprensión del programa, y permite que otros usuarios puedan
entender el programa fácilmente.
• Utilizamos // para poner comentarios a una línea especifica
• Usamos /* y*/ para envolver a dentro de ellos un texto que puede ser por default la explicación
del programa en general.
Ejemplo:
PORTB=0x00; //Apagamos puerto b
*/ Inicializamos el puerto b para que no exista
El efecto rebote o picos cuando incie el micro*/
PORTB=0x00;
En HI TECH compiler for PIC18
Para iniciar en la programación de microcontroladores de PIC18 se debe de tener el software que nos
proporciona gratis la compañía Microchip en su web, www.microchip.com, el programa es MPLAB IDE, al
descargarlo e instalarlo, debemos ahora de descargar el software HI TECH for PIC18 en su página
www.htsoft.com y lo instalamos.
Al tener todo bien instalado, procedemos abrir el software MPLAB IDE.
11 Introducción a la programación en C en Hi tech Compiler for PIC18
12. Introduccion a la programacion en HI-TECH 2011
Software MPLAB
Como ya tenemos abierto el software vallamos a crear un proyecto en C, daremos click en <proyect
Wizard> nos abrirá una venta donde nos saluda, daremos click en <next> aparecerá en seguida el paso
uno a realizar que es seleccionar el
microcontrolador a programar, en
este caso vallamos a elegir el
PIC18F2550, y damos click en
<next> el paso dos es elegir el
compilador a usar, buscaremos el
compilador HI TECH en <Active toolsuite>, y después <next> el paso tres es buscar lugar donde se debe
de guardar nuestro proyecto, entonces buscamos donde queramos archivar nuestro proyecto, y damos
click en <next>, después nos mencionara que si queremos adherir proyectos existentes al nuestro, y
finalizaremos.
Ahora como nuestro lugar del proyecto no contiene ningún archivo, solo
vallamos a agregar una hoja en blanco en <file><new>, después grabamos
la hoja en blanco en el lugar del proyecto y lo agregamos al espacio de
trabajo solo dar click derecho en <Source File> y agregamos la hoja en
blanco que fue antes guardada, y listo hemos hecho una hoja de trabajo,
estamos listo para empezar a programar.
Lo primero que vamos a realizar es el parpadeo de un led, como se va
utilizar un oscilador interno se debe de configurar correctamente los fuses
del micro, para que este pueda ser calibrado con el Oscilador Interno.
El PIC18F2550 contiene un modulo de USB que utiliza algunos bits de
configuración para usarlo, en este caso se deben de configurar de una
forma donde no se utilice estos bits o desactivarlos.
12 Introducción a la programación en C en Hi tech Compiler for PIC18
13. Introduccion a la programacion en HI-TECH 2011
/////////////////////////////////////////////////////////////
//Configuracion para trabajar Con oscilador interno de 8Mhz
__CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLLPOSTDIV2 & CPUDIV1 & USBOSC);
/////////////////////////////////////////////////////////////
__CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & WDTPS32K);
__CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN);
__CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);
Para la utilización de los fueses y de los registros del Micro, se debe de agregar la librería estándar para
uso de todos los módulos PIC18.
#include<htc.c>
Después definiremos la frecuencia de trabajo para la utilización de __delay_ms para ellos se usa la línea:
//////////////////////////////
//Frecuencia FOSC 8Mhz
//////////////////////////////
#define _XTAL_FREQ 8000000
Ahora ya podemos agregar la función principal, void main (void) como vimos en la configuración de bits
(fuses) en __CONFIG(1,INTIO…) se utilizado un oscilador interno, para el uso de una frecuencia de 8Mhz
se debe de inicializar el registro OSCCON.
13 Introducción a la programación en C en Hi tech Compiler for PIC18
14. Introduccion a la programacion en HI-TECH 2011
Solo basta de cargar el valor de los 3 bits IRCF2:IRCF0.
OSCCON=0x70; //Oscilador a 8Mhz
NOP();NOP();NOP();NOP();
Se utiliza los parámetros NOP() para que pueda establecerse la frecuencia, para hacer el parpadeo de un
led, se debe de configurar correctamente los registros TRIS, como vamos a hacer el parpadeo de un led
en un solo pin del puerto B, los bits que representa al registro de puerto o cualquier registro solo, es
poner el nombre del bit en este caso RB0.
NOTA
Siempre tenga a la mano la hoja de datos del microcontrolador que se vaya a trabajar para estar
siempre informado de los registros y de los bits de cada uno de ellos.
Para un ciclo perpetuo se usa la sentencia while.
////////////////////////////////////////////////
//Configuración del Puerto B ////
////////////////////////////////////////////////
TRISB=0x00;
PORTB=0x00;
/*************************************************/
while(1){
RB0=0;
DELAY1S();
RB0=1;
DELAY1S();
}
Como se ve se usa una función de temporización de 1 segundo como el compilador no ofrece librerías
de retardos tan altos, nosotros debemos de fabricar los, para ellos haremos la función DELAY1S().
Solo basta usar una variable y una sentencia for para repetir tiempos.
//////////////////////////////
//FUNCION DE 1 SEGUNDO
//////////////////////////////
void DELAY1S(void){
unsigned char time;
for(time=0;time<100;time++){
__delay_ms(10);
}
}
14 Introducción a la programación en C en Hi tech Compiler for PIC18
15. Introduccion a la programacion en HI-TECH 2011
El programa completo se muestra a continuación:
////////////////////////////////////////////////////////
// BLINK EN PIN PB0
//Autor: george.manson.69
//Lugar: Mexico
//Compilador: HI TECH PIC18 (LITE MODE)
////////////////////////////////////////////////////////
#include<htc.h>
/////////////////////////////////////////////////////////////
//Configuracion para trabajar Con oscilador interno de 8Mhz
__CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLLPOSTDIV2 & CPUDIV1 & USBOSC);
/////////////////////////////////////////////////////////////
__CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BORV45 & WDTPS32K);
__CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN);
__CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS);
__CONFIG(5,UNPROTECT);
__CONFIG(6,UNPROTECT);
__CONFIG(7,UNPROTECT);
//////////////////////////////
//Frecuencia FOSC 8Mhz
//////////////////////////////
#define _XTAL_FREQ 8000000
float value;
//////////////////////////////
//FUNCION DE 1 SEGUNDO
//////////////////////////////
void DELAY1S(void){
unsigned char time;
for(time=0;time<100;time++){
__delay_ms(10);
}
}
/////////////////////////////////////////////////
//Funcion de interrupcion
//Si no se usa simplemente no hacemos nada...
//Esto sirve para direccionar lo los datos
//en un lugar muy cercano al Inicio de la memoria
//de datos
////////////////////////////////////////////////
static void interrupt
isr(void){}
//////////////////////////////
//FUNCION PRINCIPAL
//////////////////////////////
void main(void){
/////////////////////////////////////////////////
//Registro para Configurar el Oscilador Interno//
/////////////////////////////////////////////////
OSCCON=0x70;
NOP();NOP();NOP();NOP();//4Ciclos para estabilizar Frecuencia
15 Introducción a la programación en C en Hi tech Compiler for PIC18
16. Introduccion a la programacion en HI-TECH 2011
/////////////////////////////////////////////////
/*************************************************/
////////////////////////////////////////////////
//Configuracion del Puerto B ////
////////////////////////////////////////////////
TRISB=0x00;
PORTB=0x00;
/*************************************************/
while(1){
RB0=0;
DELAY1S();
RB0=1;
DELAY1S();
}
}
16 Introducción a la programación en C en Hi tech Compiler for PIC18