Start AVR-KursStartseiteserielles ISP-Interface

9. Die Fusebits, interner Oszillator - Quarzbetrieb - Testprogramm

last update: 02.12.2010


Fuse heißt Sicherung und die kann einem schon durchbrennen, wenn man das eine oder andere Fusebit falsch gebrannt hat. Im schlimmsten Fall ist der Controller hinüber, über den Jordan nämlich. Bei manchen Fusebiteinstellungen kann man noch mit Trick eine Wiederbelebung durchführen. Das ist der Fall, wenn man versehentlich einen externen Oszillator mit dem externen Quarz verwechselt hat. Der AVR ist nämlich nur programmierbar, wenn er auch getaktet wird und genau das ist nämlich der Fall, wenn man den Betrieb eines externen Taktgenerators eingestellt aber "nur" einen Quarz angeschlossen hat.

Absolut tödlich für eine erneutes Programmieren ist es, wenn man den Resetanschluss (Pin1 beim Tiny 2313) als Portpin programmiert hat. Also Finger weg davon!

Ein ganz guter Gedanke ist es, die Stellung der Fusebits nicht sofort irgendwie zu stellen, sondern die Positionen derselben erst einmal aus dem neuen Controller auszulesen. Wir starten Ponyprog, kontrollieren ob die Einstellungen für Controller und Interface passen und ob Interface und Experimentierplatine angeschlossen sind. Spannungsversorgung OK? Dann kann los gehen.


Mit einem fabrikneuen Tiny 2313 bekommt man nach einigen Sekunden, in denen Ponyprog die Fusebits ausliest folgende Rückmeldung.

Was bedeuten nun die diversen Haken in den Checkboxen?

Wie schon erwähnt, benötigt der Controller für seine Arbeit einen Takt so wie die Sklaven auf den römischen Galeeren. Der Takt kann intern durch einen RC-Generator erzeugt werden. Mit dieser Einstellung wird der Baustein fabrikneu ausgeliefert. Ferner sind der Anschluss eines externen Quarzgenerators sowie der Anschluss eines Schwingquarzes möglich.

Nun muss man dem Controller natürlich sagen welche Taktquelle er verwenden soll, bzw. welche überhaupt zur Verfügung steht und von welcher Qualität diese ist.

Diese Einstellungwird durch die Fusebits CKSEL3:CKSEL0 erledigt.
CKSEL steht für Clock select was einfach Taktauswahl bedeutet.

Ein Haken in der Checkbox von Ponyprog bedeutet die Fuse ist programmiert. Laut Datenblatt bedeutet das, dass ihr Wert auf "0" geschrieben ist! Null (0) bedeutet also noch einmal gesagt "programmiert" und wird in Ponyprog durch einen Haken im Kontrollkästchen dargestellt. Logischerweise bedeutet dann kein Haken eine 1 und laut Prozessordatenblatt "nicht programmiert". Das klingt kompliziert und das ist es auch, denn andere Programmer können durchaus andere Darstellungen haben. Es ist daher wirklich gut, wenn man zu allererst einen nagelneuen Controller ausliest, von dem man die Stellung der Fusebit laut Datenblatt kennt. Die Zuordnung der Darstellungen ist dann einfach. (Hinweis: Auch die Bits im Programmspeicher (Flash) stehen nach dem Löschen des Speichers auf "1". Durch das Programmieren werden sie gezielt auf "0" gesetzt. Siehe dazu auch den Speicherauszug in Ponyprog)

Für den neuen Tiny 2313 heißt das nun: 0 1 0 0 für die Werte der 4 Bits zur Festlegung der Taktquelle. Nach Datenblatt (Seite 25) bedeutet das, dass der Interne RC-Oscillator mit 8MHz betrieben wird. Bevor wir die Einstellung verändern, kümmern wir uns erst noch um die anderen Fuses.

SUT steht für Start up time und regelt das Bootverhalten des Controllers. SUT1 = 1; SUT0 = 0
Diese Werte legen fest, dass die Startzeit 20 Takte und zusätzliche 65 ms beträgt. In dieser Zeit kann die Betriebsspannung ihren vollen Wert annehmen und der Taktgenerator zu einer stabilen Arbeitsweise finden. Schnellere Starts sind einstellbar aber bei uns wohl nicht notwendig.

CKDIV8 = 0 und damit programmiert. Der Systemtakt, egal von welcher Quelle, wird durch diese Einstellung durch 8 geteilt (zumindest wird diese Einstellung vorgegeben). Das kann man machen, wenn es nicht auf eine hohe Taktfrequenz ankommt, es wird dadurch nämlich Energie gespart, weil der Prozessor um so weniger Strom aufnimmt, je niedriger seine effektive Arbeitsfrequenz ist.

Fassen wir zusammen: fabrikneu wird der Tiny2313 mit eingestelltem internen RC-Generator auf 8 MHz geliefert. Weil CKDIV8 programmiert ist (=0) resultiert daraus ein Systemtakt von 1 MHz, der für alle internen Bausteine ausschlaggebend ist. Ferner ist über die SUT-Fuses die längste aber auch sicherste Startsequenz eingestellt, die möglich ist.

