Este documento trata sobre los lenguajes de programación para microcontroladores PIC. Explica las ventajas de usar lenguajes de alto nivel como C sobre lenguajes de bajo nivel como el ensamblador. También describe las directivas del preprocesador, los tipos de datos básicos y cómo definir nuevos tipos de datos en C.
4. Lenguajes de Programacion
• Como el proceso de escribir directamente código
ejecutable es extremadamente cansado, se creó entonces
el programa ensamblador.
• Sin embargo la programación en ensamblador sigue
complicada y muy dependiente de la arquitectura interna
del PIC, pero al menos la programación dejó de ser una
pesadilla.
• Las instrucciones en lenguaje ensamblador se representan
en forma abreviada mediante símbolos con sentido
funcional, el proceso de ensamblado se lo deja al
programa ensamblador que genera código ejecutable.
5. Lenguajes de Programacion
• Sin embargo los programadores siempre han necesitado
de un lenguaje de programación muy próximo o cercano
al lenguaje común que usamos para comunicarnos.
• Como resultado de esta necesidad se han creado los
lenguajes de nivel alto. La ventaja principal de estos
lenguajes es la “simplicidad” en la escritura de programas,
ya no es de mucho interés conocer con exactitud cómo
los comandos se ejecutan.
• En casos que requieran exactitud, es fácil insertar en el
programa una secuencia de instrucciones en
ensamblador, habilitándolo.
6. Lenguajes de Programacion
• Algo similar al lenguaje ensamblador, un
programa especializado llamado COMPILADOR
que corre en una PC, es el encargado de
compilar el programa fuente a lenguaje de
máquina.
• A diferencia del programa ensamblador, un
compilador genera código ejecutable que no
siempre es el más corto posible, en éste sentido
el ensamblador es más eficiente.
7. Lenguajes de Programacion
• En la siguiente gráfica se ilustra lo que ocurre durante el
proceso de compilacion de un programa desde lenguaje de
alto nivel a lenguaje de bajo nivel.
10. Ventajas de los lenguajes de alto nivel
• Los PICs basan su funcionamiento en una
arquitectura RISC, es decir carecen de muchas
instrucciones, tal como: multiplicacion, division,
comparacion, etc.
• Cada problema tiene una solución, por ejemplo,
la multiplicación fácilmente se sustituye por
sumas sucesivas.
• Esto no es motivo de preocupación, porque el
lenguaje C ha solucionado éste problema y
muchos otros.
11. DIRECTIVAS PREPROCESADOR
• Un preprocesador es parte integral del compilador C y su función es
reconocer y ejecutar instrucciones del preprocesador.
• Las instrucciones del preprocesador son especiales ya que no
pertenecen al lenguaje C, pero es parte del paquete (software) que
viene con el compilador C.
• Cada comando del preprocesador inicia con signo numeral (#).
Antes de la compilacion del programa, el compilador C activa el
preprocesador que recorre el programa buscando estos signos
numerales (#).
• Si encuentra alguno el preprocesador los reemplazara con otro
texto, que depende del tipo de comando, podria ser el contenido
de un archivo o una secuencia corta de caracteres. Luego de esto,
se inicia el proceso de compilación.
12. Directiva Preprocesadora: # include.
• El comando # include obtiene texto desde
otro documento, no importa qué es, para
formar parte del programa.
• Con la finalidad de acelerar el proceso de
escritura de un programa, los comandos,
comentarios y declaraciones que se repiten
varias veces se agrupan en ficheros especiales
que facilmente se incluyen usando esta
directiva.
14. Directiva Preprocesadora # define
• El comando # define provee expansion macro
reemplazando identificadores en el programa
por sus valores.
• #define symbol sequence_of_characters
Ejemplo:
...
#define PI 3.14
...
15. Fundamentos Básicos del Lenguaje de
Programación C
• La idea principal de escribir un programa en lenguaje C es
dividir un problema grande en módulos más pequeños.
• Por ejemplo nos piden escribir un programa para leer
temperatura y visualizar resultados en una pantalla LCD.
Este problema se lo podría dividir en cuatro partes que se
procesan con determinado orden:
1. Configurar módulo ADC del PIC.
2. Leer señal analógica.
3. Calcular temperatura.
4. Enviar datos con formato a pantalla LCD.
Como se puede ver este problema se resuelve escribiendo
cuatro funciones que se ejecutan repetidamente en lazo
infinito.Todo se basa en funciones !
17. Comentarios
• Los comentarios son parte del programa y muy necesarios para
clarificar su operación y proveer más información del mismo.
• El compilador reconoce ciertos caracteres especiales usados para
designar el inicio y fin de los comentarios, ignora completamente el
texto entre estos símbolos durante la compilación.
• Estos caracteres especiales son de dos tipos:
Uno define comentarios largos que se extiende varias líneas de
programa.
/*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/
El otro define comentarios cortos de una sola línea de programa.
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
18. Comentarios
• Un programa ya escrito y funcional siempre se:
Mejora.
Modifica.
Actualiza.
Simplifica.
• Programa sin comentarios, tratar de entenderlo,
casi siempre es una pérdida de tiempo.
19. Tipos de Datos en Lenguaje C
La tabla muestra el rango de valores, que estos datos tienen en su forma básica.
20. Tipo bit
• mikroC PRO para PICs provee datos tipo bit que
podrian usarse para declarar variables tipo bit.
• Ejemplo:
bit bf; //bf variable tipo bit
• No hay punteros a variables tipo bit.
bit *ptr; //no valido
• Un arreglo tipo bit no es valido.
bit array [7]; //no valido
• Variables tipo bit no pueden inicializarse.
21. Tipo sbit
• El compilador mikroC Pro tiene el tipo sbit que provee acceso
a registros SFRs, variables
• Se puede declarar una variable tipo sbit tal que apunte a un
bit específico en un registro SFR.
• En el programa principal se tiene que especificar a que
registro la variable tipo sbit apunta, por ejemplo:
sbit Abit at PORTB.B0; // aqui queda definida la variable Abit
...
void main() {
...}
De esta manera la variable Abit apunta a PORTB.0
22. Modificadores: signed y unsigned
• Los prefijos modificadores signed y unsigned
se pueden aplicar a tipo char y tipo int.
• En ausencia de prefijos modificadores, el tipo
char por defecto es unsigned (sin signo), es
decir entero de 8 bits sin signo.
• En ausencia de prefijos modificadores, el tipo
int por defecto es signed (con signo)
23. Modificadores: short y long
• Los modificadores short y long solamente es
aplicable con tipo int.
• Estos modificadores (short, long), usados por
sí sólos, significan short int y long int
respectivamente.
24. Tipos float, double y long double
Los tipos float, double y long double son considerados por MikroC como iguales.
25. Tipos Punto Flotante
• El tipo float y double, junto con la variante
long double son considerados tipo punto
flotante.
• mikroC PRO considera a los tres del mismo
tipo, es decir punto flotante.
• Estos tipos, en mikroC todos demandan 4
bytes en memoria.
26. Asignación de datos
• Decimal
– int i = 10; /* decimal 10 */
– int j = -10; /* decimal -10 */
– int p = 0; /* decimal 0 */
• Hexadecimal
– short x = 0x37; /* decimal 55 */
– short y = 0x7F; /* decimal 127 */
– int z = 0x125; /* decimal 293 */
27. Asignación de datos
• Octal
– int m = 023; /* 19 */
– short n = 016; /* 14 */
• Binario
– char p = 0b00001111;
– short q = 0b10101010;
– unsigned char z = 0b11001100;
• ASCII
– char dato = ‘a’;
– char m = ‘5’;
28. Definir nuevos tipos de datos
La palabra clave typedef le permite crear
nombres que se convierten en sinónimos del
tipo especificado.
typedef unsigned int positivo; // positivo es
un sinónimo para el tipo entero sin signo
positivo a,b; // Variables a y b son de tipo
positivo
a = 10; // Variable a equivale a 10
b = 5; // Variable b equivale a 5
29. Ejemplos
Declarar un sinónimo para"unsigned long int"
typedef unsigned long int Distancia;
Ahora, sinónimo "Distancia" puede usarse como
identificador del tipo unsigned long int.
Distancia i; declara variable i de unsigned long int
Varios tipos pueden declararse de una. Por ejemplo:
typedef int *Pti, Array[10];
Aqui, Pti es un sinonimo para tipo “apunta a int”, y
Array es un sinónimo para el tipo “array de 10
elementos enteros”.