Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Pic c18
Curso Pic c18
microcontroladores PIC
Introduccin al MPLAB C-18
Andrs Prieto-Moreno Torres andres@ifara.com
Caractersticas del MPLAB-C18 Compilador ANSI C para microcontroladores PIC18. Aprovecha las modificaciones arquitecturales de la familia de microcontroladores PIC18.
Diferente distribucin memoria de datos. Nuevas instrucciones de acceso a tablas en memoria de programa Nuevos modos de direccionamiento.
Tamao
8 bits 8 bits 8 bits 16 bits 16 bits 16 bits 16 bits 24 bits 24 bits 32 bits 32 bits
Mnimo
-128 -128 0 -32768 0 -32768 0 -8.388.608 0 -2.147.483.648 0
Mximo
127 127 255 32767 65535 32767 65535 8.388.607 16.777.215 2.147.483.647 4.294.967.295
junio-2003
Tamao
32 bits 32 bits
Exponente Mnimo
-126 -126
Exponente Mximo
128 128
junio-2003
junio-2003
2. Extern:
Indica que la variable declarada pertenece a otro mdulo, por lo que no es necesario reservar memoria para ella. 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
4. Static:
Variables locales a una funcin que retienen su valor en llamadas sucesivas a dicha funcin. Hay que poner static delante de la declaracin. Se inicializan a valor cero. Ahorra nmero de instrucciones para acceder a las variables.
junio-2003
junio-2003
4. Near:
Datos:La variable esta en el banco de Acceso. (acceso directo mediante a). Cdigo: El objeto esta en una zona menor de 64K.
Ifara Tecnologas S.L. 9
junio-2003
6. ROM:
La variable esta en la memoria de programa.
Ejemplos: Variable en memoria de datos Variable en cdigo cercano Variable en cdigo lejano : char data; : rom near char data; : rom far char data;
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
// Definimos un tipo nuevo typedef unsigned char BYTE; BYTE var_global = 0x0; // programa principal void main(void) { extern int var_externa; BYTE var_auto = 0x40; // declarada externa // variable local auto (PILA -> 0x500 ) // la primera zona de memoria GPR0 ( 0x80 )
static BYTE var_estatica = 0x50; // variable local esttica ( 0x80 ) // programa principal for (;;) { var_auto++ ; // 0x500 ( PILA -> 0x500 ) // 0x8x / con NEAR 0x0x break; } var_estatica++ ; // 0x8x / con NEAR Ox0x var_global++ ; var_externa++ ; // 0x8x / con NEAR 0x0x if (var_estatica==0x60) { } } // Ejemplo de declaracin de una variable extern unsigned int var_externa; // la primera zona de memoria GPR0 ( 0x80 )
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 { Instruccin 1 Instruccin 2 ... Instruccin n } while ( expresin ); Las instrucciones se ejecutan repetidamente hasta que el valor de la expresin sea falso, es decir cero. La expresin se evala al final
junio-2003
13
Las instrucciones se ejecutan repetidamente hasta que el valor de la exp2 sea falso, es decir cero. exp1 sirve para inicializar el contador del bucle. exp3 controla el contador del bucle. Se evala al final del mismo.
junio-2003
14
Sentencia if-else:
If ( expresin ) { Instrucciones A } else { Instrucciones B }
La expresin se evala, si es verdadera se ejecutan las instrucciones A, en caso contrario las Instrucciones B.
junio-2003
15
junio-2003
16
junio-2003
17
junio-2003
18
junio-2003
19
Punteros a memoria I
Un puntero es una variable que contiene la direccin a una zona de memoria donde reside un determinado tipo de dato. char car; // variable tipo char char *pcar; // puntero a una variable tipo char car = 0xAA; pcar = &car; // & me da la direccin de car Los punteros a memoria de datos ocupan 16 bits ! 0x501 ... 0x550 0x551 0xAA ... 0x01 0x50
junio-2003
20
Punteros a memoria II
Otra forma de acceso a los datos: char *pcar; // puntero a una variable tipo char pcar = (char *) 0x501; *pcar = 0xAA; Optimizando: 0x501 ... 0x550 0x551 0xAA ... 0x01 0x50
junio-2003
21
junio-2003
22
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
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
Power on led
Zona prototipo
XT: 4 Mhz
Timer 1
Conexin ICD
junio-2003
27
Display LCD
Puerto Serie Potencimetro
eeprom
Sensor temperatura
Zumbador
junio-2003
Reset
Pulsadores
28
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 Ifara Tecnologas S.L. 29
junio-2003
30
junio-2003
32
junio-2003
Asncrono
junio-2003
34
Curso Programacin en C
de microcontroladores PIC
Entorno de desarrollo:
MPLAB IDE MPLAB ICD2 MPLAB C18
MPLAB IDE
Escribir Permite Compilar Depurar Simular
junio-2003
36
junio-2003
37
4.
junio-2003
4.
5.
junio-2003
40
Curso Programacin en C
de microcontroladores PIC
Laboratorio I
Prctica I: Punteros
Enunciado: Hacer un programa que encienda el LED RB0 a) b) c) Utilizar declaracin de variables y punteros de C Simplificar las declaraciones al mximo Analizar dichas opciones con el simulador
junio-2003
42
junio-2003
43
junio-2003
44
1.
2.
Seleccionar como herramienta de debugger el MPLAB-SIM. Comparar las zonas de memoria de datos y de programa mediante las opciones del men view: Programm memory File Register
junio-2003
46
junio-2003
47
Prctica V: Puertos
Enunciado: Declarar una estructura tipo puerto que pueda ser accedida bit a bit, con nibble o directamente con un valor de byte. Usar la estructura anterior para encender el LED conectado a RB0.
junio-2003
48
Utilizar:
1. 2. programacin directa Programacin con libreras (ADC)
junio-2003
49
Utilizar:
1. 2. 3. programacin directa Probar que ocurre si nos equivocamos en los baudios Programacin con libreras (USART)
Ifara Tecnologas S.L. 51
junio-2003
1. 2.
Utilizar el TIMER 1 para medir el segundo. Aprovechar el cristal de 32K que lleva asociado dicho timer.
junio-2003
52
Curso Programacin en C
microcontroladores PIC
Programacin avanzada
Es un fichero que proporciona diversa informacin al linker: Define las posiciones en memoria de las secciones. Define el tamao y situacin de la pila (stack) software. Indica la situacin de las palabras de configuracin.
junio-2003
55
2.
3. 4.
junio-2003
56
junio-2003
57
junio-2003
58
#pragma interrupt nombre-funcin Indica al compilador que nombre-funcin es la rutina de servicio de atencin a la interrupcin con prioridad alta. Utiliza los registros SHADOW para guardar el contexto. Sale de la interrupcin con un retorno rpido. Se usan para secciones crticas en tiempo.
junio-2003
59
Vector Int. RESET ... Vector Int. High ... Vector Low. High On chip memory 0
User memory
junio-2003
60
// configuro el vector de interrupcin LOW #pragma code low_vector=0x18 void low_interrupt(void) { _asm GOTO low_isr } _endasm
// instrucciones
Mtodo: 1. 2. 3. Utilizar el TIMER 1 para producir una interrupcin cada segundo. Hacer que la rutina de interrupcin cambie el estado del LED. El programa principal se tendr que encargar del pulsador.
junio-2003
64
junio-2003
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. Las diferencias con el MPASM: No admite directivas. Los comentarios son estilo C. El Radix por defecto es decimal. Las etiquetas incluyen dos puntos. Los datos se especifican con notacin de C. ( 0x12F ). Las instrucciones de Acceso a tablas tienen que tener los mnemnicos enteros. Todos los operandos de las instrucciones se deben especificar.
junio-2003
66
Ensamblador empotrado
Como llamar a funciones de C desde Ensamblador
1. 2. 3. 4. 5. Las funciones de C se comportan como globales salvo que se declaren static. La funcin de C se declara EXTERN en el cdigo en ensamblador. Para llamar a la funcin se utiliza CALL o RCALL. Los parmetros se llevan a la pila. De derecha a izquierda y el byte menos significativo primero. Los parmetros estticos son globales. Se accede con _nombrefuncion:pos
char add (auto char x, auto char y); // funcin de C ... MOVLW 0x65 MOVWF POSTINC1 MOVLW 0x61 MOVWF POSTINC1 CALL add MOVWF resultado ; x=0x61 lo dejamos en la pila ; add (0x61,0x65) ; el resultado te lo devuelven en WREG. Si el valor devuelto es de 16 bits, estar en ; PROD ; y=0x65 lo dejamos en la pila EXTERN add ;
junio-2003
67
Ensamblador empotrado
Como llamar a funciones Ensamblador desde C
1.
2. 3. 4. 5. 6. 7. 1. 2. 3. 4. } asm_dalay delay_temp RES 1 CODE ... RETURN GLOBAL asm_delay ; la exportamos para que la vea el linker END extern void asm_delay( void ); void main(void) { asm_delay();
Las funciones en ensamblador hay que declararlas globales. La funcin se declara EXTERN en el cdigo en C. Debe devolver los valores siguiendo la norma del C18. La funcin se llama como si se tratase de una en C.
UDATA_ACS
junio-2003
68
Ensamblador empotrado
Como llamar variables de C desde ensamblador
Las variables se declaran globales en C. Las variables se declaran extern en ensamblador Se utilizan directamente.
junio-2003
69
2.
3.
Linker Script
Contiene informacin sobre uso de la memoria: pila, config, y zonas de memoria. Se encuentra en mcc18/lkr/18f452.lkr Para ejecutar con MPLAB-ICD2 usar los archivos terminados terminados en i. Ifara Tecnologas S.L. 70
junio-2003
2.
3.
Linker Script
Contiene informacin sobre uso de la memoria: pila, config, y zonas de memoria. Se encuentra en mcc18/lkr/18f452.lkr Para ejecutar con MPLAB-ICD2 usar los archivos terminados terminados en i. Ifara Tecnologas S.L. 71
junio-2003
/mcc18/src/startup
Contiene el cdigo de inicio del C-18. 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() ) c018.o inicializa la pila y salta a main c018i.o inicializa la pila, las variables inicializadas y salta a main. (default) Cc018iz.o inicializa la pila, las variables inicializadas y no inicializadas y salta a main.
3.
4.
junio-2003
Uso principal Control de la ejecucin Clculos intermedios Resultado de clculos Seleccin de bancos Valores de retorno y clculos Clculos intermedios Puntero a RAM Puntero a Pila Puntero a marco Acceso a variables situadas en la memoria de programa. Tablas Puntero para llamadas a funciones Utilizada por la librera matemtica
Ifara Tecnologas S.L.
Guardados automticamente X X X X
X X X
73
Curso Programacin en C
de microcontroladores PIC
Laboratorio II
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. Programar el puerto serie para poder recibir una trama de 4 bytes. Cuando estemos esperando a recibir el primer carcter de trama encenderemos RB0. Una vez recibida la trama proceder a su anlisis. Utilizar el primer byte como identificador de comando. a -> activar el zumbador. b -> enviar el estado del pulsador RA4 al PC. Enviar la cadena ON y OFF en ASCII. c -> El segundo byte es un valor entre 0 y 7 en ASCII. Representarlo en los LEDS RB1:RB3.
2.
junio-2003
75
Prctica: Servidor
d -> los tres siguientes bytes, indican un valor de un registro de la memoria de datos. Leer ese valor y enviarlo al PC en hexadecimal. e -> apagar el zumbador
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
Documentacin
www.microchip.com CDROM
Getting started with C C18 user guide Libreras C18 Picdem2 user guide Datasheet 18f452
junio-2003
77