Für unseren 8 MHz-Quarz und eine möglichst gute Performance suchen wir nun im Datenblatt nach den dafür nötigen Einstellungen. Aus der Tabelle 2 auf Seite 25 des Datenblatts zum ATTiniy2313 finden wir in Zeile 6, dass für einen Quarz oder Keramikresonator die CKSEL-Bits von 1 0 0 0 bis 1 1 1 1 eingestellt sein können. Wir suchen weiter nach unten und finden in Tabelle 4 auf Seite 26, Zeile 5, dass für Quarze ab 8 MHz die CKSEL3:1 - Bits auf 1 1 1 lauten müssen und dass wir für ein sicheres Anschwingen des Quarzes Werte von 12 pF bis 22 pF für die Kondensatoren verwenden sollten. Die letzte Zeile aus der Tabelle 5 auf Seite 27 des Datenblatts informiert uns, dass für ein sicheres Startverhalten (16 tausend Takte plus 65 ms Startup Time) CKSEL0 = 1 sein muss und die SUT1:0-Bits auch auf 1 1 stehen müssen. Weil wir die Quarzfrequenz nicht von vorn herein durch 8 teilen wollen, setzen wir auch das Bit CKDIV8 auf 1.

Fassen wir erneut zusammen: Quarzbetrieb mit 8,0000 MHz und lange Startup Zeit CKSEL3:0 = 1 1 1 1 und SUT1:0 = 1 1
Ferner keine Vorteilung des Takts, also CKDIV8 = 1

Zum Einstellen des von uns gewünschten Betriebsverhaltens müssen wir einfach alle Haken aus den Kontrollkästchen entfernen und das ganze in den Controller zurückschreiben.

Ein Klick auf "Write" überträgt die neuen Werte, die wir durch erneutes Lesen kontrollieren.

 

Erster Test

Wir verwenden die Platine mit den drei Tasten und den 4 LEDs. Schließe die Platine über zwei Kabel an den Spannungsverteiler der Experimentierplatine an - + an + und GND an GND. Stecke eine Verbindung von LED-Anschluss A auf Tastenbuchse 1. Wird die Taste gedrückt, dann schließt der Kontakt einen Stromkreis vom + -Pol (Vcc) über die LED und den Schalter zum Minuspol der Versorgungsspannung (GND = Masse). Die LED leuchtet.

Diesen Vorgang wollen wir nun durch ein Programm nachahmen. Das geht zwar einfacher wie wir eben gesehen haben, jedoch demonstriert das Progrämmchen schön die Funktion des Controllers. Und das Ganze ist natürlich ausbaufähig!

Hier ist ein Listing des ersten Testprogramms. Klicke auf das Listing, wenn du den Quelltext dazu herunterladen willst.

1. Lade das fertig übersetzte Programm herunter (Rechtsklick und "Ziel speichern unter") und speichere es in einem beliebigen Verzeichnis. Der Assembler erzeugt aus dem menschenlesbaren Assemblerprogramm ein sogenanntes HEX-File, das nur noch hexadezimale Zahlencodes enthält, welche neben einigen Steuerinformationen für die Programmübertragung eben das Programm ansich darstellen.

2. Öffne dieses HEX-File (test1.hex) in Ponyprog.


Programmfile öffnen (Menü oder über die Schaltfläche)


Datei suchen und auswählen


So sieht die Hexdatei im Programm-Buffer von Ponyprog aus. In nicht genutzten Bytes stehen alle Bits auf 1 -> $FF


Das Übertragen des Programms zum Controller wird eingeleitet


"Yes" wir wollen programmieren


Nach dem Programmieren, das sehr schnell geht, wird das Resultat im Flash-Speicher des AVR mit dem Original im PC-Speicher verglichen


Alles OK, wir quittieren den Vorgang und schließen den Anschluss A der ersten LED nun am Pin 8 des AVR an, das ist die Portleitung PD4 und legen den Anschluss 1 des ersten Schalters an Pin 9 des AVR, das ist die Portleitung PD5, die als Eingang dient.


Gesamtübersicht


Die Anschlüsse am LED-Board ...


und am Experimentierboard

Drückt man Taste 1, dann geht die LED an, lässt man die Taste los, geht sie aus. Nichtgerade toll, aber ausbaufähig. Das zugehörige Assemblerprogramm dokumentiert und beschreibt das Listing1. Da es neben der eigentlichen Funktion noch eine ganze Menge anderer programmtechnischer Sachen gibt, die man bereden muss verweise ich hier einfach auf die folgenden Kapitel. Da wird nach und nach alles erklärt.

 

Zweiter Test

Lade die Datei "test2.hex" (Rechtsklick und "Ziel speichern unter") herunter und übertrage sie an den Controller. Die Schaltung bleibt die gleiche. Drücke jetzt kurz die Taste 1. Jetzt leuchtet die LED für ca 6 Sekunden, geht aus und kann durch erneutes Drücken von Taste 1 wieder für 6 Sekunden aktiviert werden. Auch dazu gibt es das Quelllisting hier zum runterladen. Das Listing ist reichlich dokumentiert.
Anwendung: Treppenhauslicht.

 

Dritter Test

Die Datei "test3.hex" (Rechtsklick und "Ziel speichern unter") wird in den Controller geschickt. Schaltung bleibt gleich. Erneuter kurzer Tastendruck auf Taste 1. Die LED A blinkt im Sekundentakt genau 10 mal - oder wenn mal das Programm etwas abändert auch auf Dauer. Hier der Quelltext.
Anwendung: Blinker

Beliebige Änderungen des Leuchtverhaltens der LED A sind trotz gleicher Schaltung denkbar. Auch die Steuereinheit bleibt äußerlich die selbe. Was sich ändert sind lediglich die Bits im Fashspeicher des Controllers, und dessen Inhalt kann für unsere Begriffe sehr oft geändert werden nämlich laut Datenblatt mindestens 10.000 mal. Da spielt es auch keine Rolle wenn man ein Progrämmchen 50 mal testen muss, bis es wunschgemäß funktioniert. Der Tiny2313 hielte das für 200 Projekte aus.


Start AVR-KursAn den Seitenbeginnnicht verfügbar