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:
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.
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 :
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/
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.
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.
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 :
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.
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.
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
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
Dagegen würde ein "-v" helfen, um mehr zu erzählen.
:-) mache ich ja schon, ich hab nur noch nicht alle meine Scripts umgestellt... und manchmal schaue ich erstaunt: was ist da denn los! Nur um festzustellen: Nix ist los!
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...
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 …
"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:
strip.setPixelColor(0,strip.Color(255,0,0));// Setze die erste LED auf Rot
11
strip.show();// Anwenden der Änderungen
12
}
13
14
voidloop(){
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.
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.
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.
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
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.
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.
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:
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.:
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).
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.
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.
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 !
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 ?
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.
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...
Das ist bei allen (mir bekannten) Arduino IDEs der Fall.
Das weiß ich wohl.
Ich nutze Arduino allerdings, wenn ich sonst keinen Weg sehe oder wenn ich glaube, ein einfacher Test von <platzhalter> geht dmit schnell.
Ich bin da kein Fan von um es mal freundlich auszudrücken.
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.
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!
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.
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.
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.
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.