Inbetriebnahme Atmega324P-20AU - Bootloader brennen

Hallo

Ich habe ein Projekt zusammengebastelt, das von einem Atmega324P-20AU gesteuert werden soll. Bevor ich alle Teile gekauft und zusammengelötet habe, suchte ich natürlich nach Möglichkeiten, später einen Bootlader darauf zu brennen und das ganze Teil in Betrieb zu nehmen, doch natürlich funktioniert es nicht…

Für das Programmieren benutze ich die Arduino IDE auf einem Mac und ein Arduino UNO Board als Programmer.

Auf meiner Suche nach Bootloadern und so bin ich bei Alternate CORE files for Arduino fündig geworden. Die dort verlinkte Zip Datei enthält die Dateien für ein Board von Rugged Circuits, das mit einem Atmega324p bestückt ist. Also hab ich alles benötigte in meine Arduino.app gepackt und versucht, mit meinem Controller zu “reden”.

Wenn ich versuche einen Bootloader zu installieren, erhalte ich folgende Fehlermeldung:
avrdude: verification error, first mismatch at byte 0x0000
0xff != 0x3f

Auf der Suche danach, was das bedeuten solle, habe ich folgendes gefunden:

If you are trying to write something to the chip and you get an error that ends in a similar fasion to:
avrdude.exe: verification error, first mismatch at byte 0x0000
0xff != 0x3f
This means that you will need to click the Erase Chip box before you can write whatever you were writing.

(<— genau meine Fehlermeldung) Doch wie kann man in der Arduino IDE den Chip löschen? Wahrscheinlich gar nicht.

Das Hochladen eines Sketches funktioniert ohne Fehlermeldung, allerdings passiert auf dem Board nichts.

Hat jemand von euch einen Rat? Ich bin sicher nicht der einzige, der diesen coolen Chip benützen will und keine Ahnung hat von AVR Dude und zusätzlichen Programmierteilen :slight_smile:

Gruss

Hitsuji

Hat jemand von euch einen Rat? Ich bin sicher nicht der einzige, der diesen coolen Chip benützen will und keine Ahnung hat von AVR Dude und zusätzlichen Programmierteilen

Du brauchst keinen Leidensgenossen der in der gleichen Situation steckt sondern jemanden der weiß wie tun. :wink: :wink: :wink:
Mir scheint die genannte Version nicht für den ATmega324 kompatibel zu sein. Dieser wird nirgens genannt.

Grüße Uwe

uwefed:
Du brauchst keinen Leidensgenossen der in der gleichen Situation steckt sondern jemanden der weiß wie tun. :wink: :wink: :wink:

Da hast du wohl recht :wink:

uwefed:
Mir scheint die genannte Version nicht für den ATmega324 kompatibel zu sein. Dieser wird nirgens genannt.

Teil des Pakets ist das Gator+ Board von Rugged Circuits (http://www.ruggedcircuits.com/html/mb324p.html) das eben mit einem solchen Atmega324p bestückt ist. In der boards.txt sieht der Eintrag folgendermassen aus:

arduino_gator.name=Arduino-Rugged Circuits Gator Board

arduino_gator.upload.protocol=stk500v1
arduino_gator.upload.maximum_size=30720
arduino_gator.upload.speed=38400

arduino_gator.bootloader.low_fuses=0xF7
arduino_gator.bootloader.high_fuses=0xD2
arduino_gator.bootloader.extended_fuses=0x05
arduino_gator.bootloader.path=gator
arduino_gator.bootloader.file=GATORBOOT.hex
arduino_gator.bootloader.unlock_bits=0xFF
arduino_gator.bootloader.lock_bits=0xEF

arduino_gator.build.mcu=atmega324p
arduino_gator.build.f_cpu=20000000L
arduino_gator.build.core=arduino

Die Fuses überprüfe ich jeweils mit dem Programm AVR Fuses, da lassen sich die Fuses eingeben und danach anschauen, was für Einstellungen dies bewirkt - und das sieht korrekt aus. Müsste ich eventuell den Eintrag für das Lock oder Unlock bit ändern? Was hätte das für Auswirkungen?

Gruss und Dank!

Dieser Eintrag müßte für den Uplaud aus dem IDE zuständig sein (bitte bestätigt mir das noch jemand) aber nicht für die Programmierung des Bootloaders. Welchen ISP-Programmierer benutzt Du? Grüße Uwe

Steht oben, er nutzt den Uno

R1der:
Steht oben, er nutzt den Uno

ops

This means that you will need to click the Erase Chip box before you can write whatever you were writing

Soll wohl heissen, dass der flash erst gelöscht werden muss, bevor er beschrieben werden kann. Das ist allerdings der Normalfall.

Die Aduino IDE enthält und verwendet übrigens dafür avrdude ( sicher auch auf ApfelRechnern ) Dort gibt es die Option -D explizit, mit der das Löschen des Flash verhindert werden könnte und die -e Option, mit der der komplette Flash gelöscht wird.

Am einfachsten machst du dich mit avrdude vertraut, indem du a) In der Arduino IDE "Ausführliche Anzeige während Upload" aktivierst und dir ansiehst, was passiert. b) Einfache Kommandos von Hand ausführst:     avrdude -C .\etc\avrdude.conf -P COM4 -p m324p -vvv -U signature:r::m liest z.B. (auf einem Windows-Rechner) nur die Signatur, und zeigt, ob du mit dem Chip überhaupt reden kannst.

