Os pongo una pequeña explicación, a modo de resumen, sobre el como crear un proyecto de FreeRTOS y C18 en MPlab, en el ejemplo se aprovecha para hacer un Hola Mundo con un LCD 16x2. Son unas cuantas conclusiones extraídas del curso de FreeRTOS que estamos haciendo varios compañeros de este foro con nuestro profe Reinier
Así que un gran abrazo para él!
- En primer lugar, descargamos la última versión de MPlab, de C18 y de FreeRTOS, e instalamos MPlab y C18:
http://www.microchip.com/mplab/http://ww1.microchip.com/downloads/en/DeviceDoc/MPLAB_IDE_8_53.ziphttp://www.microchip.com/c18/http://sourceforge.net/projects/freertos/files/FreeRTOS/http://downloads.sourceforge.net/project/freertos/FreeRTOS/V6.0.5/FreeRTOS%20V6.0.5.exe?use_mirror=switch&ts=1280746154- Creamos una estructura de directorios de la siguiente forma (recomendada por Reinier):
- C:\FreeRTOS (aquí estará el contenido del FreeRTOS V6.0.5)
- L Prj
- L pic18
- L C03E03b (Aquí extraemos el contenido del 'C03E03b.rar' adjunto)
- Abrimos MPlab y pinchamos sobre 'project/new', le ponemos nombre al proyecto 'main' y seleccionamos la ruta anterior 'C:\FreeRTOS\Prj\pic18\C03E03b'.
- Seleccionamos ahora el micro a usar, para ello pinchamos sobre 'configure/select device', en la lista buscamos el PIC18F2550.
- Configuramos las rutas, para ello pinchamos sobre 'project/build options/project'. En la pestaña 'directories' seleccionamos 'library search path' de la lista desplegable. Añadimos la ruta del compilador C18, que es por defecto, 'C:\MCC18\lib'.
- A continuación seleccionamos 'include search path' de la lista desplegable. Añadimos los siguientes directorios:
- 'C:\FreeRTOS\Source\portable\MPLAB\PIC18F'
- 'C:\FreeRTOS\Source\include'
- En la pestaña 'MPASM/C17/C18 Suite' seleccionamos 'extended mode'
- En la pestaña 'MPLAB C18', dentro de la categoría 'General', añadimos el siguiente 'Preprocessor Macro': 'MPLAB_PIC18F_PORT'.
- En la misma pestaña, pero bajo la categoría 'Memory Model', seleccionamos las siguientes opciones:
- Large code model
- Large data model
- Multi-bank model
- Guardamos cambios y vamos a añadir ahora los fuentes! En la ventana raíz del proyecto, en caso de no verla, pinchamos sobre 'View/Project'.
- En 'Source Files' añadimos los siguiente archivos:
- 'C:\FreeRTOS\Source'
'croutine.c', 'list.c', 'queue.c', 'tasks.c' - 'C:\FreeRTOS\Source\portable\MPLAB\PIC18F'
'port.c' - 'C:\FreeRTOS\Source\portable\MemMang'
'heap_1.c' - 'C:\FreeRTOS\Prj\pic18\C03E03b'
'main.c'
- En 'Header Files' añadimos:
- 'C:\FreeRTOS\Prj\pic18\C03E03b'
'FreeRTOSConfig.h'
- En 'Linker Script' añadimos:
- 'C:\FreeRTOS\Prj\pic18\C03E03b'
'18f2550.lkr' (Más adelante veremos como modificar un .lkr)
- Ya casi estamos! Si probáramos a compilar en este punto veríamos que el software nos arroja el siguiente error:
- 'Error - could not find definition of symbol 'vSerialRxISR' in file './port.o'.'
Esto se debe a que por defecto el port.c va a intentar hacer uso de las rutinas de interrupción para la UART, como no las vamos a utilizar, las comentamos en el 'port.c'. Las encontramos casi al final, en la siguiente función 'prvLowInterrupt( void )'. Comentamos los 'If' de 'vSerialRxISR' y 'vSerialTxISR'.
- Ahora si, ya está todo listo para compilar, si lo hacéis debería salir el buscado 'Build Succeeded'. Si tenéis un entrenador y un LCD este es el momento de probar el 'Hola FreeRTOS!'.
- Queda un punto por comprender, la modificación del linker. Para ello abrimos el linker de ejemplo de Microchip y el de este proyecto:
- 'C:\MCC18\bin\LKR'
'18f2550_g.lkr' - 'C:\FreeRTOS\Prj\pic18\C03E03b'
'18f2550.lkr'
Como se puede apreciar, el linker de ejemplo tiene varios 'IFDEF', uno para 'Extended Mode' (haremos uso de él como ya hemos visto antes), otro para 'Debug' (no lo usaremos), por lo que si eliminamos todo lo que de momento no vamos a usar quedaría algo así:
// File: 18f2550_g.lkr
// Generic linker script for the PIC18F2550 processor
LIBPATH .
FILES c018i_e.o
FILES clib_e.lib
FILES p18f2550_e.lib
CODEPAGE NAME=page START=0x0 END=0x7FFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
DATABANK NAME=gpr0 START=0x0 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
DATABANK NAME=usb5 START=0x500 END=0x5FF PROTECTED
DATABANK NAME=usb6 START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
STACK SIZE=0x100 RAM=gpr3
Puesto que el FreeRTOS necesita un solo bloque de RAM (ya que él se encarga de gestionarla), y debido a que para este proyecto no vamos a utilizar el USB, reagrupamos la RAM y el linker quedaría del modo que podemos ver en el '18f2550.lkr'
// File: 18f2550_g.lkr
// Generic linker script for the PIC18F2550 processor
LIBPATH .
FILES c018i_e.o
FILES clib_e.lib
FILES p18f2550_e.lib
CODEPAGE NAME=page START=0x0 END=0x7FFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED
DATABANK NAME=BIG_RAM START=0x00 END=0x7FF
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED
SECTION NAME=CONFIG ROM=config
STACK SIZE=0x100 RAM=BIG_RAM
Para este 'hola mundo' a la FreeRTOS he usado el entrenador 18F2550Trainer:
Con el módulo ModLCD:
Conectados del siguiente modo:
18F2550Trainer - ModLCD
- RB4-RB7 - DB4-DB7
- RA0 - E
- RA1 - RW
- RA2 - RS
- RC2 - LEDR
- VCC - LEDLCD
- VCC - VCC
- GND - GND
- El Driver para el LCD está basado en el XLCD de Microchip con alguna mínima modificación. A continuación un vídeo (minimalista XD) del funcionamiento!!
Descargar Código FuenteUn saludo a todos!