Neuen atmega 168 zu booten

Hallo Leute,
seit einer Ewigkeit versuche ich einen neuen atmega 168 zu booten. Bisher leider ohne Erfolg.

Meine Ziel:
einen neu gekauften Atmega 168 pa-pu so zu booten, dass ich ihn anschließend problemlos mit dem Arduino Board Diecimila beschrieben kann. Am liebsten wäre mir das betriebssystem mac, windows würde es aber auch tuen.

Folgende Utensilien habe ich dazu zur Verfügung:

- atmega 168 : http://www.reichelt.de/Atmel-ATMega-AVRs/ATMEGA-168P

- Arduino Diecimila: http://arduino.cc/en/Main/ArduinoBoardDiecimila

- my smart usb light: http://shop.myavr.de/index.php?sp=article.sp.php&art

- programmieren möchte ich später mit Arduino : http://arduino.cc/en/Main/Software

So habe ich es bisher gemacht (funktioniert nicht):

  1. low 0xe7; high 0xdf; ext 0x00; lock 0x2f;
  2. passendes hex file für den flash
  3. upload drücken --> my smart usb erkennt danach den neuen atmega 168 nicht mehr!

Folgende Fragen:

  1. welche fuses muss ich einstellen? ( low, high, extended, lock)
  2. welche Flash Datei muss ich aufspielen?
  3. Was mache ich falsch, bzw. wie macht ihr es richtig? Wenn ich dazu einen neuen isp programmer kaufen muss, soll mir das recht sein.

Vielen lieben Dank für eine Antwort, da ich daran schon seit Tagen dran rum rätsle und einfach nicht weiter komme!

Danke im Voraus!

Hallo,

So habe ich es bisher gemacht (funktioniert nicht):

  1. low 0xe7; high 0xdf; ext 0x00; lock 0x2f;
  2. passendes hex file für den flash
  3. upload drücken --> my smart usb erkennt danach den neuen atmega 168 nicht mehr!

ich würde zum Starten und für einen ersten Check tunlichst die Fuses in Frieden lassen. Sie sind im Auslieferungszustand so programmiert, dass der Controller mit einem intern erzeugten Takt von 1 MHz läuft (8 MHz vom R/C-Oscillator, die wegen der CLKDIV8-Fuse noch auf 1/8 runtergeteilt werden). Also gibt es für einen ersten Funktionstest keinen Grund, an den Fuses irgendetwas zu verändern.

Ich würde so vorgehen:

  • fabrikfrischen ATmega168 nehmen und an den SmartUSB anschließen
  • mit der Programmiersoftware die Signatur des Controllers auslesen. Das muss immer gehen.
  • wenn erfolgreich: Mini-Testprogramm schreiben, assemblieren und den Controller mit der entsprechenden HEX-Datei flashen
  • wenn erfolgreich: Verify durchführen. Dabei wird das geflashte Programm wieder aus dem Controller zurückgelesen und mit der HEX-Datei verglichen.

Wenn das alles funktioniert, sieht’s schonmal gut aus :smile:

Ein geeignetes Testprogramm ist z. B. dieses (ohne Include der Controller-Definitionsdatei, also dies ggf. noch erledigen):

 ldi r16, 0xFF
 out DDRC, r16

 clr r16

Loop:
 ldi ZL, Low (25000)
 ldi ZH, High(25000)
 sbiw ZL, 1
 brne PC-1

 inc r16
 out PORTC, r16

 rjmp Loop

Sein Sinn besteht darin, einfach LEDs am Port C blinken zu lassen. Kopiers in Deine Software, lass den Assembler drüberlaufen, um die HEX-Datei zu bekommen, und flash den Controller damit via SmartUSBlight (oder lass es erstmal im Simulator laufen, um zu verstehen, was das Programm macht). Dann Controller auf den Tisch legen, Spannung 5 V dranklemmen und mit ner LED (eine mit passendem Vorwiderstand natürlich!) checken, ob sie mit den erwarteten Frequenzen flackert/blinkt, wenn Du sie an die Pins von PORT C hälst. Dann weißt Du, dass der ganze Prozess grundsätzlich erfolgreich war und der Controller intakt ist und tut was er soll. Wenn Du dann noch den Code verstehst und voraussagen kannst, wie schnell die LED an welchem Pin blinkt, dann ist es optimal.

