GREETBoard ATMega128 (Version 1) – Fuses, AVRStudio5.1 und der erste Start

Die Post hat pünktlich geliefert und so lagen vorgestern Abend vier neue ATMega1284P vor mir. Nach dem ich den ersten 128er Mikrocontroller mit einer falschen Fuse-Einstellung „zerschossen“ hatte, war eine Nachbestellung notwendig geworden. Jetzt sollte das GREETBoard ATMega128 endlich in Betrieb genommen und getestet werden können.

Der erste Test

Bevor irgendetwas passiert probiere ich die Schaltung immer erst ohne eingesteckten Mikrocontroller aus. Die Schaltung wird also einfach an die Spannungsversorgung angeklemmt und diese eingeschaltet. Dadurch sollte lediglich die Power-LED leuchten. Wenn es jetzt knallt, stinkt oder raucht, dann stimmt etwas nicht 😉

Ich hatte Glück und alles lief ohne Probleme, sodass ich den nächsten Schritt durchführen konnte. Dafür stecke ich den Mikrocontroller auf seine Fassung und schalte die Spannungsversorgung wieder ein. Auch jetzt sollte nichts ungewöhnliches passieren – was auch nicht geschah. Die Power-LED hat munter vor sich hin geleuchtet und sonst ist nichts passiert.

Schlussendlich habe ich dann das Programmieradapter eingesteckt und AVRStudio 5.1 gestartet. Dort musste ich ein neues Projekt beginnen, da es nur innerhalb eines Projektes möglich ist das Fenster „AVR Programming“ zu starten. In dem geöffneten Programmier-Fenster wird zuerst oben links der passende Mikrocontroller ausgewählt (ATMega1284P) und die Taste „Apply“ angeklickt. Um den Mikrocontroller auszulesen (u.a. adie Fuses) wird anschließend „Read“ gedrückt. Daraufhin erscheint neben der „Read“-Taste die ID des Mikrocontrollers.

GREETBoard ATMega128 - Daten des erkannten Mikrocontroller

GREETBoard ATMega128 – Daten des erkannten Mikrocontroller

Fuses setzen

Ich glaube, dass jeder einmal in seinem Leben einen Mikrocontroller verfusen muss. Das gehört einfach dazu 😉 Damit mir und vielleicht auch euch das nicht (mehr) passiert erkläre ich kurz, welche Einstellungen in AVRStudio 5.1 gemacht werden müssen, damit der Controller ansprechbar bleibt.

Auf externen Quarz umstellen

Der ATMega1284P hat einen internen Oszillator mit 8MHz, dessen Frequenz nochmal durch 8 geteilt wird. Diese Drosselung ist abschaltbar, doch dazu später mehr. Das GREETBoard ATMega128 soll jedoch mit einem 16MHz Quarz laufen, daher muss der externe Takt in den Fuses eingeschaltet werden. Die Schwierigkeit liegt darin, dass ein normaler Quarz und nicht ein Oszillator verwendet wird und dies in den Einstellungen unterschieden wird.

GREETBoard 128 - Der angeschlossene Quarz

GREETBoard 128 – Der angeschlossene Quarz

So sehen die Fuses im Auslieferzustand des ATMega1284P aus:

GREETBoard ATMega128 - Fuse-Einstellung des Auslieferzustandes

GREETBoard ATMega128 – Fuse-Einstellung des Auslieferzustandes

Für die Taktquelle ist die Fuse-Option „SUT_CKSEL“ verantwortlich. In der Auswahl stehen sehr viele verschiedene Möglichkeiten zur Verfügung. Bevor ich zur Aufstellung der unterschiedlichen Varianten komme, hier noch einen Hinweis auf die Problematik der englischen Übersetzung. Das Wort „Quarz“ heißt im Englischen „Crystal“ und Oszillator ist mit „Oscillator“ zu übersetzen. Eigentlich ist es ganz einfach, führt aber immer wieder zu Missverständnissen. Nun zeige ich die verschiedenen Auswahlmöglichkeiten im Fuse-Menü des AVRStudio 5.1 auf:

