Paso 8: PIC programación, parpadear un LED, cargador de arranque
¿Por qué necesitamos un gestor de arranque en primer lugar?
Es necesario, sin embargo él que miente alrededor de nuestra área de trabajo con sin razón no es un PicKit3 alrededor. Inicialmente no quería complicar mi vida con bootloaders, pero más tarde me di cuenta la verdad: este proyecto es mejor sin el PicKit. Es agradable, especialmente si es un cable mini USB extremadamente común, que cada aficionado tiene un montón de tener un solo cable para la programación. La cabecera de cinco pines ICSP fue dejada fuera el diseño intencionalmente, utilicé mi tablero de conector ZIF flashear el bootloader en el PIC.
Gestor de arranque USB, simple y buena
Mirando la hoja de datos del procesador que me decidí a utilizar, se puede ver que existe UART y USB. Si escojo UART, necesito un USB-UART convertidor y un montón de hilos - en contra del propósito. Así que la opción mejor, más simple, más bonita es USB. Microchip ofrece todo tipo de muestras de código para las fotos, gestores de arranque también. Si usted descarga e instala "Librerías de Microchip para aplicaciones", habrá una carpeta completa sobre todo tipo de aplicaciones USB, bootloaders, herramientas y otras cosas útiles. En la subcarpeta "Bootloaders" escogió "USB HID Bootloader" y abrió en MPLAB X. Después de leer a través de ella un par de veces para entender su lógica, he implementado modificaciones para que sea perfecto para mi RekaBot.
Unas palabras sobre gestores de arranque
Un gestor de arranque es una sección especial del código que está escrito en microcontroladores una vez y proporciona una manera para cargar firmware sin necesidad de un programador (alto voltaje) especial, como el PicKit3 en nuestro caso. Desafortunadamente, no hay ninguna manera de evitar completamente el uso del PicKit, el gestor de arranque tiene que llegar de alguna manera en el PIC. La parte buena: usted puede pedir prestado un PicKit, ICD2 o cualquier interruptor intermitente de la foto de un amigo, y dar de nuevo una vez que el gestor de arranque está escrito en el microcontrolador. Después de - dependiendo de qué tipo de gestor de arranque tiene flasheada, puedes subir firmware a la memoria de programa a través de UART, USB, CAN o lo que sea. Utilizar gestores de arranque es simple, pero viene con la desventaja de perder la memoria de programa precioso. Algunos gestores de arranque comen menos espacio, algunos comen más - este se come 1K de memoria. Al inicio de cada PIC en la dirección 0 se enciende y comienza a ejecutar cualquier código el programador ha escrito allí. Si es el gestor de arranque = el PIC se ejecuta el gestor de arranque. Si es el código de usuario = la PIC se ejecuta el código de usuario. Bastante simple!
Para poder utilizarlos dos, tenemos que cambiar de alguna forma entre estos dos programas. Este cambio puede hacerse en base a una condición, evento o lo que sea - va a ser muy parecido a una declaración enorme "if". Elegí esta condición que el nivel de voltaje en un pin de entrada, llamado sentido de USB en los esquemas. Este pin es conectado al pin de 5V del conector USB a través de un resistor. Si el pin está a 5 [V] en el arranque, el PIC tiene que ejecutar la rama del gestor de arranque de la gran "si", si es a 0 [V], el código de la aplicación de usuario tenía que ejecutar. Coloqué el código de usuario justo después del código de gestor de arranque, en la dirección 1000h. El PIC18F4550 verifica el pin de pin de sentido varias veces, así que cuando se quita el cable USB y 5 [V] desaparece de RD3, el PIC va saltar el código colocado en el 1000h, código de la aplicación de usuario. En el código de la aplicación de usuario verificar nuevamente el nivel de voltaje en el pin de sentido, si el programa ve a 5 [V] en él, el cable USB está conectado otra vez y el PIC tiene que saltar para el gestor de arranque. Hacer este salto al modo gestor de arranque con una instrucción de "RESET" de montaje en línea. Desde el PIC comienza a ejecutar desde la dirección 0, lo más simple y más común es colocar el código de gestor de arranque allí y el código de usuario justo después el gestor de arranque.
El código de gestor de arranque puede modificarse para comprobar si existe o no un firmware válido por escrito en la foto. Esto se hace comprobando el contenido de la memoria en dirección 1006-1007 horas. Después de cada programación, los insertos de bootloader "600D" (leet de 'bueno') en este lugar, lo que significa que el código se ha escrito en el PIC con éxito - esto es lo que consigue comprobar su validez. Debemos especificar en la configuración de proyecto de aplicación de usuario que esta ubicación no debe ser sobrescrito, ver las imágenes para ver cómo se hace (ROM gamas se especifican para saltar este lugar cuando se compila el código de la aplicación de usuario). No hacerlo resultará en errores muy difíciles de detectar más tarde. La sección donde las mentiras del gestor de arranque deben estar protegidas así: esto se hace por compensación el código de la aplicación de usuario todo por 1000h (código offset parámetro en las opciones del vinculador). Gestores de arranque son generalmente situados al principio o al final de la memoria de programa - debe tener cuidado de no sobreescribirlo! Quería añadir alguna parametrización para este dispositivo, por eso la gama de 3000-3100 está protegida así. No necesitas eso, solo uno!
Problemas llegué a trabajar con el gestor de arranque
Compilar el proyecto resultará en un archivo hexadecimal generado - esto tiene que ser flasheado en el PIC con un PicKit o lo que sea. En un proyecto más viejo que me encontré con un problema extraño, la herramienta de gestor de arranque USB no detecta nada. Decidí hacer las mediciones en el pin VUSB del PIC de mi alcance y el momento que mencioné el perno con la sonda de alcance, el conocido sonido de USB y tiene reconocida la Junta! Pensé que el problema se fue, pero en cuanto me lo quitaron la sonda, la cosa dejó de funcionar otra vez. Me di cuenta de que todo funciona cuando la sonda alcance, incluso las escrituras, se restablece - el problema tuvo que ser algo que fija la sonda. Entonces pensé: ¿Qué tienen las puntas de prueba alcance? Capacitancia parásita. El condensador en el pin VUSB fue enorme en valor y no podía filtrar los ruidos de alta frecuencia. Se agregó un capacitor de 100nF en paralelo, y la junta fue reconocida inmediatamente.
Sabiendo esto por adelantado, he añadido un condensador de valor pequeño en la parte superior original, el USB vino en sin problema en el primer intento! Lección aprendida!
Si funciona el gestor de arranque, flash el programa de luz intermitente de LED, depurarlo si es necesario y proceder a escribir cosas más serias, que se describe en los pasos siguientes.