1.-Introduccion
El Hi-Tech para PIC es un compilador
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 5.-Relocaliza las variables locales para disminuir el uso de la RAM. 6.-Una buena librería en C. La optimización lleva a la reducción del tamaño del código final para remover códigos redundantes y modifica la versión del ensamblador para reducir el número de instrucciones para la mínima. La más obvia desventaja de este compilador es que solo las funciones de la librería estándar para conversión de datos, manejo de la memoria, operaciones matemáticas y básicas E/S están proporcionadas.
Esto asume que el usuario fabricara las librerías de manejo de los periféricos del microcontrolador.
Diagrama de secuencia de inicialización de compilación
1.1.- Estructura de un Programa
Los procesadores PIC18 tienen algunas
localidades que contienen la configuración de
los bits llamados fuses estos bits pueden ser
establecidos usando el macro de configuración.
El macro tiene el formato:
__CONFIG(n,X);
Donde n es el número de registro de
configuración y X es el valor que es para
establecer la configuración de palabra. El macro
Hi-Tech Compiler for
Introducción a la
programación en C
PIC18
Introduccion a la programacion en HI-TECH 2011
2 Introducción a la programación en C en Hi tech Compiler for PIC18
es definido en <htc.h> hay que asegurar incluir
esta librería cada vez que iniciemos un proyecto
con un micro.
Ejemplo
Después podemos definir la velocidad de reloj:
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.
1.3 Constantes
El formato de constantes especifica su radix. Hi
tech C PRO para la familia PIC18 soporta el
Radiz estándar ANSI especifica cual establece
constantes binarios en código C.
En la tabla siguiente se observa como son
definidas las constantes.
Formato radix para Constantes
1.4 Tipos de Variables
Las variables pueden ser localizadas como uso
interno en cada función o si se desea ser una
variable visible en todas las funciones.
Por ejemplo:
La función puede usar la variable value ya que
es una variable global, mientras:
La función puede usar la variable value ya que
es una variable interna y solo ella puede usarla,
mientras si existiera otra función no puede
tomar el valor de la variable porque no existiría
en ella.
#include <htc.h> __CONFIG(1, RC); __CONFIG(2, BW8 & PWRTDIS & WDTPS1 & WDTEN); __CONFIG(4, STVRDIS);
#define _XTAL_FREQ 4000000
//Oscilador Interno de 4MHZ
int value;
Void función(void){
Value=100;
}
Void función(void){
Int value;
Value=100;
}
Introduccion a la programacion en HI-TECH 2011
3 Introducción a la programación en C en Hi tech Compiler for PIC18
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;
07DB 0870 MOVF 0x70, W
07DC 3EB8 ADDLW 0xb8
07DD 00F0 MOVWF 0x70
07DE 0871 MOVF 0x71, W
07DF 1803 BTFSC 0x3, 0
07E0 3E01 ADDLW 0x1
07E1 3E0B ADDLW 0xb
07E2 00F1 MOVWF 0x71
var+=3000;
07DD 30B8 MOVLW 0xb8
07DE 07F0 ADDWF 0x70, F
07DF 1803 BTFSC 0x3, 0
07E0 0AF1 INCF 0x71, F
07E1 300B MOVLW 0xb
07E2 07F1 ADDWF 0x71, F
Introduccion a la programacion en HI-TECH 2011
4 Introducción a la programación en C en Hi tech Compiler for PIC18
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 ciert a la condición sino entra a var2—
Introduccion a la programacion en HI-TECH 2011
5 Introducción a la programación en C en Hi tech Compiler for PIC18
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);
}
Introduccion a la programacion en HI-TECH 2011
6 Introducción a la programación en C en Hi tech Compiler for PIC18
Ejemplo:
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
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
void main(void){ Var=suma(10,20);
} int suma(int x,int y){ int z; z=x+y; return z; }
if (expr){
sent_1;
}[else
sent_2;]
Introduccion a la programacion en HI-TECH 2011
7 Introducción a la programación en C en Hi tech Compiler for PIC18
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.
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://
if (expr){
sent_1;
}[else if(expr2){
sent_2;
} else
sent_3;
]
If(A==10) B=0;
Else b=1;
If(A==0){
If(B==3) A=0;
}else
B=0;
Introduccion a la programacion en HI-TECH 2011
8 Introducción a la programación en C en Hi tech Compiler for PIC18
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
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.
switch(A){
case 0: B=10; break;
case 1: B=20; break;
case 2: B=40; break;
default: break;
}
Introduccion a la programacion en HI-TECH 2011
9 Introducción a la programación en C en Hi tech Compiler for PIC18
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);
for(n=0;n<10;n++){
Printf(n);
}
Introduccion a la programacion en HI-TECH 2011
10 Introducción a la programación en C en Hi tech Compiler for PIC18
return: sirve para devolver datos.
break: Sirve para salir de bucles como son for,while,do-while
goto: Provoca un salto incondicional
while(n<5 || x>10){
b=100;
a=10;
}
do{
b++;
printf(b);
}while(b<100);
Introduccion a la programacion en HI-TECH 2011
11 Introducción a la programación en C en Hi tech Compiler for PIC18
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;
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.
En HI TECH compiler for PIC18
Introduccion a la programacion en HI-TECH 2011
12 Introducción a la programación en C en Hi tech Compiler for PIC18
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.
Introduccion a la programacion en HI-TECH 2011
13 Introducción a la programación en C en Hi tech Compiler for PIC18
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.
/////////////////////////////////////////////////// ////////// //Configuracion para trabajar Con oscilador interno de 8Mhz __CONFIG(1,INTIO & FCMDIS & IESODIS & PLLDIV5 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & WDTPS32K); __CONFIG(3,PBDIGITAL & LPT1DIS & MCLREN); __CONFIG(4,STVRDIS & LVPDIS & ICPORTDIS & DEBUGDIS) ; __CONFIG(5,UNPROTECT); __CONFIG(6,UNPROTECT); __CONFIG(7,UNPROTECT);
Introduccion a la programacion en HI-TECH 2011
14 Introducción a la programación en C en Hi tech Compiler for PIC18
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); } }
Introduccion a la programacion en HI-TECH 2011
15 Introducción a la programación en C en Hi tech Compiler for PIC18
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 & PLL POSTDIV2 & CPUDIV1 & USBOSC); /////////////////////////////////////////////////// ////////// __CONFIG(2,VREGDIS & PWRTEN & BORDIS & WDTDIS & BOR V45 & 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
Introduccion a la programacion en HI-TECH 2011
16 Introducción a la programación en C en Hi tech Compiler for PIC18
///////////////////////////////////////////////// /*************************************************/ //////////////////////////////////////////////// //Configuracion del Puerto B //// //////////////////////////////////////////////// TRISB=0x00; PORTB=0x00; /*************************************************/ while(1){ RB0=0; DELAY1S(); RB0=1; DELAY1S(); } }
Top Related