AVR-Programm hochladen

  • Thread starter Matthias Sinjen
  • Start date
M

Matthias Sinjen

Guest
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
 
On Sun, 05 Oct 2003 13:08:33 +0200, Matthias Sinjen
<Matthias@Sinjen.com> wrote:

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
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

http://www.nongnu.org/avrdude/

Viel Glück noch!
Johannes
 
Matthias Sinjen wrote:

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.
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.

Muß man
da nicht zuerst auch irgendwelche Fusebits bearbeiten ?
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:

----8<------
#!/bin/bash
uisp -dprog=avrisp --erase && \
uisp -dprog=avrisp --upload if=$1
----->8-----

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

HTH,
Sebastian
 
Muß man
da nicht zuerst auch irgendwelche Fusebits bearbeiten ?


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


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
 
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

http://www.nongnu.org/avrdude/

Schau ich mir mal an, danke !

Gruß
Matthias
 
Matthias Sinjen wrote:

Hi

Ich benutze aber einen externen 4 MHz Quartz - da muß ich doch jetzt
Fuses setzen oder nicht ?
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?
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?

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
 
Matthias Sinjen wrote:

Sebastian Voitzsch schrieb:
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?


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).
Die funktionieren auch mit 1MHz. Das Testboard enthält Quarz und
Kondensatoren nur, weil ältere AVRs keinen internen Oszillator enthalten.

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 ?
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:

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.

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
 
Matthias Sinjen wrote:

Sebastian Voitzsch schrieb:

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.


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.
Du verstehst richtig.

Ignoriert der dann auch die externe Beschaltung oder muß ich dann den
Quartz und die beiden Kondensatoren auslöten ?
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:

Wenn ich an den Fuses nichts ändere, dann
läuft der uC mit einem internen Oszillator auf 1 MHz ?
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:

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.

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
 

Welcome to EDABoard.com

Sponsor

Back
Top