Fusebits lassen sich nicht setzen (neuer ATMEGA328P)

OP #7796078
Lesenswert?

Hallo zusammen,

langsam weiss ich nichtmehr weiter und würde mich über euren Rat freuen.

Ich habe einen neuen ATMEGA328P auf Platine mit ISP und ohne externen Quarz.

Ein Arduino UNO dient als ISP.

Über die Arduino IDE konnte ich bisher noch garnicht auf den Mega zugreifen (avrdude: Device signature = 0x000000 avrdude: Yikes! Invalid device signature.), allerdings über AVRDUDE und AVRDUDESS (>>>: avrdude.exe -c arduino -P COM3 -b 115200 -p m8 Detected 1e950f = ATmega328P).

Laut AVRDUDESS stehen alle Fuse-Bits auf 0x00. Soweit ich der Anleitung des Mega entnommen habe, sollten diese auf L 0x62, H 0xD9, E 0xFF und LB 0xFF stehen.

Möchte ich diese jedoch programmieren, erhalte ich die Fehlermeldung:

: avrdude.exe -c arduino -p m328p -P COM3 -b 115200 -U lfuse:w:0x62:m -U hfuse:w:0x00:m -U efuse:w:0x00:m

Processing -U lfuse:w:0x62:m Reading 1 byte for lfuse from input file 0x62 Writing 1 byte (0x62) to lfuse *** failed Error: unable to write lfuse (rc = -1)

Habt ihr noch eine Idee was ich ausprobieren kann? Ich komme leider aus der Welt der Arduinos mit fertigen Bootloadern...

Moderator Persönliche Seite #7796090
Lesenswert?

Mike L. schrieb:

Ich komme leider aus der Welt der Arduinos mit fertigen Bootloadern...

Ich mag mich irren, aber ich denke, dass "-c arduino" eben genau dafür da ist, über den Bootloader eines Arduino mit dem Chip zu reden.

Wenn du den Arduino als Programmiergerät benutzt, musst du ein "-c <irgendwas>" entsprechend dem angeben, was die Firmware, die du auf dem Arduino laufen hast, als Protokoll implementiert.

#7796093
Lesenswert?

Ich denke er hat den UNO als Programmer der wie ein Arduino angesprochen werden will?!

Mit -v AVRDUDE mal geschwätziger stellen. Ob das auch in der IDE geht, weiß ich nicht.

Dann könnte man noch die Bitrate mit -B (??) etwas runterdrehen. Der 328P läuft ja nicht mit "full Speed".

OP #7796098
Lesenswert?

900ss schrieb:

Ich denke er hat den UNO als Programmer der wie ein Arduino angesprochen werden will?!

Genau.

Mit -v AVRDUDE mal geschwätziger stellen. Ob das auch in der IDE geht, weiß ich nicht.

Dann könnte man noch die Bitrate mit -B (??) etwas runterdrehen. Der 328P läuft ja nicht mit "full Speed".

Laut ISP Sketch läuft der UNO mit 19200 Baud.

Stelle ich die Abfrage mit 19200, erhalte ich folgende Ausgabe: Using Port : COM3 Using Programmer : arduino Overriding Baud Rate : 19200 AVR Part : ATmega328P Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PC2 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 :

1
                                  Block Poll               Page                       Polled
2
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
3
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
4
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
5
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
6
           lfuse          0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
7
           hfuse          0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
8
           efuse          0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
9
           lock           0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
10
           calibration    0     0     0    0 no          1    1      0     0     0 0x00 0x00
11
           signature      0     0     0    0 no          3    1      0     0     0 0x00 0x00
12

13
         Programmer Type : Arduino
14
         Description     : Arduino
15
         Hardware Version: 2
16
         Firmware Version: 1.18
17
         Topcard         : Unknown
18
         Vtarget         : 0.0 V
19
         Varef           : 0.0 V
20
         Oscillator      : Off
21
         SCK period      : 0.1 us

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude.exe: Device signature = 0x000000 (retrying)

Reading | ################################################## | 100% 0.02s

avrdude.exe: Device signature = 0x000000 (retrying)

Reading | ################################################## | 100% 0.02s

avrdude.exe: Device signature = 0x000000 avrdude.exe: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check.

avrdude.exe done. Thank you.

Bei 115200 Baud erhalte ich diese Ausgabe: Using Port : COM3 Using Programmer : arduino Overriding Baud Rate : 115200 AVR Part : ATmega328P Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PC2 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 :

1
                                  Block Poll               Page                       Polled
2
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
3
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
4
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
5
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
6
           lfuse          0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
7
           hfuse          0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
8
           efuse          0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