Mehr brauchst Du erstmal nicht. Alles andere, z. B. die Fuses so verändern, dass der Controller mit einem externen Quarz läuft, kommt danach. An den Lockbits wirst Du sowieso kaum jemals etwas ändern wollen. Du solltest aber in Deinem eigenen Interesse wissen, was die einzelnen Bits der Fuses genau bewirken. Auch das steht im Datenblatt des Controllers – lesen musst Du es selbst.

seit einer Ewigkeit versuche ich einen neuen atmega 168 zu booten.

Nein, Du willst ihn nicht booten, sondern schlicht zum Laufen bekommen. Der Begriff booten hat eine bestimmte Bedeutung, die hier nicht zutrifft.

Meine Ziel:
einen neu gekauften Atmega 168 pa-pu so zu booten, dass ich
ihn anschließend problemlos mit dem Arduino Board Diecimila
beschrieben kann. Am liebsten wäre mir das betriebssystem mac,
windows würde es aber auch tuen.

Ich würde zuerst das Flashen mit dem SmartUSBlight probieren und mich um alles andere kümmern, wenn das funktioniert hat.

So habe ich es bisher gemacht (funktioniert nicht):

  1. low 0xe7; high 0xdf; ext 0x00; lock 0x2f;

Ich glaub nicht, dass irgendjemand Lust hat, jetzt mit dem Datenblatt herauszufinden, was diese HEX-Werte für Einstellungen bewirken.

  1. passendes hex file für den flash

Welches denn?

  1. upload drücken --> my smart usb erkennt danach den neuen atmega 168 nicht mehr!

Das kann viele Gründe haben, z. B. fehlende Taktversorgung.

Folgende Fragen:

  1. welche fuses muss ich einstellen? ( low, high, extended, lock)

Das ist nicht allgemein zu beantworten. Du kannst da einstellen, worauf immer Du Lust hast. Was sinnvoll ist, hängt ganz von Deiner Anwendung ab.

  1. welche Flash Datei muss ich aufspielen?

Dasselbe wie bei 1. Was willst Du denn mit Deinem Controller machen?

  1. Was mache ich falsch, bzw. wie macht ihr es richtig?

Ich habe ein STK500… :wink:

Wenn ich dazu einen neuen isp programmer kaufen muss, soll mir das recht sein.

Kann mir nicht vorstellen, dass das nötig sein wird.

Viel Erfolg!

Gruß
Martin

noch mal zum Problem:

wenn ich ein Programm mit Arduino schreib, zb. blink etc. , und dieses dann als hex file umwandele und es mit dem my smart usb via my prog Tool auf den fabrikneuen Controller flashe, läuft das Programm fehlerfrei ab.

Ich möchte aber einen Bootloader auf den Controller laden, damit ich direkt von Arduino programmieren kann. Wenn ich den passenden bootloader (/Users/xxx/Desktop/ATmegaBOOT_168_diecimila.hex) flashe, funktioniert auch dass.

Versuche ich nun aber anschließend via Usb und dem Arduino diecimila board das Sketch direkt zu laden kommt die Fehlermeldung " avrdude: stk500_getsync(): not in sync: resp=0x00"

Daher mein Verdacht, dass das diecimila board aufgrund der falschen fuses des Controllers nicht antwortet.

ändere ich aber die l ow fuses auf die " Ext. Crystal Osc.; Frequency 8.0- MHz; Start-up time PWRDWN/RESET 16K CK/ 14CK + 4.1ms;" erkennt my smart USB light den Controller nicht mehr.

Weiß wer wo mein Fehler liegt?

Ich komme bei dem Problem einfach nicht mehr weiter.

Vielen Dank für eure Antworten!

wenn ich ein Programm mit Arduino schreib, zb. blink etc. ,
und dieses dann als hex file umwandele und es mit dem my smart
usb via my prog Tool auf den fabrikneuen Controller flashe,
läuft das Programm fehlerfrei ab.

Das ist ja schonmal gut.

Ich möchte aber einen Bootloader auf den Controller laden,
damit ich direkt von Arduino programmieren kann. Wenn ich den
passenden bootloader
(/Users/xxx/Desktop/ATmegaBOOT_168_diecimila.hex) flashe,
funktioniert auch dass.

