(actualizaciones al final)
Calificador: Estoy publicando esto aquí y no en el Arduino Stack Exchange porque mi pregunta es sobre el desarrollo de firmware y no el desarrollo de Arduino.
Proyecto: Estoy diseñando una PCB que utilizará un ATmega2560 como CPU.
¿Por qué? Soy un recién graduado BSEE con mucha más experiencia y habilidad para el hardware que el firmware, así que estoy desafiando a mí mismo con los limitados recursos que tengo disponibles para mejorar mi comprensión de uCs y el desarrollo de firmware.
Recursos: un montón de Arduino Megas, algunos LEDs, cables de puente, Atmel Studio 7 (AS7), Arduino IDE, WinAVR, internet.
Hecho hasta ahora: He realizado el proceso ArduinoISP con éxito. Estos son los pasos que he seguido utilizando el IDE de Arduino...
- Subido el sketch de ArduinoISP al Programador Mega.
- Adjunto 10uF cap entre reset y gnd en Programmer Mega.
- Conexiones ICSP de Target Mega cableadas a Programmer Mega.
- Puerto COMM izquierdo ajustado a Programador Mega.
- Elige "Arduino as ISP" como programador y pulsa "Burned Bootloader".
Pensamientos: Me doy cuenta ahora como yo estaba escribiendo esto que todo lo que hice fue volver a grabar el Arduino Bootloader en el Mega de destino utilizando el "Arduino como ISP" Programador Mega.
Hecho hasta ahora otra vez: Escrito simple "Blink" programa en AS7. Construye.
Resultado deseado: Mi Mega objetivo para dejar de ser un Arduino Mega y ser una placa de desarrollo ATmega2560 para que pueda hacer el desarrollo de firmware AVR puro obligándome a hacer todas las cosas difíciles que Arduino se encarga de. Estoy tratando de eliminar todo Arduino del proceso de desarrollo que no sea el hardware utilizado para el desarrollo de firmware y "Arduino como ISP" para la programación flash.
Investigación: Todo lo que he encontrado en línea tiene que ver con el uso de AS7 para codificar un "Arduino" AVR uC.
Preguntas:
- ¿Puedo usar el programador "Arduino como ISP" Mega para flashear un ATMega2560 en un Arduino Mega sin el Arduino Bootloader en dicho ATMega2560?
- ¿Es AVR-GCC lo que utilizaré para generar el archivo binario a partir del código fuente en C que luego flashearé?
- ¿Mi ejemplo "Blink" de arriba utiliza algo "Arduino"?
- ¿Estoy en lo cierto al pensar que si consigo que mi Arduino Mega no sea reconocido por el IDE de Arduino, pero aún así puedo grabarle código y controlarlo, habré conseguido el "resultado deseado"?
ACTUALIZACIÓN: Estaba teniendo problemas para configurar AVRDude como una herramienta externa en AS7. Seguí todas las instrucciones que pude encontrar cuidadosamente y la salida sólo estaría en blanco. Me di cuenta de que era porque tenía el IDE de Arduino instalado como una aplicación de Windows por lo que AS7 no podía seguir la ruta AVRdude.exe. Ahora estoy teniendo problemas con la apertura AVRdude.conf pero extasiado por lo menos tuve un pequeño éxito.
ACTUALIZACIÓN2: Tenía la ruta equivocada para AVRdude.conf. Usando el IDE de Arduino con la opción "verbose output for upload" seleccionada subí código en blanco y la línea superior del mensaje de salida contenía las rutas que necesitaba.
ACTUALIZACIÓN3: Estaba recibiendo el clásico error stk500_getsync():not in sync y era un problema de velocidad de transmisión. Tenía 115200 que estoy bastante seguro de que es la velocidad de transmisión que Arduino IDE utiliza para cargar un boceto a un Mega, pero el gestor de arranque se quema a una velocidad de 19200 baudios. Desde que estoy usando "Arduino como ISP" se está quemando toda la memoria flash no sólo cargar el código fuente. (Nota: Todavía estaba teniendo problemas de sincronización, incluso después de cambiar la velocidad de transmisión y fue porque las conexiones de la tapa de desacoplamiento en el pin de reinicio del Programador Mega eran incompletas. Doblé los extremos de las patas para que encajara mejor en los cabezales del Mega).
ACTUALIZACIÓN4: Mi programador ArduinoISP funciona pero mi objetivo sigue sin parpadear. Estudié la salida de AVRdude y vi que no podía encontrar el archivo main.hex. Miré en el directorio del proyecto de Atmel studio y no hay archivo main.hex. En el argumento de la herramienta externa tuve que cambiar ItemFileName.hex por TargetName.hex. Así que carga con éxito, pero mi objetivo todavía no parpadea.
ACTUALIZACIÓN5: ¡¡¡¡¡SE BLOQUEA!!!!! Así que me di por vencido en mi búsqueda inicial y trató de hacer sólo un Arduino Mega parpadeo utilizando el otro como un programador ISP. Me di cuenta de que AVRdude lee los valores de los fusibles antes de escribirlos, así que cogí un Arduino Mega que sabía que todavía estaba configurado como Arduino y le cargué mi programa de parpadeo. No empezó a parpadear, pero cogí los valores de los fusibles que leía y los incluí en el argumento de mi herramienta externa. Volví a cargar y huzzah mi mega parpadea. Este es mi argumento (también encontré esto genial enlace que ayuda a entender todo en el argumento)
-U lfuse:w:0xFF:m -U hfuse:w:0xD8:m -U efuse:w:0xFD:m -e -v -patmega2560 -carduino -PCOM11 -b19200 -D -Uflash:w:" $(ProjectDir)Debug\$ (TargetName).hex":i -C "C:\Program Files (x86)\Arduino\hardware\tools\avr/etc/avrdude.conf"
Próximos pasos: Averiguar cómo obtener una sesión de depuración activa en AS7 con el depurador en chip de ATmega2560 (ahora me dirijo a la hoja de datos).