9
           lock           0     0     0    0 no          1    1      0  4500  4500 0x00 0x00
10
           calibration    0     0     0    0 no          1    1      0     0     0 0x00 0x00
11
           signature      0     0     0    0 no          3    1      0     0     0 0x00 0x00
12

13
         Programmer Type : Arduino
14
         Description     : Arduino
15
         Hardware Version: 3
16
         Firmware Version: 4.4
17
         Vtarget         : 0.3 V
18
         Varef           : 0.3 V
19
         Oscillator      : 28.800 kHz
20
         SCK period      : 3.3 us

avrdude.exe: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude.exe: Device signature = 0x1e950f (probably lgt8fx328p) avrdude.exe: safemode: lfuse reads as 0 avrdude.exe: safemode: hfuse reads as 0 avrdude.exe: safemode: efuse reads as 0

avrdude.exe: safemode: lfuse reads as 0 avrdude.exe: safemode: hfuse reads as 0 avrdude.exe: safemode: efuse reads as 0 avrdude.exe: safemode: Fuses OK (E:00, H:00, L:00)

avrdude.exe done. Thank you.

Beitrag #7796101 wurde von einem Moderator gelöscht.
Gast #7796105
Lesenswert?

Ich vermute, dass du nicht mit deinem Target sprichst, sondern mit dem Bootloader des Arduino Uno. Der Bootloader spricht das gleiche Protokoll (stk500) wie der ISP Sketch, allerdings ohne Zugriff auf die Fuses. Wenn du als Target einen anderes ATmega Modell verwenden würdest, wäre das sofort anhand der angezeigten Device-ID offensichtlich.

Das Problem kommt daher, dass der Arduino Uno beim Öffnen des virtuellen COM Portes einen Reset macht und in der ersten Sekunde danach im Bootloader Modus läuft.

Am einfachsten löst man das Problem, indem man einen Kondensator mit 10 µF oder mehr an Reset+Gnd des Arduino Uno anschließt. Dadurch wird der kurze Reset-Impuls unterdrückt.

"The 10µF electrolytic capacitor connected to RESET and GND of the programming board is needed only for the boards that have an interface between the microcontroller and the computer's USB, like Mega, UNO, Mini, Nano." https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP/

OP #7796116
Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:

Ich vermute, dass du nicht mit deinem Target sprichst, sondern mit dem Bootloader des Arduino Uno. Der Bootloader spricht das gleiche Protokoll (stk500) wie der ISP Sketch, allerdings ohne Zugriff auf die Fuses. Wenn du als Target einen anderes ATmega Modell verwenden würdest, wäre das sofort anhand der angezeigten Device-ID offensichtlich.

Hast recht gehabt, ich hab mein Target einmal abgeklemmt und bekomme das gleiche Ergebnis...

Das mit dem Kondensator habe ich probiert, allerdings bekomme ich in AVRDUDE dann bei 19200 Baud das gleiche Ergebnis und bei 115200 Baud "not in sync".

Bei AVRDUDESS funktioniert mit Kondensator die Kommunikation garnichtmehr.

Gast #7796121
Lesenswert?

Hast du den Reset Eingang des Targets mit Pin 10 des Arduino Uno verbunden? Zeige Fotos vom Aufbau.

Nimm die niedrige Baudrate. Für 115200 Baud brauchst du einen Arduino Uno mit Quarz, die meisten Board haben aber nur einen Keramik Resonator, die sind dafür nur mit Glück präzise genug.

Angehängte Dateien:
OP #7796132
Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:

Den ISP Sketch hast du aber installiert, oder?

Probiere einen viel größeren Kondensator.

Hast du den Reset Eingang des Targets mit Pin 10 des Arduino Uno verbunden?

Nimm die niedrige Baudrate. Für 115200 Baud brauchst du einen Arduino Uno mit Quarz, die meisten Board haben aber nur einen Keramik Resonator, die sind dafür nur mit Glück präzise genug.

ISP Sketch ist installiert, das ist das Einzige was funktioniert, sonst läuft nix...Reset Eingang ist verbunden - ich habe jetzt 10uF, 47uF und 100uF durch, bei allen das gleiche Ergebnis: Using Port : COM3 Using Programmer : stk500v1 Overriding Baud Rate : 19200 AVR Part : ATmega328P Chip Erase delay : 9000 us PAGEL : PD7 BS2 : PC2 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 :

1
                              Block Poll               Page                       Polled
2
       Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
3
       ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
4
       eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
5
       flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
6
       lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
7
       hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
8
       efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
9
       lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
10
       calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
11
       signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
12

13
     Programmer Type : STK500
14
     Description     : Atmel STK500 Version 1.x firmware