OK, es geht um einen Bootloader. Das hättest Du vielleicht gleich in dieser Deutlichkeit sagen sollen.

Daher mein Verdacht, dass das diecimila board aufgrund der
falschen fuses des Controllers nicht antwortet.

Wenn Du einen Bootloader in den Controller flashst, musst Du auf jeden Fall die Fuses BOOTSZ1, BOOTSZ0 und BOOTRST anpassen. Die stehen im „Extended Fuse Byte“. Eine Beschreibung der geeigneten Settings würde ich im Quellcode zur ATmegaBOOT_168_diecimila.hex suchen, oder einfach in der zugehörigen Dokumentation. Steht da kein Hinweis irgendwo?

ändere ich aber die l ow fuses auf die „Ext. Crystal Osc.;
Frequency 8.0- MHz; Start-up time PWRDWN/RESET 16K CK/ 14CK +
4.1ms;“ erkennt my smart USB light den Controller nicht mehr.

Das sollte er aber. Außer natürlich, Du setzt die Fuses auf "Ext. Crystal Osc., vergisst dann aber, auch einen externen Crystal an den Controller anzuschließen (Lastkondensatoren nicht vergessen), denn dann hätte er ja keinen Takt. Während des Programmiervorgangs muss der Controller immer mit einem Takt versorgt sein (und die SPI-Programmierfrequenz darf nicht höher liegen als 1/4 fOSC).

Gruß
Martin

Danke für die schnelle Antwort!

Wenn Du einen Bootloader in den Controller flashst, musst Du
auf jeden Fall die Fuses BOOTSZ1, BOOTSZ0 und BOOTRST
anpassen. Die stehen im „Extended Fuse Byte“. Eine
Beschreibung der geeigneten Settings würde ich im Quellcode
zur ATmegaBOOT_168_diecimila.hex suchen, oder einfach in der
zugehörigen Dokumentation. Steht da kein Hinweis irgendwo?

Meinst du die Dokumentation des Atmega 168 oder des Bords?

Das hier?

diecimila.name=Arduino Diecimila, Duemilanove, or Nano w/ ATmega168

diecimila.upload.protocol=stk500
diecimila.upload.maximum_size=14336
diecimila.upload.speed=19200

diecimila.bootloader.low_fuses=0xff
diecimila.bootloader.high_fuses=0xdd
diecimila.bootloader.extended_fuses=0x00
diecimila.bootloader.path=atmega
diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex
diecimila.bootloader.unlock_bits=0x3F
diecimila.bootloader.lock_bits=0x0F

diecimila.build.mcu=atmega168
diecimila.build.f_cpu=16000000L
diecimila.build.core=arduino
diecimila.bootloader.extended_fuses=0x00

ändere ich aber die low fuses auf die „Ext. Crystal Osc.;
Frequency 8.0- MHz; Start-up time PWRDWN/RESET 16K CK/ 14CK +
4.1ms;“ erkennt my smart USB light den Controller nicht mehr.

Das sollte er aber. Außer natürlich, Du setzt die Fuses auf
"Ext. Crystal Osc., vergisst dann aber, auch einen externen
Crystal an den Controller anzuschließen (Lastkondensatoren
nicht vergessen), denn dann hätte er ja keinen Takt. Während
des Programmiervorgangs muss der Controller immer mit einem
Takt versorgt sein (und die SPI-Programmierfrequenz darf nicht
höher liegen als 1/4 fOSC).

Das ist doch schon im board verbaut oder?
Schema diecimila

Meinst du die Dokumentation des Atmega 168 oder des Bords?

Des Arduino-Boards.

Das hier?

Genau, da stehen ja alle Infos drin. So musst Du die Fuses setzen.

diecimila.bootloader.extended_fuses=0x00

Wenn ich’s dem ATmega16-Datenblatt richtig entnommen habe, ist die werkseitige Einstellung der Extended Fuse 0x01. Du darfst die also nicht so lassen wie sie ist.

Das ist doch schon im board verbaut oder?

Ja. Es ist das, was im Schematic an den beiden XTAL-Pins vom ATmega8 hängt, also Q2 + C2 + C3.

1 Like

leider lässt sich das Problem damit nicht beheben :frowning:

