Hallo!
Ich bin recht neu in der Elektronikwelt und habe mir zum Einstieg einen
Arduino Mega2560 gekauft. Es ist eine atmega2560 verbaut. Das hat auch
alles super funktioniert aber vom einen auf den anderen Augenblick ließ
er sich nicht mehr richtig programmieren. Zufällig bekam ich den
folgenden Fehler beim Programmieren:
1
avrdude: stk500_2_ReceiveMessage(): timeout
Ich habe dann nach längerem Rätselraten den Schuldigen gefunden. Die
Fusebits sind verstellt. Die Ausgabe von
Die Fusebits bei einem Arduino Mega 2560 sollen jedoch so aussehen:
Low fuses = 0xff
High Fuses = 0xd8
Extended Fuses = 0xfd
Ich habe dann folgendes versucht:
avrdude: verification error, first mismatch at byte 0x0000
22
0xff != 0x00
23
avrdude: verification error; content mismatch
24
25
avrdude: safemode: lfuse changed! Was ff, and is now 0
26
Would you like this fuse to be changed back? [y/n]
Wenn ich mit y bestätige, dann passiert einfach nichts mehr.
Gibt es noch eine Möglichkeit die Fusebits zu resetten, oder ist der
Arduino gebrickt?
Gruß, Tobias
Ich hab mal nachgeschaut was diese Fusebits denn so bedeuten und ein
daraus resultierendes Problem ist, dass auf external Clock gestellt
wird. Allerdings wird beim Arduino der XTAL1 Pin nicht nach außen
geführt, so dass ich da keinen externen Clock anlegen kann.
Merkwürdigerweise funktioniert das Auslesen der Fusebits zuverlässig,
was ja eigentlich auch nicht sein darf, da ja überhaupt kein Taktsignal
gegeben ist. Könnte man versuchen mit einem ICSP zu Programmieren oder
ist das auch aussichtslos ohne Takt?
>Merkwürdigerweise funktioniert das Auslesen der Fusebits zuverlässig,>was ja eigentlich auch nicht sein darf, da ja überhaupt kein Taktsignal>gegeben ist.
Richtig, das heisst der hat seinen Takt. Signatur wird ja auch
richtig gelesen. Schon mal überlegt das der Bootloader
im Arduino die Fuses evtl. gar nicht lesen und schreiben kann?
holger schrieb:> Schon mal überlegt das der Bootloader> im Arduino die Fuses evtl. gar nicht lesen und schreiben kann?
Ich hab das gerade überprüft indem ich mir einen ICSP-Adapter gebaut
habe und du hast Recht. Mit dem neuen Adapter der nicht über USB läuft
kann ich die Fuses lesen und setzen. Es sind allerdings auch die
Richtigen. Das bedeutet, dass der Fehler überhaupt nicht an falschen
Fusebits liegt.
Also nochmal zur ursprünglichen Frage. Woher kann der Fehler
1
avrdude: stk500_2_ReceiveMessage(): timeout
kommen? Er tritt sporadisch beim Programmieren auf. Bei manchen
Programmen immer bei anderen nie.
Kann ein fehlerhaftes Programm beim Uploaden schon einen solchen Fehler
produzieren?
Gruß, Tobias
Ich bin einfach nur noch verwirrt. Ich habe jetzt ein Beispiel gefunden,
das ich reproduzieren kann. Ich habe zwei Versionen an Quelltext
angehängt. Dabei handelt es sich um minimal unterschiedlichen Code. Der
Code wurde aus dem Article-Bereich hier kopiert. Es handelt sich um eine
Soft-PWM.
Der einzige Unterschied zwischen den Beiden Varianten ist in der
loop-Funktion.
Funktionieren tut:
1
void loop()
2
{
3
4
memcpy(pwm_setting, t1, 8);
5
pwm_update();
6
7
delay(1000);
8
9
memcpy(pwm_setting, t2, 8);
10
pwm_update();
11
12
delay(1000);
13
14
memcpy(pwm_setting, t3, 8);
15
pwm_update();
16
17
delay(1000);
18
19
memcpy(pwm_setting, t4, 8);
20
pwm_update();
21
22
delay(1000);
23
24
memcpy(pwm_setting, t5, 8);
25
pwm_update();
26
27
delay(1000);
28
/*
29
memcpy(pwm_setting, t6, 8);
30
pwm_update();
31
32
delay(1000);
33
*/
34
memcpy(pwm_setting, t7, 8);
35
pwm_update();
36
37
delay(1000);
38
39
}
Nicht funktionieren tut:
1
void loop()
2
{
3
4
memcpy(pwm_setting, t1, 8);
5
pwm_update();
6
7
delay(1000);
8
9
memcpy(pwm_setting, t2, 8);
10
pwm_update();
11
12
delay(1000);
13
14
memcpy(pwm_setting, t3, 8);
15
pwm_update();
16
17
delay(1000);
18
19
memcpy(pwm_setting, t4, 8);
20
pwm_update();
21
22
delay(1000);
23
24
memcpy(pwm_setting, t5, 8);
25
pwm_update();
26
27
delay(1000);
28
29
memcpy(pwm_setting, t6, 8);
30
pwm_update();
31
32
delay(1000);
33
34
memcpy(pwm_setting, t7, 8);
35
pwm_update();
36
37
delay(1000);
38
39
}
Der einzige Unterschied zwischen den beiden Versionen sind die drei
auskommentieren Zeilen. Der vollständige Source ist angehängt.
Wer mir das erklären kann...
Gruß, Tobias