15
     Hardware Version: 2
16
     Firmware Version: 1.18
17
     Topcard         : Unknown
18
     Vtarget         : 0.0 V
19
     Varef           : 0.0 V
20
     Oscillator      : Off
21
     SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x000000 (retrying)

Reading | ################################################## | 100% 0.03s

avrdude: Device signature = 0x000000 (retrying)

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x000000 avrdude: Yikes! Invalid device signature. Double check connections and try again, or use -F to override this check.

avrdude done. Thank you.

Chip-Löschung fehlgeschlagen: Hochladefehler: exit status 1

Kann ich am uC Kontrollieren ob der überhaupt funktioniert? Spannungen liegen an, aber das muss ja nix heißen. Habe mal gehört, dass der an einem Pin ein Taktsignal ausgeben soll, sobald der mit Spannung versorgt wird.

Gast #7796139
Lesenswert?

Mike L. schrieb:

Habe mal gehört, dass der an einem Pin ein Taktsignal ausgeben soll, sobald der mit Spannung versorgt wird.

Nein, dazu müsste man ihn erst programmieren. Zur ersten Kontrolle liest man die Device ID via ISP aus.

Vielleicht kaufst du dir besser einen fertigen ISP Adapter, dann hast du nicht zwei Probleme gleichzeitig. Aber kaufe einen der 3,3V unterstützt, bzw welche Spannung du brauchst.

Die billigen USBASP Sticks haben fast alle den Fehler, dass sie zwar einen 3,3V Regler enthalten, aber die Signale haben trotzdem 5V.

#7796163
Lesenswert?

Es ist länger her, hat aber meist problemlos funktioniert

Ich habe mit einem UNO als ISP nackte Chips incl. Bootloader gefläsht - hierzu vor dem Flashen die Shift-Taste drücken?

Probleme mit 3,3V / 5V und 8 / 16 MHz sind ausgeschlossen?

Hier eine gute ANleitung:

https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP/

Sind die 328P neu? Nicht das die evtl. auf externen Oszillator umgestellt wurden? - hierfür gibt es dann auch einen speziellen ISP-Sketch der den Takt zur Verfügung stellt

#7796186
Lesenswert?

Hmm, soooo schlecht ist doch der Arduino als Programmer gar nicht. Bei mir hier läuft ein STK500V2 seit Jahren problemlos.

So, ich gehe schlicht davon aus, dass der TO das Beispielsketch von Arduino auf den UNO geladen hat. Dieser Sketch macht dann aus dem UNO einen

  • AVRISP - Programmer
  • mit 19200 Bd

Um jetzt mit dem UNO einen Chip zu flashen muß man das dem AVRDUDE sagen, dass der Programmer nun nicht mehr Arduino(bootloader) heißt, sondern eben avrisp.

Verbindung Arduino zum zu flashenden ATmega328p

Also:

1
Arduino-Anschluss        |   ATmega328p (28pol)
2
------------------------------------------------
3
Arduino 13 (PB5 - SCK)  =>   Pin 19 (PB5 - SCK)
4
Arduino 12 (PB4 - Miso) =>   Pin 18 (PB4 - Miso)
5
Arduino 11 (PB3 - Mosi) =>   Pin 17 (PB3 - Mosi)
6
Arduino 10 (PB2)        =>   Pin 1  (reset)
7

8
An Pin 1 einen Widerstand 10kOhm nach +Vcc schalten
9
(Pop-Up Widerstand)

Aufruf von avrdude in der Kommandozeile dann:

avrdude -c avrisp -p atmega328p -P COM3 -b 19200 -B5

Danach sollte AVRDUDE das angeschlossene Target melden (oder im Falle von AVRDUDE Version 8.0 beendet AVRDUDE sich selbst ohne eine weitere Meldung)

OP #7796425
Lesenswert?

Ralph S. schrieb:

Um jetzt mit dem UNO einen Chip zu flashen muß man das dem AVRDUDE sagen, dass der Programmer nun nicht mehr Arduino(bootloader) heißt, sondern eben avrisp.

Danke für den Tipp, so kann es natürlich nicht funktionieren, wenn ich das nicht ändere.

Beim ersten ATMEGA328P habe ich dennoch avrdude: Device signature = 0x000000 erhalten.

Ich habe dann einen neuen eingelötet und nun erhalte ich:

avrdude: Device signature = 0x1e950f (probably m328p) avrdude: safemode: lfuse reads as 62 avrdude: safemode: hfuse reads as D9 avrdude: safemode: efuse reads as FF

avrdude: safemode: lfuse reads as 62 avrdude: safemode: hfuse reads as D9 avrdude: safemode: efuse reads as FF avrdude: safemode: Fuses OK (E:FF, H:D9, L:62)