Ext. Clock
Dies ist eine externe Signalquelle, die an XTAL1 angeschlossen wird

GREETBoard 128 - Anschluss der "Ext. Clock"

GREETBoard 128 – Anschluss der „Ext. Clock“

Int. RC Osc.
Der interne Takt liegt bei ca. 8MHz. Aufgrund des Fuses „CKDIV8“ wird dieser Takt noch durch 8 geteilt, so dass ein 1MHz-Takt übrig bleibt. Diese Teilung kann jedoch deaktiviert werden.

Int. 128kHz RC Osc.
Ebenfalls intern ist der 128kHz Takt, der sehr wenig Energie verbraucht und damit für sparsame Lösungen verwendet werden kann.

Ext. Low-Freq. Crystal
Da hier explizit von einem „Crystal“ gesprochen wird (und auch nur bei dieser Auswahlmöglichkeit) scheint es die einzige richtige Wahl zu sein. Diese Einstellung ist jedoch optimiert für 32.768 kHz-Uhrenquarze und benötigt ebenfalls sehr wenig Energie. Wichtig ist aber vor allem, dass der Quarz nicht an XTAL1/2 angeschlossen wird, sondern an TOSC1/2. Damit scheidet „Ext. Low-Freq. Crystal“ für das GREETBoard ATMega128 aus.

GREETBoard 128 - Low Frequency Crystal Oscillator

GREETBoard 128 – Low Frequency Crystal Oscillator

 

Full Swing Oscillator
Diese Auswahlmöglichkeit ist leider etwas missverständlich da nur vom Oszillator die Rede ist. Im Datenblatt des ATMega1284P wird diese Einstellung jedoch Full Swing Crystal Oscillator genannt. Das macht es nicht 100%ig klar ist aber ein wichtiger Hinweis. Kurz: Diese Auswahl ist für das Board die richtige. Gleich kommen wir noch zu „Start-up time“

Ext. Crystal Osc.
Dies ist nun der klassische Oszillator, angeschlossen an XTAL1 und XTAL2. Im Datenblatt wird diese Einstellung „Low Power Crystal Oscillator“ genannt. Zusätzlich zur Start-up time wird noch zwischen verschiedenen Frequenzen unterschieden (0.4-0.9 / 0.9-3.0 / 3.0-8.0 / 8.0-16.0 [in MHz])

Start-up time
Alle Quarze und Oszillatoren benötigen eine ausreichende Spannungsversorgung und einige Schwingzyklen um ein stabiles Taktsignal ausgeben zu können. Daher ist es notwendig die Zeit, bis Vcc voll ansteht, anzugeben, bzw. abzuwarten. Da Vcc nicht gemessen wird, muss diese Zeit größer sein als die Zeit bis die Versorgungsspannung in voller Höhe verfügbar ist. Die Anzahl der Schwingzyklen ist abhängig vom Quarztyp. Für den hier verwendeten Quarz werden 258, 1000 oder 16.000 Zyklen zur Auswahl angeboten.

Um das GREETBoard ATMega128 auf den externen 16MHz Quarz einzustellen, habe ich mich für die folgende Auswahl entschieden:

SUT_CKSEL = FSOSC_1KCK_65MS_CRES_SLOWPWR

Also Full Swing Crystal Oscillator mit 1.000 Einschwingzyklen und 65 Millisekunden bis Vcc voll ansteht. Fertig!

GREETBoard ATMega128 - Fuses für den externen 16MHz Quarz

GREETBoard ATMega128 – Fuses für den externen 16MHz Quarz

Brown Out Detection

Der ATMega1284P kann nur mit definierten Spannungen betrieben werden. Laut Datenblatt sind drei Varianten möglich:

0 – 4 MHz  @ 1,8 – 5,5V
0 – 10 MHz @ 2,7 – 5,5V
0 – 20 MHz @ 4,5 – 5,5V