folgendes habe ich jetzt gemacht:

  1. Der neue controler wird von mySmartUsb light erkannt

  2. den passenden boot via flash mit mysmartUsb übertragen (erfolgreiche Meldung)

  3. die fuses laut Arduino Software auf einen neuen controler gesetzt (erfolgreich laut Meldung )

diecimila.bootloader.low_fuses=0xff
diecimila.bootloader.high_fuses=0xdd
diecimila.bootloader.extended_fuses=0x00
diecimila.bootloader.path=atmega
diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex
diecimila.bootloader.unlock_bits=0x3F
diecimila.bootloader.lock_bits=0x0F

  1. nun erkennt may smart usb den controler nicht mehr. In arduino kommt die Fehlermeldung : avrdude:stk500_getsync(): not in sync: resp=0x00

Wenn ich das richtig verstanden habe, meckert Arduino, dass die Software keinen brauchbare Verbindung zum Board herstellen kann.

Da mysmartusb light den controler nicht mehr erkennt, sobald ich die low fuses, sprich den tackt auf einen externen ändere, ist mir der Gedanke gekommen, dass der Quarz auf dem dicimila board defekt seien könnte.

Wäre das neukaufen eines Bordes einen Versuch wert?

leider lässt sich das Problem damit nicht beheben :frowning:

Noch kein Grund, die Hoffnung aufzugeben.

Da mysmartusb light den controler nicht mehr erkennt, sobald
ich die low fuses, sprich den tackt auf einen externen ändere,
ist mir der Gedanke gekommen, dass der Quarz auf dem dicimila
board defekt seien könnte.

OK, das würde ich einfach austesten. Flash einen neuen Controller nur mit einem LED-Blinkprogramm, von dem Du weißt, dass es funktioniert. Kein Bootloader und Finger weglassen von allen Fuses! Der Controller läuft dann mit einem internen Takt von 1 MHz. Rechne die erwartete LED-Blinkfrequenz aus. Steck den µC auf das Arduino-Board und prüf nach, ob die LEDs mit der richtigen Geschwindigkeit blinken.

Dann fust Du den Controller auf Taktquelle „externen Quarz“ um (Achtung: Niemals „external crystal“ mit „external clock“ verwechseln!). Dafür musst Du nur die Low-Fuse ändern. Verwende die Einstellung CKSEL3=1, CKSEL2=1, CKSEL1=1, CKSEL0=1, SUT1=1, SUT0=1 (also alles Einsen) für den low-power crystal oscillator. Alternative Möglichkeit: Dasselbe mit CKSEL3=0 für den full swing crystal oscillator. Ansonsten lässt Du alles wie es ist. Steck den µC wieder auf das Arduino-Board (falls er nicht ohnehin schon da ist) und check mit der LED nach, ob und wie schnell sie blinkt (dabei immer dran denken: Ab etwa 60–70 Hz Blinkfrequenz sieht man kein Blinken mehr, sondern ein Dauerleuchten). Wenn sie blinkt, ist der Quarz auf dem Arduino-Board intakt.

Ist er kaputt, könntest Du Dir z. B. mit einem Timer-IC „NE555“ plus ein bisschen Hühnerfutter eine behelfsmäßige Taktquelle mit f ≈ 200 kHz basteln. Spätestens damit kannst Du mit dem SmartUSB wieder Zugang zu allen Controllern bekommen. Es sei denn Du hast zwei wirklich gefährliche Fuses verstellt, nämlich RSTDISBL und SPIEN. Dann wäre ein Controller mit dem SmartUSB definitiv nicht mehr ansprechbar.

Wäre das neukaufen eines Bordes einen Versuch wert?

Sollte tatsächlich der Quarz defekt sein, würde es reichen, nur den austauschen.

Bin mal gespannt.

1 Like

Da mysmartusb light den controler nicht mehr erkennt, sobald
ich die low fuses, sprich den tackt auf einen externen ändere,
ist mir der Gedanke gekommen, dass der Quarz auf dem dicimila
board defekt seien könnte.

