No uso Arduino, solo trato de programar un ATMega32 simple usando USBASP. Recibiendo este mensaje:
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
0x00 != 0x0c
avrdude: verification error; content mismatch
avrdude done. Thank you.
Explicación:
Yo uso una placa de desarrollo AVR con 8.00:
Para que la etiqueta del modelo AVR sea más clara, también hice esta foto ( foto )
Para programar el microcontrolador, uso un USBASP. El cristal del programador es de 12,0 MHz (aunque podría no ser relevante).
Lo instalé Avrdude
en ubuntu y escribí el siguiente programa:
// main.c
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRD = 255;
PORTD=255;
DDRC = 255;
while(1){
PORTC=255;
_delay_ms(200);
PORTC=0;
_delay_ms(200);
}
return 0;
}
Luego compiló e hizo un archivo hexadecimal:
avr-gcc -w -Os -DF_CPU=8000000UL -mmcu=atmega32 -c -o main.o main.c
avr-gcc -w -mmcu=atmega32 main.o -o main
avr-objcopy -O ihex -R .eeprom main main.hex
Hasta ahora, main.hex
el archivo se ha creado correctamente.
Luego, tratando de cargarlo en el microcontrolador:
sudo avrdude -p m32 -c usbasp -B 8 -v -e -u -U flash:w:main.hex
Y el resultado es decepcionante. Me refiero a la última parte:
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
0x00 != 0x0c
avrdude: verification error; content mismatch
avrdude done. Thank you.
El mensaje completo es:
avrdude: Version 6.0.1, compiled on Oct 21 2013 at 15:55:32
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch
System wide configuration file is "/etc/avrdude.conf"
User configuration file is "/home/me/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : usb
Using Programmer : usbasp
Setting bit clk period : 100.0
AVR Part : ATmega32
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 64 0 no 1024 4 0 9000 9000 0xff 0xff
flash 33 6 64 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00
lock 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00
Programmer Type : usbasp
Description : USBasp, http://www.fischl.de/usbasp/
avrdude: set SCK frequency to 8000 Hz
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9502
avrdude: erasing chip
avrdude: set SCK frequency to 8000 Hz
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (162 bytes):
Writing | ################################################## | 100% 0.15s
avrdude: 162 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 162 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.10s
avrdude: verifying ...
avrdude: verification error, first mismatch at byte 0x0000
0x00 != 0x0c
avrdude: verification error; content mismatch
avrdude done. Thank you.
Esta es la forma en que conecté el microcontrolador mientras descargaba el hex
archivo:
Cuando compruebo la comunicación, parece estar bien:
sudo avrdude -p m32 -c usbasp -t
La respuesta:
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9502
avrdude>
Entonces, ¿qué está mal? ¿Qué hacer?
Parece que nada está programado. Lo comprobé con un adaptador de 5 V CC ( foto ) y una placa de pruebas con LED y condensador. Conectar el LED a VCC lo enciende ( foto ), lo que muestra que el LED está funcionando. Conectando a cualquier pin del puerto D no enciende el LED ( foto ) conectando a algunos pines del puerto C enciende el LED ( foto ) y otros no ( foto ). Pero no hay parpadeo. Tenga en cuenta que estoy usando un chip ATMega32 virgen.
Actualizar
Inspirándome en este sitio web (por cierto, ¡no sé alemán!) y algunos otros, finalmente usé el siguiente comando:
sudo avrdude -p m32 -c usbasp -v -b 19200 -B5 -e -U flash:w:main.hex -U lfuse:w:0xe4:m -U hfuse:w:0x99:m
Respuesta:
avrdude: Version 6.0.1, compiled on Oct 21 2013 at 15:55:32
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2009 Joerg Wunsch
System wide configuration file is "/etc/avrdude.conf"
User configuration file is "/home/me/.avrduderc"
User configuration file does not exist or is not a regular file, skipping
Using Port : usb
Using Programmer : usbasp
Overriding Baud Rate : 19200
Setting bit clk period : 5.0
AVR Part : ATmega32
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 64 0 no 1024 4 0 9000 9000 0xff 0xff
flash 33 6 64 0 yes 32768 128 256 4500 4500 0xff 0xff
lfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00
hfuse 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00
lock 0 0 0 0 no 1 0 0 2000 2000 0x00 0x00
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00
Programmer Type : usbasp
Description : USBasp, http://www.fischl.de/usbasp/
avrdude: set SCK frequency to 187500 Hz
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9502
avrdude: safemode: lfuse reads as E4
avrdude: safemode: hfuse reads as 99
avrdude: erasing chip
avrdude: set SCK frequency to 187500 Hz
avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (162 bytes):
Writing | ################################################## | 100% 0.11s
avrdude: 162 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 162 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.07s
avrdude: verifying ...
avrdude: 162 bytes of flash verified
avrdude: reading input file "0xe4"
avrdude: writing lfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xe4:
avrdude: load data lfuse data from input file 0xe4:
avrdude: input file 0xe4 contains 1 bytes
avrdude: reading on-chip lfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of lfuse verified
avrdude: reading input file "0x99"
avrdude: writing hfuse (1 bytes):
Writing | ################################################## | 100% 0.00s
avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0x99:
avrdude: load data hfuse data from input file 0x99:
avrdude: input file 0x99 contains 1 bytes
avrdude: reading on-chip hfuse data:
Reading | ################################################## | 100% 0.00s
avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: safemode: lfuse reads as E4
avrdude: safemode: hfuse reads as 99
avrdude: safemode: Fuses OK (H:FF, E:99, L:E4)
avrdude done. Thank you.
¡¡¡Parece que funciona!!!
Ahora, todos los pines encendidos portD
encienden el LED brillante y pin C0
, y parpadean brillantemente mientras , , dan una luz tenue pero constante al LED y C1
no enciende el LED en absoluto.C6
C7
C2
C3
C5
C4
Sin embargo, estoy muy feliz de escribir algo en el chip, ¿alguien podría explicar qué sucedió?
Parece que el problema estaba en la tasa de baudios. "-b 19200" fue la solución.
Había un aviso en línea: "avrdude: advertencia: no se puede establecer el período de sck. Verifique la actualización del firmware de usbasp".
¡Tuve el mismo problema y cambiar el lfuse a E4 lo solucionó! Creo que 1Mhz puede ser demasiado lento para el programador y la configuración interna de 8Mhz lo soluciona.
jms
-B
, que establece la tasa de bits pero funciona solo con Atmel JTAG ICE. Para reducir la velocidad de datos con un USBasp, debe haber un puente o una almohadilla de soldadura que necesite cortocircuitar si la frecuencia de reloj objetivo es demasiado baja (<~2MHz).