Aufgrund des verwendeten 16 MHz Quarzes wird also eine Spannung von 4,5 bis 5,5V benötigt. Unterhalb von 4,5V kann der Mikrocontroller nicht mehr sicher betrieben werden. Die „Brown Out Detection“ erkennt wenn die Versorgungsspannung unter einen vordefinierten Wert fällt und stoppt die Programmausführung. Brown Out ist sozusagen eine Vorstufe des Black Out.

Da die untere Spannungsschwelle des ATMega1284P bei 4,5V liegt, wird die Brown Out Erkennung auf den Wert 4,3V eingestellt:

BODLEVEL = 4V3

Wenn der Mikrocontroller in späteren Beispielen in den Schlaf-Modus versetzt wird, muss die Brown Out Detection nochmal kontrolliert werden, da es sonst zu Fehlverhalten kommen kann.

JTAG

An dieser Stelle werde ich nicht darauf eingehen, worum es sich bei JTAG handelt (das wäre ein großer Artikel für sich). Es geht mir nur um die Fuses und deren Einstellung.

Für diese Interface Funktion sind zwei Fuses zuständig – OCDEN und JTAGEN. Diese sind deshalb so besonders, weil sie einige Pins am Mikrocontroller für die JTAG-Funktion reservieren. Diese können dann nicht als normale IO Pins benutzt werden. Hierbei handelt es sich um die Pins PC2-5 (LED’s und Taster sind damit beeinträchtigt). Tatsächlich bin ich in diese Falle getappt und hab mich erst nach einiger Zeit an diese Fuses erinnert. Also:

OCDEN & JTAGEN ausschalten!

CKDIV8

Dieses Fuse ist dafür zuständig, den Takt durch 8 zu teilen und erst danach an den Mikrocontroller weiterzuleiten. Somit würde aus dem 16MHz- ein 2MHz-Takt. Da aber der volle Takt zur Verfügung stehen soll, wird dieses Fuse deaktiviert. Also:

CKDIV8 ausschalten!

Das AVR Programming Menü sollte nun wie folgt aussehen:

GREETBoard ATMega128 - Die geaenderten Fuses des externen 16MHz-Quarzes

GREETBoard ATMega128 – Die geänderten Fuses des externen 16MHz-Quarzes

Die geänderten Fuses sollten ein gelbes Ausrufezeichen anstelle des grünen Haken anzeigen. Ein Klick auf „Program“ schreibt die veränderten Fuses und die Ausrufezeichen werden zu grünen Häkchen.

Das Testprogramm

Die neue Platine ist nicht nur zweiseitig, sondern auch noch mit durchkontaktierten Vias ausgeführt. Auf den ersten Blick sahen diese sehr klein aus und ich war mir nicht sicher, ob ich die richtig eingeplant hatte. Dem ersten kleinen Programm habe ich daher viel Bedeutung beigemessen. Jetzt sollte sich entscheiden ob ich doch noch einen bislang unentdeckten Fehler gemacht habe.

Um es nicht zu kompliziert zu machen, habe ich beschlossen, dass erste Programm des GREETBoard ATMega32 anzupassen. Die Deklaration der Pins (vom gesamten Port D auf die Pins PC3-5 [0x38]) wurde verändert. Außerdem habe ich noch die Taktfrequenz-Definition eingefügt.

#ifndef F_CPU                //Wenn CPU-Takt nicht bereits definiert wurde...
#define F_CPU 16000000       //...dann definiere ihn auf 16MHz
#endif

#include <util/delay.h>
#include <avr/io.h>

int main (void) {
DDRC = 0x38;                   // Pin PC3-5 als Ausgang definiert
while(1) {                     // Endlosschleife
PORTC |= (1<<PC3);       // Bit setzen
_delay_ms(500);                // halbe Sekunde warten
PORTC &= ~(1<<PC3);  // Bit löschen
_delay_ms(500);                // halbe Sekunde warten
}
return 0;
}

Das Video

Es funktioniert ganz hervorragend, wie das folgende kurze Video beweist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.