Oder ob du

[color=red]    avrdude: stk500_getsync(): not in sync: resp=0x00[/color]

bekommst, wenn gar kein Arduino an der seriellen Schnittstelle hängt. ;)

Den bootloader kannst du auch mit avrdude direkt brennen, wenn du die .hex Datei hast.

avrdude -C .\etc\avrdude.conf -P COM4 -p m324p -vvv -U signature:r::m

Vorsicht !! Kleiner Fehler, großer Ärger. Ich habe gerade diesem Aufruf ohne die Parameter :r::m aufgerufen. Damit habe ich gerade meinen Bootloader gelöscht.

avrdude -p atmega328p -P /dev/ttyUSB0 -c stk500v2 -vv -U signature

avrdude: Version 5.11.1, compiled on Oct 30 2011 at 10:41:10
         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/reinhard/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/ttyUSB0
         Using Programmer              : stk500v2
         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                 :

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

         Programmer Type : STK500V2
         Description     : Atmel STK500 Version 2.x firmware
         Programmer Model: STK500
         Hardware Version: 3
         Firmware Version Master : 2.10
         Topcard         : Unknown
         Vtarget         : 0.0 V
         SCK period      : 3.3 us
         Varef           : 0.0 V
         Oscillator      : Off

avrdude: AVR device initialized and ready to accept instructions

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

avrdude: Device signature = 0x1e950f
avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "signature"
avrdude: error opening signature: No such file or directory
avrdude: input file signature auto detected as invalid format
avrdude: can't open input file signature: No such file or directory
avrdude: read from file 'signature' failed

avrdude: safemode: lfuse reads as FF
avrdude: safemode: hfuse reads as D6
avrdude: safemode: efuse reads as 5
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Danke für die Antworten.

Dazu müsste ich dann aber einen anderen Programmer haben oder? AVR Fuses, das man auch zum Fuses brennen und .hex Dateien hochladen benutzen könnte und das auch auf den avrdude zugreift, erkennt den Arduino UNO nämlich nicht als Programmer. Ausserdem bin ich furchtbar schlecht mit Terminal Anwendungen und hatte nur schon eine ziemlich schwierige Geburt, avrdude zu installieren. Ginge das nicht irgendwie auch über die Arduino IDE und den UNO als Programmer?

Ginge das nicht irgendwie auch über die Arduino IDE und den UNO als Programmer?

Ich denke, davon reden wir hier: avrdude erkennt an einer seriellen Schnittstelle einen Programmer: das ist dein UNO mit dem entsprechenden ArduinoISP Sketch. Der ist mit den SPI-Pins eines anderen Chip ( dein 324p ) verbunden und kann dessen Flash löschen und hoffentlich auch wieder beschreiben: - mit dem hex file für einen bootloader für 324p, damit der danach über die serielle Schnittstelle und die Arduino IDE andere sketche dazulädt. - oder direkt mit einem sketch für den 324p Der kann natürlich auch die fusebits deines m324p lesen und schreiben.

