Me gustaría programar un ATmega1284p con mi AVR Dragon y el Arduino IDE. Hasta ahora he instalado mighty1284p ( http://maniacbug.wordpress.com/2011/11/27/arduino-on-atmega1284p-4/ ), después de escribir mi sketch (de ejemplo) lo compilo usando el IDE de Arduino y luego cd
en el directorio (temporal) en el que se construye el boceto. Contiene el .hex
archivo, como parece lógico.
A continuación, subo el .hex
archivo en el 1284 usando el Dragon y avrdude
También parece que funciona bien.
Excepto en mi protoboard, el 1284 no hace nada. No blink
en la clavija 13 (o en cualquier otra clavija).
Los fusibles han sido configurados para utilizar el oscilador RC interno con un tiempo de arranque de 65ns. La tensión de alimentación es de +5V/GND, medido correctamente.
Este es mi montaje de pan. Entre VCC y GND tengo un condensador de 20pF según las instrucciones de Atmel.
simular este circuito - Esquema creado con CircuitLab
¿Alguna idea de lo que estoy haciendo mal aquí?
Edición 1 Estoy intentando hacer funcionar el ejemplo de Blink del IDE de Arduino:
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
// Pin 13 has an LED connected on most Arduino boards.
// give it a name:
int led = 1;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
El Ejemplo básico de avr-gcc que funciona Lo que sigo parloteando en los comentarios es esto:
#include <util/delay.h>
#include <avr/io.h>
#define F_CPU 1000000
int main (void) {
DDRB = 0xff;
while(1) {
PORTB |= (1<<PB1); //Bit setzen
_delay_ms(1000); // halbe sekunde warten
PORTB &= ~(1<<PB1); // Bit loeschen
_delay_ms(1000); // halbe sekunde warten
}
return 0;
}
He cargado con éxito el programa de .hex
y el uC parpadea en el Pin2 como debería, el resto de PORTB está en HIGH el tiempo (de nuevo, como debería). Así que asumo que el cableado, el poder y mi n00b avrdude
habilidades son, bueno, suficientes. Sólo me gustaría utilizar las construcciones del lenguaje bequem de Arduino... ( bequem es "conveniente, cómodo" en alemán, como en "No pienso en comprarme zapatos nuevos, ¡los míos están bastante bien!" ;)
Edición 2 ¡Qué haría yo sin vosotros ;)! No había aprendido tanto en una tarde desde hace mucho tiempo.
A veces, el mero hecho de hablar de ello ayuda enormemente a derribar las barreras cerebrales.
He configurado los fusibles en mi 1284p para utilizar el RCO interno más He puesto el fusible para dividir la frecuencia de reloj por 8. Evey debería haber sido capaz de hacer ese cálculo en mi cabeza, la frecuencia de reloj es ahora 1MHz. mighty1284p
en su configuración original quiere una velocidad de reloj de 16MHz, por lo que todo era tan lento que pensé que no funcionaba en absoluto, cuando en realidad sólo se arrastraba.
La configuración de trabajo hasta ahora:
Arduino IDE con mighty1284p
He añadido esto al board.txt de mighty1284p
:
##############################################################
mighty_opt8.name=Mighty 1284p 8MHz using Optiboot
mighty_opt8.upload.protocol=arduino
mighty_opt8.upload.maximum_size=130048
mighty_opt8.upload.speed=115200
mighty_opt8.bootloader.low_fuses=0xff
mighty_opt8.bootloader.high_fuses=0xde
mighty_opt8.bootloader.extended_fuses=0xfd
mighty_opt8.bootloader.path=optiboot
mighty_opt8.bootloader.file=optiboot_atmega1284p.hex
mighty_opt8.bootloader.unlock_bits=0x3F
mighty_opt8.bootloader.lock_bits=0x0F
mighty_opt8.build.mcu=atmega1284p
mighty_opt8.build.f_cpu=8000000L
#mighty_opt8.build.core=arduino:arduino
mighty_opt8.build.core=standard
mighty_opt8.build.variant=standard
##############################################################
mighty_opt1.name=Mighty 1284p 1MHz using Optiboot
mighty_opt1.upload.protocol=arduino
mighty_opt1.upload.maximum_size=130048
mighty_opt1.upload.speed=115200
mighty_opt1.bootloader.low_fuses=0xff
mighty_opt1.bootloader.high_fuses=0xde
mighty_opt1.bootloader.extended_fuses=0xfd
mighty_opt1.bootloader.path=optiboot
mighty_opt1.bootloader.file=optiboot_atmega1284p.hex
mighty_opt1.bootloader.unlock_bits=0x3F
mighty_opt1.bootloader.lock_bits=0x0F
mighty_opt1.build.mcu=atmega1284p
mighty_opt1.build.f_cpu=1000000L
#mighty_opt1.build.core=arduino:arduino
mighty_opt1.build.core=standard
mighty_opt1.build.variant=standard
##############################################################
Ahora mi IDE de Arduino tiene nuevas placas: Mighty 1284p 1MHz using Optiboot
y Mighty 1284p 8MHz using Optiboot
que dirige/utiliza/referencia las velocidades de reloj disponibles internamente.
Ahora avrdude
necesita poner los fusibles:
avrdude -c dragon_pp -P usb -p m1284p -U lfuse:w:0x62:m -U hfuse:w:0x99:m -U efuse:w:0xFF:m -U lock:w:0xFF:m
No puedo hacer esto en mi cabeza, ni sé mucho sobre esto. Pero las interwebs ayudan a un pobre hombre aquí también: http://www.frank-zhao.com/fusecalc/fusecalc.php?chip=atmega1284p produce lo anterior.
Entonces es una simple cuestión de mirar la salida de Arduino, cd
en el directorio y cargando los archivos ya construidos .hex
:
cd /var/folders/px/xmf1dygn6p5_fn1hh05c6gyr0000gn/T/build4082512148637729777.tmp/
avrdude -p m1284p -c dragon_pp -P usb -U flash:w:Fade.cpp.hex
(y sí, he actualizado silenciosamente mis pruebas a algo más intimidante, como el Fade
ejemplo. Funciona.
Ahora todo lo que queda: ¿Cómo podría utilizar el HVPP del AVR Dragon directamente desde el IDE de Arduino? He añadido una sección para programmers.txt
como tal:
dragonpp.name=AVR Dragon HVPP
dragonpp.communication=usb
dragonpp.protocol=dragon_pp
dragonpp.force=false
lo que supuse que sería correcto para lo anterior avrdude
parámetros, pero por ahora el IDE sigue pidiéndome un puerto (como en /dev/tty.usbAF65de
) que por supuesto el Dragón no tiene, el correcto -P
opción para avrdude
es simplemente usb
(que, como hemos visto, funciona si se hace manualmente).
¿Alguna otra idea sobre cómo añadir la programación paralela de alto voltaje del AVR Dragon a Arduino?