Documentos de Académico
Documentos de Profesional
Documentos de Cultura
microcontroladores PIC
Introduccin al MPLAB C-18
Andrs Prieto-Moreno Torres
andres@ifara.com
Tamao
Mnimo
Mximo
Char
8 bits
-128
127
Signed char
8 bits
-128
127
Unsigned char
8 bits
255
Int
16 bits
-32768
32767
Unsigned int
16 bits
65535
32767
Short
16 bits
-32768
Unsigned short
16 bits
65535
Short long
24 bits
-8.388.608
8.388.607
24 bits
16.777.215
Long
32 bits
-2.147.483.648
2.147.483.647
Unsigned long
32 bits
4.294.967.295
junio-2003
junio-2003
Tipo
Tamao
Exponente
Mnimo
Exponente
Mximo
Float
32 bits
-126
128
Double
32 bits
-126
128
0x1000
0xDD
0x1001
0xCC
0x1001
0xBB
0x1003
0xAA
junio-2003
Las variables declaradas fuera de las funciones son globales y las declaradas
en las funciones son locales. El mbito local tiene prioridad sobre el global.
2. Extern:
Dentro de un mismo fichero fuente sirve para acceder a una variable aunque
todava no se haya llegado a su declaracin.
Se auto-inicializan a cero.
junio-2003
Indica que la variable declarada se debe guardar en uno de los registros del
procesador.
4. Static:
junio-2003
Las declara estticas pero se inicializan cada vez que se llama a la funcin.
Se permite que una misma posicin de memoria pueda ser utilizada por
diferentes variables. Podemos ahorrar espacio de memoria.
junio-2003
4. Near:
junio-2003
6. ROM:
Ejemplos:
: char data;
10
1.
2.
3.
4.
// programa principal
5.
void main(void) {
6.
// declarada externa
7.
8.
9.
// programa principal
10.
for (;;) {
11.
var_auto++
12.
13.
var_global++ ;
14.
15.
if (var_estatica==0x60) {
16.
break; }
17.
18.
19.
junio-2003
11
Selectivas:
If
If-else
Switch
Bifurcacin de control:
Break, continue, goto
Return
Exit: No vlido en MPLAB-C18
junio-2003
12
Sentencia DO:
do {
while ( expresin ) {
Instruccin 1
Instruccin 2
...
Instruccin n
}
Instruccin 1
Instruccin 2
...
Instruccin n
} while ( expresin );
junio-2003
13
suma = 0;
for ( i=0; i<=100; i++) {
suma=suma + i ;
}
junio-2003
14
Sentencia if-else:
If ( expresin ) {
Instruccin 1
Instruccin 2
...
Instruccin n
}
If ( expresin ) {
Instrucciones A
} else {
Instrucciones B
}
La expresin se evala y si es
verdadera (distinta de cero) se
ejecutan las instrucciones.
junio-2003
La expresin se evala, si es
verdadera se ejecutan las
instrucciones A, en caso contrario
las Instrucciones B.
15
switch ( var ) {
case 1: valor=0x55;
break;
case 2: valor=0x34;
break;
default: valor = 0x0;
break;
}
junio-2003
16
if ( a==0) {
break;
}
a=PORTA;
}
junio-2003
17
if ( a!=0) {
continue;
}
break;
}
junio-2003
18
junio-2003
19
Punteros a memoria I
0x501
car = 0xAA;
pcar = &car; // & me da la direccin de car
0x550
0x01
0x551
0x50
...
0xAA
...
junio-2003
20
10
Punteros a memoria II
0x501
Optimizando:
0x550
0x01
0x551
0x50
...
0xAA
...
CAR = 0xAA;
Nos hemos ahorrado las posiciones de memoria 0x550-0x551
Hay que tener cuidado, el compilador no chequea conflictos.
junio-2003
21
junio-2003
22
11
Operaciones matemticas:
La norma ANSI establece que las operaciones matemticas tienen que hacerse con
precisin entera (INT) o superior. En este caso sera de 16 bits. El C18 permite
operaciones entre CHAR con resultado un CHAR. Es decir 8 bits.
Cadenas constantes:
Podemos almacenarlas en la memoria de programa.
Instrucciones especiales para moverlas entre la RAM y la ROM:
char *strcpy (auto char *s1, auto const char *s2)
char *strcpypgm2ram (auto char *s1, auto rom const char *s2)
rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2)
rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2)
junio-2003
23
junio-2003
24
12
Ejemplo de uso:
// byte
byte.valor=0xFF;
// bits
byte.bit0=0;
byte.bit7=byte.bit0;
// grupos de bits
byte.nibblel=0x5;
byte.nibbleh=0xa;
25
Curso Programacin en C
microcontroladores PIC
Placa entrenadora PICDEM 2
13
Power on led
Zona prototipo
XT: 4 Mhz
Timer 1
Conexin ICD
junio-2003
27
Display LCD
Puerto Serie
Potencimetro
eeprom
Zumbador
junio-2003
Sensor temperatura
Reset
Pulsadores
28
14
Alimentacin a +9v
El LED ver de Power On se debe de activar.
Grabacin en circuito
Usamos l conector telefnico para unir la PICDEM al ICD2.
Se utilizan los pines RB6 y RB7
junio-2003
29
Utilizamos el PIC18F452.
LEDS: Conectados al Puerto B <3:0>
Perifrico de salida.
El valor se lee o escribe accediendo al PORTB ( 0xF81 )
TRISB ( 0xF93 ): Controla direccin de los bits del Puerto B.
0 salida
1 entrada
junio-2003
30
15
Perifrico de entrada.
Conectado entre GND y VDD (+5v)
Precisin de 10bits.
ADRESH (0xFC4): Guarda el byte alto del resultado
ADRESL (0xFC3): Guarda el byte bajo del resultado
ADCON0 (0xFC2): Registro de control del mdulo A/D.
Bit 7-6 = 10 -> Frecuencia conversor Fosc/32
Bit 5-3 = 000 -> Seleccionamos canal 0 (RA0)
Bit 2 -> Status bit ( 0 conversin terminada / 1 empezar conversin en curso )
Bit 1 -> No implementado (cero)
Bit 0 -> Activacin del conversor ( 0 AD OFF / 1 AD ON)
ADCON1 (0xFC1): Registro que controla las funciones de los pines del puerto.
Bit 7 -> Justificacin ( 1 = Right / 0 = Left)
Bit 6 = 0 ->Frecuencia conversor Fosc/32
Bit 5-4 -> No implementados
Bit 3-0 = 1110 -> RA0 analgico y resto del puerto digital
ADIF / ADIE: Flag y mscara de la interrupcin del conversor
junio-2003
31
junio-2003
32
16
RC6 es TX y RC7 es RX
Configurar TRISC (0xF94) para RC6 salida (0) y RC7 entrada (1)
Bit 3: No implementado
junio-2003
33
Modo asncrono
9600 baudios
Fosc = 4 Mhz
BRGH = 0 -> Baud Rate = Fosc / ( 64 * ( SPBRG +1) )
BRGH = 1 -> Baud Rate = Fosc / ( 16 * ( SPBRG +1) )
Asncrono
junio-2003
34
17
Curso Programacin en C
de microcontroladores PIC
Entorno de desarrollo:
MPLAB IDE
MPLAB ICD2
MPLAB C18
Editor de textos
Barra Herramientas
MPLAB IDE
Escribir
Permite
Compilar
Depurar
Simular
junio-2003
36
18
Simulador
MPSIM
MPLIB
Depuracin
Programadores
MPLAB ICE
PIC START +
MPLAB ICD
PRO MATE II
MPLINK
C
junio-2003
37
38
19
4.
junio-2003
39
4.
5.
General
-> ponemos los PATH de .h y .lib
MPLAB-C18 -> flags de compilacin.
Botn derecho en linker script en el panel del proyecto.
Aadimos el fichero \mcc18\lnk\dispositivo.
Para usar el ICD2 poner fichero terminado en i.
junio-2003
40
20
Curso Programacin en C
de microcontroladores PIC
Laboratorio I
Prctica I: Punteros
Enunciado:
Hacer un programa que encienda el LED RB0
a)
b)
c)
Notas:
No utilizar llamadas a libreras
junio-2003
42
21
junio-2003
43
junio-2003
16 = 2 ^ 4 bits.
44
22
45
1.
2.
junio-2003
46
23
junio-2003
47
Prctica V: Puertos
Enunciado:
junio-2003
48
24
Utilizar:
1.
2.
programacin directa
Programacin con libreras (ADC)
junio-2003
49
50
25
Utilizar:
1.
2.
3.
programacin directa
Probar que ocurre si nos equivocamos en los baudios
Programacin con libreras (USART)
junio-2003
51
1.
2.
junio-2003
52
26
Curso Programacin en C
microcontroladores PIC
Programacin avanzada
#pragma sectiontype
Las secciones pueden contener tanto datos como cdigo y se pueden encontrar
en memoria de datos y de programa.
Podrn ser:
absolute: Indicamos el lugar en memoria de la seccin
assigned: El lugar de memoria se indica en el linker script
junio-2003
54
27
Overlay: Permitimos que varias secciones se puedan grabar en una misma zona de
memoria. Las secciones involucradas deben tener el mismo nombre y pertenecer a
ficheros fuente distintos. Si son de tipo access o absolutas lo sern por igual todas.
Access: La seccin se sita en una zona de memoria directamente accesible por las
instrucciones. Las variables llevarn asociado el atributo NEAR. La regin de acceso
se define por ACCESSBANK en el linker-script.
linker script
junio-2003
55
La opcin Oa- desactiva la opcin de que las variables se siten en la zona de acceso. Es
decir estarn a partir de la posicin 0x080, y para acceder a ellas se utilizar el bank
switching. Opcin NEAR OFF
2.
La opcin Oa+ insta al compilador para situar las variables en el banco de acceso. Es decir
estarn en la zona RAM comprendida hasta 0x080. Para acceder a ellas su utiliza la opcin
a=0 de las instrucciones. Hay que tener en cuenta, que al declarar cualquier variable que
hayamos situado fuera del banco de acceso, hay que usar far. Opcin NEAR ON.
3.
Para generar el mapa de variables es necesario utilizar la opcin generate map file. En el
men de opciones de compilacin -> linker dentro de la seccin proyectos.
4.
Para ver el cdigo generado en ensamblador se puede utilizar la opcin Disassembly del
men ver.
junio-2003
56
28
Nosotros debemos especificar en los ficheros fuente que variables estn afectadas.
Fichero 1
Fichero 2
#pragma varlocate 1 c1
#pragma varlocate 1 c2
extern signed char c2;
Vvoid main(void) {
c1 += 5;
c2 += 5; // NO
MOVLB
}
junio-2003
57
Interrupciones
1.
2.
3.
Utilizan una zona temporal para guardar las variables y datos. En concreto una
zona tipo access, udata y nombre fname_tmp.
4.
5.
Las variables globales accesibles por estas funciones se deben declarar con el
modificador volatile.
6.
7.
junio-2003
58
29
junio-2003
59
Nosotros tenemos que indicarle al compilador como hacer que el vector de interrupcin
apunte a la rutina de servicio.
0x0000
...
Vector Int. High
0x0008
...
Vector Low. High
On chip memory
0
junio-2003
User memory
0x0018
0x0019 0x7FFF
0x8000 0x1FFFFF
60
30
#include <p18f452.h>
2.
void low_isr(void);
3.
4.
5.
6.
void low_interrupt(void) {
7.
8.
_endasm
9.
10. // Esta es la Rutina de Servicio de la Interrupcin
11. #pragma interruptlow low_isr
12. void low_isr (void) {
13.
// instrucciones
14. }
junio-2003
61
Si la ISR utiliza la librera matemtica o llama a una funcin que devuelve 24 o ms bits:
#pragma interrupt high_ISR save=section(MATH_DATA)
junio-2003
62
31
Si la ISR utiliza la librera matemtica o llama a una funcin que devuelve 24 o ms bits:
#pragma interrupt high_ISR save=section(MATH_DATA)
junio-2003
63
Mtodo:
1.
2.
3.
junio-2003
64
32
2.
_CONFIG_DECL ( _CP_ON_1L,
3.
4.
5.
6.
_CCP2MUX_OFF_3H,
7.
8.
_CONFIG4L_DEFAULT);
#pragma romdata
junio-2003
65
Ensamblador empotrado
MPLAB C-18 integra un ensamblador interno con una sintaxis como la del MPASM
Para introducir un bloque en ensamblador hay que empezar con _asm y terminar con
_endasm.
No admite directivas.
Las instrucciones de Acceso a tablas tienen que tener los mnemnicos enteros.
junio-2003
66
33
Ensamblador empotrado
Como llamar a funciones de C desde Ensamblador
1.
2.
3.
4.
Los parmetros se llevan a la pila. De derecha a izquierda y el byte menos significativo primero.
5.
EXTERN add ;
...
MOVLW 0x65
MOVWF POSTINC1
MOVLW 0x61
MOVWF POSTINC1
CALL
; add (0x61,0x65)
MOVWF resultado
add
; PROD
junio-2003
67
Ensamblador empotrado
Como llamar a funciones Ensamblador desde C
1.
2.
UDATA_ACS
delay_temp RES 1
3.
4.
CODE
asm_dalay
5.
...
RETURN
6.
7.
END
1.
2.
void main(void) {
3.
4.
asm_delay();
junio-2003
68
34
Ensamblador empotrado
Como llamar variables de C desde ensamblador
Se utilizan directamente.
Se utilizan directamente.
junio-2003
69
Se localizan en /mcc18/h/p18f452.h
2.
3.
Se localizan en /mcc18/src/proc/p18f452.asm
Linker Script
Se encuentra en mcc18/lkr/18f452.lkr
junio-2003
70
35
Se localizan en /mcc18/h/p18f452.h
2.
3.
Se localizan en /mcc18/src/proc/p18f452.asm
Linker Script
Se encuentra en mcc18/lkr/18f452.lkr
junio-2003
71
/mcc18/lib
2.
3.
4.
/mcc18/src/startup
El vector de reset apuntar a este cdigo que despus dar paso a nuestra aplicacin en un
bucle infinito. ( si queremos poner cdigo antes habr que ponerlo al principio de _entry() )
Las fuentes se encuentran en estos directorios: Math, delays, ctype, string, stdlib
Forman la clib.lib
Forman la p18f452.lib
junio-2003
72
36
Uso principal
Guardados automticamente
PC
Control de la ejecucin
WREG
Clculos intermedios
STATUS
Resultado de clculos
BSR
Seleccin de bancos
PROD
Seccin .tmpdata
Clculos intermedios
FSR0
Puntero a RAM
FSR1
Puntero a Pila
FSR2
Puntero a marco
TBLPTR
TABLAT
PCLATH
PCLATU
Seccin MATH_DATA
junio-2003
73
Curso Programacin en C
de microcontroladores PIC
Laboratorio II
37
Prctica: Servidor
Enunciado:
Hacer un programa servidor residente en el PIC que reciba
comandos por el puerto serie y acte sobre cada uno de los
perifricos de la PICDEM2.
Se seguirn los siguientes pasos:
1.
2.
junio-2003
75
Prctica: Servidor
Notas
Se puede introducir un carcter de trama para obligar a ir
al principio de la recepcin. Forma de sincronismo.
Se deberan de emplear las interrupciones para mantener el
zumbador sonando mientras se siguen procesando comandos.
Tambin se podran utilizar las interrupciones para recibir
por el puerto serie. De esa forma no tenemos que estar
pendientes de la recepcin de trama.
junio-2003
76
38
Documentacin
www.microchip.com
CDROM
junio-2003
77
39