Ok, dann werd ich wohl aufhören müssen, mich wie ein Mädchen gegen das Terminal zu sträuben und mir ein AVR-Dude Tutorial reinziehen :drooling_face: Melde mich dann wieder, wenns entweder (hoffentlich) geklappt hat oder ich wieder stecken bleibe. Auf jeden Fall vielen Dank für die Antworten!

Gruss

Hitsuji

Ok, habs irgendwie tatsächlich hingekriegt, und mit dem folgenden Befehl den Empfohlenen Device Signature Check gemacht:

avrdude -C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega324p -cstk500v1 -P/dev/cu.usbmodem1421 -n -U signature:r::m

Allerdings kommt dann diese Fehlermeldung hier:

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

Werde also mal die Verbindungen durchmessen, ob alles recht verkabelt ist. Dabei kann ich den Controller aber nicht beschädigen, oder? Hab nur ein gewöhnlich popeliges Multimeter, das piepst, wenn die Messstecker verbunden werden...

ok. Verbindungen durchgemessen. kommt alles auf den richtigen Pins an. :( heisst das der Controler ist kaputt? Wie könnte das geschehen sein? Zu heiss hat er sicher nicht gehabt.

auch wenn ich mir immer wieder selber antworte: hab noch was gefunden. werde das morgen ausprobieren. jetzt ist erstmal zeit für ein bier!

  1. Here is another MAJOR step. This shouldn't really be a problem with a low power chip such as the AtTiny or anything with a power requirement below 2 to 3 volts, HOWEVER what I have found that people are doing (including me. I am not out of this loop) is that they are trying to feed the power off of the 5v of the Arduino board to power the chip that they are programming. THIS WILL NOT WORK! I don't know how much power it is actually feeding to the chip from that 5v output, but it can't be enough for a chip (like the Atmega32) that requires at least 4.5v which funny enough, I am using the Atmega32L which only requires 2.7v because what fixed all the problems I had with the device signature being wrong and random signatures, is to just go out, buy the 5v regulator and two 10uF capacitors to use it with, and make a power pack out of 4x AA batteries or a 9v and snap. After that it showed up fine without ANY issues whatsoever. It wont add much to your project (batteries are more expensive than anything. I bought the 5v regulator and the two capacitors yesterday from Radio Shack for > $4.00. You will need it anyway for your project so just go get it. I can't stress this one enough because this was my problem all along and I am a newb. Heck even some advanced strict avr (non arduino) folks have struggled with this.

aus diesem Thread: http://forum.arduino.cc/index.php?topic=51819.0

Na, das wird es kaum sein, fürchte ich. Den Ziel - 324p Chip solltest du schon mit den 5V des Programmier-Uno betreiben können, die wiederum aus der USB-Versorgung des Uno kommen,

... wenn du ihn denn richtig angeschlossen hast ...

war nicht die Lösung :(

Wollte aber nicht ganz ohne Hoffnung ins Bett gehen gestern... Andere Erklärungen? Oder ist das Teil kaputt? Wäre ziemlich aufwändig, den auszutauschen und die Gefahr gross, dass ein Pad abreisst :/

Wie sagt avrdude so schön:

Double check connections and try again

Hast du irgendeinen anderen atmega, den du als Vergleich nehmen könntest ? Stimmt -cstk500v1 für deinen Uno als Programmer ? Hat Nick Gammon nicht einen alternativen ArduinoISP sketch ?

ok Leute. Teilerfolg! Irgendwie schräg, aber urteilt selbst:

Hab nochmals etwas an den Pins rumgelötet, denke aber nicht, dass ich da gross was verändert hab. Jedenfalls häng ich das Ding dann nochmals an und will gerade einen erneuten Uploadversuch starten, als ich bemerke, dass der Kondensator am UNO statt von Reset zu GND von 3.3V zu GND geht. Also eins verrutscht irgendwann. facepalm Als ich mit der IDE dann den Bootloader installieren will erscheint die selbe Meldung wie bis anhin. Als ich mit avrdude den signature-check machen will, heisst es, der Programmer sei "not in sync". Wenn ich den Kondensator entferne, erscheint jeweils die Meldung von der falschen Signatur.

Einfach mal so kopierte ich dann den avrdude-Befehl von der Arduino IED ins Terminal und liess so also den avr-dude den Befehl ausführen, den die IDE ausgab, um den Bootloader zu installieren. Es erschien eine ziemlich lange Ausgabe, an dessen Ende sich avrdude bedankte - klingt gut, dachte ich! Beim genaueren Durchschauen der Ausgabe bemerkte ich einerseits, dass irgendwo die Signatur gecheckt wurde und korrekt war, andererseits aber entdeckte ich die selbe Fehlermeldung, wie sie die IDE ausgab. Allerdings brach avrdude an dieser Stelle nicht ab, sondern zog das Ding scheinbar einfach durch!

Stand ist nun, dass ich Sketches über die IDE hochladen kann. Zu Beginn hatte ich etwas Mühe, die richtige Pinbelegung heraus zu finden und versuchte mittels verschiedener Skripte der Sache auf den Grund zu gehen. Bei diesen Versuchen schienen die Geschehnisse auf dem Board ziemlich random, was mir Kummer bereitete :) Allerdings fand ich dann eine Übersicht auf der Rugged Circuits Seite, mit der ich tatsächlich meine 8 Leds durch das Shift-Register ansteuern konnte. Allerdings fiel mir auf, dass das delay von 500 Milisekunden mehrere Sekunden andauerte.

Meine Erklärungsversuche: - Es hat nicht gleich geklappt, weil die IDE zu blöd ist, das so hinzukriegen, wie es sich gehört :) - Device Signature war ungültig (=0), weil der Programmer nicht recht funktionierte, da der Reset nicht richtig deaktiviert war - not in sync Fehler bei avrdude, weil ich den Teil mit der baudrate aus den Kommandos gestrichen hatte für den signaturcheck - avr-dude hats gerichtet weil -> he's the dude! - delay ist viel zu langsam, weil ich was mit den Fuses verkackt habe