Scheint also zu funktionieren. Wie geht es jetzt weiter? Ich würde mir ungerne durch rumprobieren den zweiten auch zerschießen...

Moderator Persönliche Seite #7796444
Lesenswert?

Mike L. schrieb:

Ich würde mir ungerne durch rumprobieren den zweiten auch zerschießen...

Zerschossen ist der vermutlich nicht, du wirst nur durch das Aktivieren des Bootloaders irgendwie nicht mehr die gewünschte Firmware drauf haben oder sowas. Flash die doch mal neu.

"safemode"? Long since gone. Du könntest ja ruhig mal eine neuere AVRDUDE-Version benutzen. Nicht dein eigentliches Problem, schon klar, aber es sind auch Bugs gefixt worden …

OP #7796448
Lesenswert?

Jörg W. schrieb:

"safemode"? Long since gone. Du könntest ja ruhig mal eine neuere AVRDUDE-Version benutzen. Nicht dein eigentliches Problem, schon klar, aber es sind auch Bugs gefixt worden …

Welche ist denn die aktuelle? Ich habe bisher 6.4. als aktuellste gefunden.

Ich habe mir testweise folgendes auf den uC geladen, um die Funktion der WS2812B-B/T zu kontrollieren:

1
#include <Adafruit_NeoPixel.h>
2

3
#define PIN 30          // Pin für die WS2812B
4
#define NUMPIXELS 9     // Anzahl der LEDs
5

6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
7

8
void setup() {
9
  strip.begin();
10
  strip.setPixelColor(0, strip.Color(255, 0, 0));  // Setze die erste LED auf Rot
11
  strip.show();  // Anwenden der Änderungen
12
}
13

14
void loop() {
15
  // Nichts weiter machen
16
}

Data-Pin und Pixel sind angepasst, Übertragung läuft ohne Fehlermeldung. Allerdings leuchten die LEDs nicht.

Versorgungsspannung (5V) liegt an den LED an, 3,3V am uC. Auf der Datenleitung ist mit dem Oszi nichts erkennbar, daher vermute ich mal, dass der uC noch nicht richtig läuft.

#7796461
Lesenswert?

Mike L. schrieb:

Scheint also zu funktionieren. Wie geht es jetzt weiter? Ich würde mir ungerne durch rumprobieren den zweiten auch zerschießen..

In der Arduino IDE mit der Maus auf "hochladen" - dann die Shifttaste drücken

Der Text ändert sich von "hochladen" zu "hochladen mit Programmer"

Der vermeintlich defekte ist vermutlich nicht defekt sondern steht auf 8 / 16MHz oder auf externer Oszilator

Ich würde statt der WS2812 über die serielle Schnittstelle schauen was passiert - gibt genügend Programme wo hier was ausgeben

Moderator Persönliche Seite #7796501
Lesenswert?

Mike L. schrieb:

Welche ist denn die aktuelle? Ich habe bisher 6.4. als aktuellste gefunden.

Dann hast du einiges verpasst, inzwischen sind wir bei 8.0, und da gibt's sogar eine GUI mit dabei. Die würde ich noch ein wenig als experimentell bezeichnen, sollte aber grundsätzlich funktionsfähig sein – im Gegensatz zu all den anderen GUIs versucht sie nicht, irgendwie das Kommandozeilentool zu interpretieren, sondern sie setzt darunter direkt auf der libavrdude auf.

#7796543
Lesenswert?

Jörg W. schrieb:

im Gegensatz zu all den anderen GUIs versucht sie nicht, irgendwie das Kommandozeilentool zu interpretieren, sondern sie setzt darunter direkt auf der libavrdude auf.

Bei AVRDUDESS gefiel mir, dass die Kommandozeile für AVRDUDE mit angegeben wird. Dann brauche ich nur schnell probieren für den richtigen Parameter, wenn es mal klemmt beim manuellen Aufruf von AVRDUDE :)

Wenn das bei dem neuen GUI auch so ist, wäre das natürlich toll.

Ich nutze AVRDUDE in makefiles und die GUI halt wenn ich gerade keinen makefile habe und keinen schreiben möchte.

Gegen die Lib spricht hingegen nichts. Allerdings die Trennung von GUI und Programmer-Funktion ist schon gut. Gerade unter Linux arbeiten ja viele Tools mit GUI so.

OP #7796594
Lesenswert?

Arduino F. schrieb:

Mike L. schrieb:

#define PIN 30 // Pin für die WS2812B

Watt is datt? Da wird ein Arduino Pin erwartet! 30 gibts beim m328p nicht.

Also darfst du auch keine Funktionalität erwarten.