OK, das würde ich einfach austesten. Flash einen neuen
Controller nur mit einem LED-Blinkprogramm, von dem Du weißt,
dass es funktioniert. Kein Bootloader und Finger weglassen von
allen Fuses! Der Controller läuft dann mit einem internen Takt
von 1 MHz. Rechne die erwartete LED-Blinkfrequenz aus. Steck
den µC auf das Arduino-Board und prüf nach, ob die LEDs mit
der richtigen Geschwindigkeit blinken.

das flaschen des neuen controlers hat problemlos funktioniert. Eingestellt war die Blinkfrequenz auf 1s. Auf dem board dann alle 15,9 s.

Dann fust Du den Controller auf Taktquelle „externen Quarz“ um
(Achtung: Niemals „external crystal“ mit „external clock“
verwechseln!). Dafür musst Du nur die Low-Fuse ändern.
Verwende die Einstellung CKSEL3=1, CKSEL2=1, CKSEL1=1,
CKSEL0=1, SUT1=1, SUT0=1 (also alles Einsen) für den low-power
crystal oscillator. Alternative Möglichkeit: Dasselbe mit
CKSEL3=0 für den full swing crystal oscillator. Ansonsten
lässt Du alles wie es ist. Steck den µC wieder auf das
Arduino-Board (falls er nicht ohnehin schon da ist) und check
mit der LED nach, ob und wie schnell sie blinkt (dabei immer
dran denken: Ab etwa 60–70 Hz Blinkfrequenz sieht man kein
Blinken mehr, sondern ein Dauerleuchten). Wenn sie blinkt, ist
der Quarz auf dem Arduino-Board intakt.

nachdem ich die low fuses auf 111111 gesetzt hatte, blinkte gar nichts mehr, auch erkannte my smart usb light den Controller nun nicht mehr.

nachdem ich die low fuses auf 111111 gesetzt hatte, blinkte
gar nichts mehr, auch erkannte my smart usb light den
Controller nun nicht mehr.

Ahaaaaa! Die naheliegendste Erklärung dafür wäre tatsächlich ein Defekt des Quarzes auf dem Arduino-Board. Leider lässt sich nicht so einfach feststellen, ob das Ding wirklich kaputt ist, weil dieser Oszillatorkreis bestehend aus dem Quarz außerhalb des µC und einem invertierenden Verstärker im µC ausgesprochen hochohmig ist. Wenn Du da ne Tastspitze von nem Oszilloskop dranhälst, bedeutet das i. a. schon eine so große Last, dass die Schwingung sofort zum Erliegen kommt.

Hast Du zufällig irgendeinen x MHz-Quarz mit x = irgendwas zwischen 1 und 16 zur Hand, den Du ersatzweise einlöten könntest? Das halte ich für nen Versuch wert. Andere Möglichkeit: Schreib ein Mini-Programm für einen Deiner ATmega16, das nichts weiter tut, als einen Pin mit hoher Frequenz (z. B. 500 kHz oder 1 MHz) zu toggeln. Dann hast Du einen Taktgenerator, mit dem Du einen Deiner auf „external crystal“ gefusten Controller mit einem Takt versorgen kannst – was trotz des eigentlich falschen Fuse-Settings problemlos geht. Das Taktsignal gibst Du auf Pin XTAL1 Deines Patienten und Pin XTAL2 bleibt unbeschaltet. Der Quarz und die Lastkondensatoren müssen natürlich vorher von den XTAL-Pins getrennt werden. Wenn Du die Bauelemente nicht aus dem Arduino-Board auslöten kannst oder willst, kannst Du versuchen, die beiden XTAL-Beinchen so hochzubiegen, dass sie nicht mehr in die Fassung gelangen (aber alle anderen Pins natürlich schon noch).

Lass hören.

1 Like

Vielen Lieben Dank!

Ich hatte noch einige Quarze daliegen, die ich verwenden konnte. Ich habe den Quarz aufgelötet und ausgetauscht. Und siehe da. Alles funktioniert wieder!

War tatsächlich nen defekter Quarz.

Nochmals Danke für die Ausführliche Beschreibung Martin. Du bist der beste!

Ja klasse, freut mich sehr! Ich hoffe, Du kannst den Bootloader jetzt problemlos installieren, einschließlich der Fuse-Geschichte. Sonst weißt Du ja, in welchem Forum Du Hilfe bekommen kannst :smile:

Viel Spaß beim Basteln.

Martin

1 Like