Was haltet ihr von den Erklärungsversuchen? und was noch viel wichtiger ist: Wie wären die Fuses für einen externen Kristall mit 20MHz und separaten Kondensatoren korrekt zu setzen? Habe nach Konsultation des Datenblatts folgende Option für gut befunden: -Uefuse:w:0x05:m -Uhfuse:w:0xD2:m -Ulfuse:w:0xF7:m -> Full Swing Oscillator; Start-up time: 16K CK + 65ms; Crystal Osc. slowly rising power.

Gruss

Für die Fuses gibt es Webseiten, die das für dich ausrechnen: http://www.engbedded.com/fusecalc

Wesentlich sicherer als das über das Datenblatt manuell zusammenzufummeln

Hier auch mehr dazu: http://www.mikrocontroller.net/articles/AVR_Fuses#Taktquellen_Fuse_Einstellung

"Full Swing Oscillator" ist da schon mal falsch. Du brauchst "Ext. Crystal Oscillator 8.0- MHz"

Hab versucht die Fuses folgendermassen zu setzen: -Uefuse:w:0x05:m -Uhfuse:w:0xD2:m -Ulfuse:w:0xFF:m leider laufen die Testlichter immer noch ca. 40 mal weniger schnell als sie sollten. Ich bin gar nicht wirklich überzeugt, ob das Verändern der Fuses wirklich geklappt hat, also versuchte ich mal mittels AVR Dude die aktuellen Fuses auszulesen und in eine Datei zu schreiben. Dabei habe ich folgendes erhalten, was ich nicht so wirklich zu interpretieren weiss:

low fuse : :01000000629D :00000001FF

high fuse: :010000009966 :00000001FF

extended fuse: :01000000FF00 :00000001FF

Irgendwie scheint mir das Neusetzen der Fuses nicht ganz zu klappen. Könnte dies mit der Fehlermeldung vom Anfang zusammenhängen? Und was noch viel wichtiger ist: wie kriege ich nun meinen Controller auf meine 20MHz?