Hast recht, wäre der PD0, also Pin 0.

Was ich nicht verstehe ist, wenn ich eine -v Abfrage mache, erhalte ich: AVR device initialized and ready to accept instructions Device signature = 1E 95 0F (ATmega328P, ATA6614Q, LGT8F328P)

Möchte ich ein Sketch hochladen kommt: AVR device initialized and ready to accept instructions Device signature = 00 00 00 (retrying) Device signature = 00 00 00 (retrying) Device signature = 00 00 00 Error: invalid device signature Error: expected signature for ATmega328P is 1E 95 0F

  • double check connections and try again, or use -F to carry on regardless
(Firma: Gast) #7796604
Lesenswert?

Mike L. schrieb:

Was ich nicht verstehe ist, wenn ich eine -v Abfrage mache, erhalte ich: AVR device initialized and ready to accept instructions Device signature = 1E 95 0F (ATmega328P, ATA6614Q, LGT8F328P)

Möchte ich ein Sketch hochladen kommt: AVR device initialized and ready to accept instructions Device signature = 00 00 00 (retrying) Device signature = 00 00 00 (retrying) Device signature = 00 00 00 Error: invalid device signature Error: expected signature for ATmega328P is 1E 95 0F

  • double check connections and try again, or use -F to carry on regardless

Ohne konkrete Kommandozeile ist das eine Null Aussage.

Beitrag #7796605 wurde von einem Moderator gelöscht.
#7796611
Lesenswert?

Mike L. schrieb:

Ich habe mir testweise folgendes auf den uC geladen, um die Funktion der WS2812B-B/T zu kontrollieren:

Grundsätzlich:

Der ATmega328p ist nicht wirklich eine schnelle MCU. Um mit diesem WS2812 Leuchtdioden zu betreiben sind unterschiedliche Autoren für die Arduino-Libs den Weg über Assembler gegangen um die noch ansteuern zu können.

Das ganze Arduino Framework in Verbindung mit AVR Controllern baut darauf auf, dass die Controller mit 16 MHz betrieben werden.

Mike L. schrieb:

Ich habe einen neuen ATMEGA328P auf Platine mit ISP und ohne externen Quarz.

Ohne externen Quarz ist die maximale Frequenz die mit einem Mega328 machbar ist eben nur 8 MHz (und ich glaube - ich weiß es nicht gaaaanz genau - dass das für den Betrieb mit WS2812 Leuchtdioden nicht schnell genug ist).

Zudem:

Wenn das ein fabrikneuer Mega328 ist und du die Fuses bisher in Ruhe gelassen hast, dann läuft der im Moment mit 1 MHz und internem Takt => das ist definitiv zu langsam für den Betrieb mit WS2812.

Wie man die Fuses einstellt kannst du hier abfragen:

https://www.engbedded.com/fusecalc/

Dort wählst du deinen ATmega328p aus. Hier ist jedoch absolute Vorsicht geboten, weil du mit falschen Einstellungen bei den Fuses du dir den Zugang zum Controller sperren kannst und du den Controller nur mit einem "Hochvolt-Programmer" wieder in den ISP-Modus bekommst. Namentlich darfst du die Fuses mit der Bezeichnung:

  • RSTDISBL
  • SPIEN

nicht verändern. Tust du das, wirst du dich wie oben beschrieben aussperren!

Zusätzlich, wenn du den Controller ohne Quarz verwenden willst, darfst du bei der Taktquelle für CKSEL0 bis CKSEL3 keine Einstellung machen, die einen externen Taktgeber oder Quarz erfordert! (und du dich dann ebenfalls aussperrst)

Die Einstellungen der Fuses für 8Mhz interner Takt für den Mega328 sind (je nach Startup-Time) bspw.:

-U lfuse:w:0xd2:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m

Diese Einstellung setzt den 328er auf 6CK/14CK +4.1ms nach einem Spannungsanlegen oder Reset.

Aufruf von AVRDUDE in der Kommandozeile ist dann:

avrdude -c avrisp -p com3 -P atmega328p -B 10 -b 19200 -U lfuse:w:0xd2:m -U hfuse:w:0xd9:m -U efuse:w:0xff:m

