AVR-Programm hochladen

Oct 05, 2003 11 Replies

Hallo



Ich bin Anfänger in Sachen Microcontroller und hab ne Frage:



Ich hab mir bei mikrocontroller.net ein testplatine und einen Atmega8 gekauft. Jetzt möchte ich mit uisp unter Linux ein Programm auf den Controller laden, aber ich hab nirgendwo eine Anleitung zu uisp gefunden. Muß man da nicht zuerst auch irgendwelche Fusebits bearbeiten ? Hat jemand einen Link zu einer Anleitung oder ähnliches ?



Danke im vorraus !


Matthias



Hallo Matthias,

ich kenne mich leider nicht mit uisp aus. Unter Linux habe ich "avrdude" verwendet - sehr vielseitig (Anzahl der µCs bzw. der Interfaces). Da ist auch die Dokumentation sehr gut. Wenn dus ausprobieren möchtest

formatting link

Viel Glück noch! Johannes

uisp --help z.B.?

Jedenfalls: ich vermute mal, Du verwendest den Parallelport-Programmer. Wenn Dein Programmfile dann rom.hex heißt, lautet der richtige Befehl

uisp -dprog=avrisp --upload if=rom.hex

Mit

uisp -dprog=avrisp --verify if=rom.hex

kannst Du überprüfen, ob's geklappt hat. Fuses lesen und anzeigen tut man mit

uisp -dprog=avrisp --rd_fuses

Geschrieben werden die Fuses mit --wr_fuse-l=xx / --wr_fuse_h=xx /

--wr_fuse_e=xx oder --wr_lock=byte. Vom Lockbyte würde ich aber die Finger lassen... Und immer daran denken: 0 heißt Fuse gesetzt, 1 heißt Fuse gelöscht! Insbesondere bei den CKSEL-Fuses aufpassen, vor allem, wenn man keinen ext. Oszillator zur Hand hat!

Vor einem neuen Programmierzyklus muß immer erst gelöscht werden, das funktioniert mit

uisp -dprog=avrisp --erase

Last not least kann man den Inhalt des avr mit

uisp -dprog=avrisp --download of=avr.hex

auslesen.

Eigentlich nicht. Die ATmega haben alle einen internen Oszillator, der ist auch standardmäßig aktiviert. D.h., die Dinger tun sofort, ohne externen Takt.

Sieh Dir evtl. mal PonyProg2000 an, das ist am Anfang vielleicht übersichtlicher zu handhaben. Uisp geht halt schön fix. Noch ein kleines Skript, was das Löschen automatisiert und die Parameter reduziert:

----88-----

Das Skript heißt bei mir progavr und wird mit "progavr rom.hex" aufgerufen.

HTH, Sebastian

Hi

Ich benutze aber einen externen 4 MHz Quartz - da muß ich doch jetzt Fuses setzen oder nicht ?

Ansonsten waren es genau die Infos die ich brauchte, danke !

Gruß Matthias

Schau ich mir mal an, danke !

Gruß Matthias

Stimmt. Fuses machen sich mit PonyProg ganz gut. Aber dran denken: erst auf "read" gehen, damit die aktuellen Einstellungen eingelesen werden! Mit uisp muß man sich die Fuse-Bytes halt manuell zusammenbasteln. Geht auch, ist aber fehleranfälliger. Einen Oszillator für "Notfälle" hast Du zur Hand? Nur mit einem Quarz ist Dein AVR tot, wenn Du ihn versehentlich auf "extenal clock" programmierst (CKSEL: 0000)! Der interne kann 1, 2, 4 und 8 MHz - warum dann einen Quarz für diese Frequenzen benutzen? Reicht Dir 1% Taktgenauigkeit nicht aus? RS-232 funktioniert mit 4MHz extern auch nicht wirklich (wenigstens nicht >= 9600 Baud), da muß ein "krummer" Takt her (7.3728 MHz, vgl. Table 61 im Datenblatt).

Sebastian

Sebastian Voitzsch schrieb: Einen Oszillator für "Notfälle" hast Du zur Hand?

Also ich bin ja nun eher Anfänger und dachte ich nehm für die ersten Versuche die Schaltung die auf diesem Testboard drauf ist. Das Board ist das von shop.microcontroller.net (oder so ähnlich).

Das ist jetzt ein 4 MHz Quartz zwischen Pin 9 und 10 und dann jeweils ein kleiner Keramikkondensator von den beiden Pins nach Masse.

Ist das jetzt nicht gut ? Welche Fuse-Bits muß ich denn nun setzen damit das auch funktioniert ?

Gruß Matthias

Die funktionieren auch mit 1MHz. Das Testboard enthält Quarz und Kondensatoren nur, weil ältere AVRs keinen internen Oszillator enthalten.

Gut? Schlecht? Es besteht halt kein Grund, an den Fuses rumzudaddeln. Aber nun denn:

CKSEL sind die Bits 0-3 des Fuse-L-Bytes. Im Auslieferungszustand des ATmega8 ist das Fuse-L-Byte

11 10 0001 --> 0xE1 BOD SUT CKSEL

BOD bleibt, wie es ist, SUT wird auf 11 geändert, CKSEL auf 1111 (SUT und CKSEL0 zusammen ergeben 65ms Verzögerung nach dem Reset, CKSEL 3-1 legen den Frequenzbereich 3-8MHz fest; Tabellen S. 24ff im Datenblatt):

11 11 1111 --> 0xFF.

Wie immer - keine Gewähr. Und sieh erstmal nach, ob uisp beim Auslesen der Fuses tatsächlich einen Wert von 0xE1 für das L-Byte anzeigt. Giftig ist der Wert 0000 für CKSEL, der stellt externen Takt ein.

Gruß, Sebastian

Sebastian Voitzsch schrieb:

Ok, versteh ich das richtig ? Wenn ich an den Fuses nichts ändere, dann läuft der uC mit einem internen Oszillator auf 1 MHz ? Das wäre dann natürlich das optimale für mich. Ignoriert der dann auch die externe Beschaltung oder muß ich dann den Quartz und die beiden Kondensatoren auslöten ?

Gruß Matthias

Du verstehst richtig.

Ich würd's ausprobieren. Lt. Datenblatt sollen XTAL1 & 2 unverbunden bleiben, wenn der int. Oszillator benutzt wird. Aber es sollte auch mit Beschaltung funktionieren.

Sebastian

Hallo,

Matthias Sinjen schrieb:

Aber Achtung: Es gibt iirc recht große Toleranzen und eine Temperaturabhängigkeit. Wenn Du einen genauen Takt (z.B. zur Zeitmessung) brauchst, taugt der interne Oszillator nichts.

CU Christian

Christian Zietz - CHZ-Soft - czietz (at) gmx.net WWW: http://chzsoft.com.ar/ - Fido: Christian Zietz@2:2437/74.9 PGP-Key auf Anfrage oder ueber http://wwwkeys.de.pgp.net (Port 11371)

Christian Zietz schrieb:

Ok, werd dran denken wenn ich mal sowas mache. Bei mir gehts jetzt um erste Schritte in der Programmierung...

Aber Danke für den Tipp.

Gruß Matthias

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required