Danach läuft dein 328er eben mit 8Mhz. Allerdings bezweifle ich, dass das ausreichend für WS2812 ist (abgesehen davon dass die Libraries -wie oben gesagt- von Arduino für 16MHz ausgelegt ist und ganz speziell bei WS2812 das Timing der LED's durch Zählen der Dauer von Prozessortakten in Assembler ist).

Sei also eher gnädig - wenn du mit Arduino spielen willst - und spendiere deinem ATmega einen Quarz und 2 Lastkondensatoren (27pF wären hier gut).

OP #7796615
Lesenswert?

Arduino F. schrieb:

Ohne konkrete Kommandozeile ist das eine Null Aussage.

1
C:\Users\Dell 7200\Downloads>avrdude -c arduino -p m328p -P COM4 -b 19200 -v -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h
2
Avrdude version 8.0
3
Copyright see https://github.com/avrdudes/avrdude/blob/main/AUTHORS
4

5
System wide configuration file is C:\Users\Dell 7200\Downloads\avrdude.conf
6

7
Using port            : COM4
8
Using programmer      : arduino
9
Setting baud rate     : 19200
10
AVR part              : ATmega328P
11
Programming modes     : SPM, ISP, HVPP, debugWIRE
12
Programmer type       : Arduino
13
Description           : Arduino bootloader using STK500 v1 protocol
14
HW Version            : 2
15
FW Version            : 1.18
16
Topcard               : Unknown
17

18
AVR device initialized and ready to accept instructions
19
Device signature = 1E 95 0F (ATmega328P, ATA6614Q, LGT8F328P)
20

21
Processing -U lfuse:r:-:h
22
Reading lfuse memory ...
23
Writing 1 byte to output file <stdout>
24
0xe2
25

26
Processing -U hfuse:r:-:h
27
Reading hfuse memory ...
28
Writing 1 byte to output file <stdout>
29
0xda
30

31
Processing -U efuse:r:-:h
32
Reading efuse memory ...
33
Writing 1 byte to output file <stdout>
34
0xfd
35

36
Avrdude done.  Thank you.

Scheint zu funktionieren.

Beim übertragen der .hex Datei dann:

1
C:\Users\Dell 7200\Downloads>avrdude -c avrisp -p m328p -P COM4 -b 19200 -U flash:w:simple.ino.hex:i
2
Reading 2426 bytes for flash from input file simple.ino.hex
3
Writing 2426 bytes to flash
4
Writing | ################################################## | 100% 2.36 s
5
Reading | ################################################## | 100% 1.64 s
6
Warning: flash verification mismatch
7
  device 0x00 != input 0x0c at addr 0x0000 (error)
8
Error: flash verification mismatch
9

10
Avrdude done.  Thank you.

Manchmal funktoniert es aber auch, siehe:

1
C:\Users\Dell 7200\Downloads>avrdude -c avrisp -p m328p -P COM4 -b 19200 -U flash:w:simple.ino.hex:i
2
Reading 2426 bytes for flash from input file simple.ino.hex
3
Writing 2426 bytes to flash
4
Writing | ################################################## | 100% 2.35 s
5
Reading | ################################################## | 100% 1.65 s
6
2426 bytes of flash verified
7

8
Avrdude done.  Thank you.

Die WS2812 leuchten mitlerweile auch, allerdings nicht wirklich nach dem Programm...ich habe eher das Gefühl, dass der PD0 noch auf Kommunikation konfiguriert ist und nicht als DO.

#7796621
Lesenswert?

Mike L. schrieb:

Processing -U lfuse:r:-:h Reading lfuse memory ... Writing 1 byte to output file <stdout> 0xe2 Processing -U hfuse:r:-:h Reading hfuse memory ... Writing 1 byte to output file <stdout> 0xda Processing -U efuse:r:-:h Reading efuse memory ... Writing 1 byte to output file <stdout> 0xfd

Diese Einstellung ist schon mal für 8MHz interner Takt. Wenn das Flashen nicht immer funktioniert liegt das entweder an deiner Kabelverbindung oder aber der ISP-Takt ist zu schnell. Den kannst du heruntersetzen indem du ein -B 5 in der Parameterliste von AVRDUDE hinzufügst.

Mike L. schrieb:

Die WS2812 leuchten mitlerweile auch, allerdings nicht wirklich nach dem Programm...ich habe eher das Gefühl, dass der PD0 noch auf Kommunikation konfiguriert ist und nicht als DO.

Dein Mikrocontroller fühlt mit dir ... (und macht trotzdem nicht das, was du willst!)

Wie gesagt, die Arduino-Lib ist für 16MHz ausgelegt und dann funktioniert das ganze nicht so wirklich !

#7796623
Lesenswert?

Außerdem seh ich gerade:

Mike L. schrieb:

C:\Users\Dell 7200\Downloads>avrdude -c arduino -p m328p -P COM4 -b 19200 -v -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h Avrdude version 8.0 Copyright see https://github.com/avrdudes/avrdude/blob/main/AUTHORS System wide configuration file is C:\Users\Dell 7200\Downloads\avrdude.conf Using port : COM4 Using programmer : arduino Setting baud rate : 19200 AVR part : ATmega328P Programming modes : SPM, ISP, HVPP, debugWIRE Programmer type : Arduino Description : Arduino bootloader using STK500 v1 protocol HW Version : 2 FW Version : 1.18 Topcard : Unknown

Du verwendest jetzt als Programmer wieder einen Bootloader????? Hast du deinem Mega328 einen 19200 Bd Bootloader geflasht und programmierst den Chip jetzt nicht mehr über avrisp (Firmware des UNO's als "Chefe") sondern direkt über eine serielle Schnittstelle ?

OP #7796631
Lesenswert?

Ralph S. schrieb:

Du verwendest jetzt als Programmer wieder einen Bootloader????? Hast du deinem Mega328 einen 19200 Bd Bootloader geflasht und programmierst den Chip jetzt nicht mehr über avrisp (Firmware des UNO's als "Chefe") sondern direkt über eine serielle Schnittstelle ?

Ne nicht gewollt, ich übernehme das aus versehen manchmal.

Dennoch bleibt mein Hauptproblem, dass ich nicht verstehe, warum die Übertragung über ISP eine Zeit lang funktioniert und dann wieder nicht - ich glaube ich warte echt bis morgen der ISP Programmer ankommt.

Einen Bottloader brauche ich nicht, da das Programm eh nur ein mal drauf kommt und da nixmehr verändert werden soll.

Aktuell ist wieder nixmehr...

1
C:\Users\Dell 7200\Downloads>avrdude -c avrisp -p m328p -P COM4 -b 19200 -v
2
Avrdude version 8.0
3
Copyright see https://github.com/avrdudes/avrdude/blob/main/AUTHORS
4

5
System wide configuration file is C:\Users\Dell 7200\Downloads\avrdude.conf
6

7
Using port            : COM4
8
Using programmer      : avrisp
9
Setting baud rate     : 19200
10
AVR part              : ATmega328P
11
Programming modes     : SPM, ISP, HVPP, debugWIRE
12
Programmer type       : STK500
13
Description           : Serial Atmel AVR ISP using STK500
14
HW Version            : 2
15
FW Version            : 1.18
16
Topcard               : Unknown
17
SCK period            : 0.0 us
18
XTAL frequency        : 7.372800 MHz
19

20
AVR device initialized and ready to accept instructions
21
Device signature = 00 00 00 (retrying)
22
Device signature = 00 00 00 (retrying)
23
Device signature = 00 00 00
24
Error: invalid device signature
25
Error: expected signature for ATmega328P is 1E 95 0F
26
  - double check connections and try again, or use -F to carry on regardless
27

28
Avrdude done.  Thank you.

Das kam jetzt nachdem ich die Fuses wie von dir beschrieben ändern wollte - sobald ich dran gehe, übernimmt der das ein Mal und dann ist nixmehr....vielleicht habe ich ja auch aus Versehen die Fuses vom UNO geändert...

OP #7796650
Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:

Was ist mit der Spannung? Auf die Frage bist du nicht eingegangen.

Laut Schaltplan läuft dein Board mit 3,3V aber der Arduino0 Uno hat 5V Pegel.

Ja, das stimmt - nicht optimal, da gab es verschiedene Meinungen zu...bei manchen hat es funktioniert (die Eingänge können das wohl ab), bei anderen nicht. Den Programmer der die Tage kommt, kann 3,3V und 5V, dann sollte das Thema erledigt sein.

Ich kann ja aktuell garnix einschätzen, da zu viele Baustellen.

Gast #7796653
Lesenswert?

Wenn du deinem 3,3V Mikrocontroller gewaltsam 5V rein drückst, wird seine Stromversorgung instabil. Mich wundert nicht, dass einer schon nicht mehr ansprechbar ist.

Was man auch bedenken sollte: Die ESD Schutzdioden (die in dem Fall wirksam werden) sollen laut einer Application Note von Atmel nur mit weniger als 1 mA belastet werden. Dein Arduino Uno liefert aber mehr als das 20 Fache!

Spannungsteiler könnten helfen.

OP #7796732
Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:

Spannungsteiler könnten helfen.

Kurioserweise gibt der UNO laut Oszi und Multimeter auf den Pins 11 und 12 (MISO, MOSI) nur ca. 2,7V im Maximum aus. Beim Multimeter hätte ich jedacht naja, nicht schnell genug...

Spannungsteiler mit ca. 3MOhm und 6MOhm brachte auch nix - da bin ich mir aber unsicher, ob die nicht zu groß waren.

Wie dem auch sei, andere Ardunios kann ich mit dem UNO als ISP und dem Tipp von Arduino F ansprechen.

Bei meinen beiden erhalte ich nur:

1
C:\Users\Dell 7200\Downloads>avrdude -c arduino_as_isp -P COM3 -b 19200 -p m328p -v
2
Avrdude version 8.0
3
Copyright see https://github.com/avrdudes/avrdude/blob/main/AUTHORS
4

5
System wide configuration file is C:\Users\Dell 7200\Downloads\avrdude.conf
6

7
Using port            : COM3
8
Using programmer      : arduino_as_isp
9
Programmer baud rate  : 19200
10
AVR part              : ATmega328P
11
Programming modes     : SPM, ISP, HVPP, debugWIRE
12
Programmer type       : STK500
13
Description           : AVR as programmer with Arduino-as-ISP FW
14
HW Version            : 2
15
FW Version            : 1.18
16
Topcard               : Unknown
17
SCK period            : 0.0 us
18
XTAL frequency        : 7.372800 MHz
19

20
AVR device initialized and ready to accept instructions
21
Device signature = 00 00 00 (retrying)
22
Device signature = 00 00 00 (retrying)
23
Device signature = 00 00 00
24
Error: invalid device signature
25
Error: expected signature for ATmega328P is 1E 95 0F
26
  - double check connections and try again, or use -F to carry on regardless
27

28
Avrdude done.  Thank you.

Das anlegen von einem 8MHz Signal am TOSC2 bringt keinen Unterschied (falls ich aus Versehen Fuses verstellt habe).

Mal sehen ob es mit dem richtigen ISP mit 3,3V anders aussieht, aber ich glaube ich bestelle mir schonmal ein paar neue...

Gast #7796859
Lesenswert?

Mike L. schrieb:

Kurioserweise gibt der UNO laut Oszi und Multimeter auf den Pins 11 und 12 (MISO, MOSI) nur ca. 2,7V im Maximum aus.

Das ist in der Tat kurios, deutet auf eine fehlerhafte Stromversorgung hin. Damit sind alle mögliche Fehlfunktionen denkbar. Alleine der USB-UART Chip braucht schon ungefähr 5V. Der AVR kommt mit weniger aus, aber stabil sollte die Spannung schon sein. Das ist sie vermutlich nicht, denn du hast schließlich kein 2,7V Netzteil verwendet (oder?). Instabile Stromversorgung kann durchaus auch dazu führen, dass Fuses falsch gesetzt werden.

Vermutung: Dein Arduino Board ist kaputt, es hat gar keine eigene Spannungsversorgung mehr. Stattdessen wird es parasitär über die USB Signale oder die ISP Signale deines Targets versorgt. Beide haben 3,3V Pegel. Diese fließen durch die ESD Schutzdioden (vom USB-Chip oder AVR auf dem Uno Board) nach VDD. An den Dioden fallen 0,6V ab, bleiben noch 2,7V übrig.

So sind die ESD Schutzdioden im AVR geschaltet:

1
                 +--|>|------- VDD (soll 5V, ist 2,7V)
2
                 |
3
3,3V Signal -----+------------ Port vom µC
4
                 |
5
                 +--|<|------- GND

Spannungsteiler mit ca. 3MOhm und 6MOhm brachte auch nix

Das muss viel niederohmiger sein. Zum Beispiel 220 und 470 Ohm an den drei Signalen vom Uno zum Target. MISO (vom Target zum Uno) darf keinen Spannungsteiler haben, war schon klar, oder?

1
       220Ω
2
5V ---[===]---+---------- 3,4V
3
              |
4
             |~|
5
             |_|  470Ω
6
              |
7
             GND

Zeige mal Fotos vom Aufbau. Messe die Versorgungsspannung (5V) des Arduino Boardes ohne Target. Schließe das Target an und messe die Versorgungsspannung erneut, dieses mal vom Uno und vom Target.

Wenn du ein Oszilloskop hast, messe beide Versorgungsspannungen vor und während des Programmiervorgangs, und zeige uns die Bilder.

OP #7798800
Lesenswert?

Neue ATMEGA328P eingelötet und es läuft. Was es war kann ich nicht sagen -ab Werk defekt?, 3,3V/5V Problematik (obwohl es aktuell so auch funktioniert), im Reflow zu heiß geworden?...

Die WS2812 lassen sich für meinen Fall mit 8MHz gut ansteuern - für Videobilder o.ä. kanns wohl aber zu langsam sein - in der neuen Platine plane ich zumindest einen Quarz ein und dann kann man nachträglich immernoch hochrüsten falls nötig.

Hab zwar noch ein Problem mit dem I2C aber dafür gibts einen neuen Thread.

Frohes Fest euch.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren