Im WWW Suchen

Benutzerdefinierte Suche
   


 DS18B20 / DS18S20 Thermometer


Der 1-Wire Bus

Die bekannten Temperatursensoren DS18x20,  lassen sich über den 1-Wirebus von Maxim / Dallas (der nur 1 Portpin des MC belegt) auslesen. Sogar die Leitung für die +5 Volt Stromversorgung kann man einsparen, so das ein 2poliges Kabel (Daten und Gnd) vom Controller zum Sensor genügt. Im Datenblatt des DS18B20 (ab Seite 5) nennt Maxim diese Betriebsart Parasite Powered. In dieser Betriebsart "stiehlt" der DS18x20 seinen Strom von der Datenleitung, wenn diese gerade auf High ist. Geht der 1-Wire Bus auf Low, übernimmt dann ein zuvor geladener Kondensator der sich im Sensor befindet, kurzzeitig die Versorgung.
Durch die vielen Features des 1-Wirebus, ist allerdings auch mehr Wissen erforderlich und die Programmierung ist wesentlich aufwendiger als z.B bei einem TSIC 206/306, der ja auch nur eine Datenleitung Besitzt. Man muss eben mit einem Bus kommunizieren, und nicht mit einem einzelnen Temperatursensor, auch wenn nur ein Sensor am Bus ist ;-).
Da der 1-Wirebus ähnlich einer I2C oder TWI funktioniert, können gleich mehrere Sensoren an die Datenleitung des 1-Wirebus angeschlossen werden. Maxim bietet nicht nur Temperatursensoren für den 1-Wirebus an, sondern auch EEproms A/D Wandler und Porterweiterungen, um nur einige zu nennen. Diese können dann alle an dem einen Portpin angeschlossen werden und vom µC über den 1-Wirebus angesteuert und ausgelesen werden.

1-Wire Bus / Breadboard

Hier mein Aufbau auf einem Breadboard, den ich mir zum programmieren  aufgebaut habe. 
Den 1-Wire Bus habe ich nachträglich  eingefärbt (DQ in orange und Gnd in blau)

Die DS18B20 und 18S20 Temperatursensoren...

... unterscheiden sich Hauptsächlich in der Auflösung die von 9 bis 12 Bit reicht. Der DS18S20 ist eigentlich für eine 9 Bit Auflösung vorgesehen. Ein kleiner Hinweis im DS18S20 Datenblatt (Seite 3, unten) beschreibt wie man aus dem Sensor auch 12 Bit auslesen kann. Dazu reicht ein bisschen Bitschieben und rechnen.
Der DS18B20 wird "Werksseitig" mit 12 Bit Auflösung ausgeliefert. Die hohe Auflösung hat allerdings ihren Preis. Die Wandlungszeit steigt quadratisch, mit jedem Bit. Allerdings kann der Programmierer daran noch drehen. Im Konfigurationsregister des DS18B20 kann über 2 Bits die Auflösung von 9..12 Bit und somit die Wandlungszeit von ca. 94..750mS eingestellt werden. 
In meinem Programm nehme ich die 750mS Wandlungszeit in kauf und nutze somit die volle Auflösung von 12 Bit beider Sensoren, wobei man den DS18S20 im Quellcode auch mit den vorgesehenen 9 Bit konfigurieren kann. Da der Sensor während der Wandlung mehr Strom zieht (ca. 1,5mA), müssen auch Wartezeiten (ca. 5 Sekunden) zwischen den Wandlungen eingehalten werden, um das Messergebniss nicht durch Eigenerwärmung zu verfälschen.
Die DS18B20/DS18S20 haben beide eine Genauigkeit (nicht zu Verwechseln mit der Auflösung) von +/- 0,5°C im Temperaturbereich von -10°C bis +85°C und sind schon kalibriert. Die gesamte Range der beiden Sensoren geht von -55°C bis zu 125 °C.

 

Die Hardware

Auch hier habe ich wie schon beim TSIC-Thermometer die kleine Portview Platine verwendet, obwohl ich zugeben muss, das zu überlegen gewesen währe ein LCD zu benutzen, um dann mehrere Temperaturen gleichzeitig anzeigen zu können. Jedoch hat (für mich jedenfalls), eine 7-Segmentanzeige den Vorteil, das man diese auch noch aus der Ferne, mit einem Blick, sehr gut ablesen kann. In meinem Aufbau nutze ich insgesamt 4 DS18x20 Sensoren. Zwei mal den 18B20 und zwei 18S20. Die Anzahl der verwendeten Sensoren lässt sich problemlos auf über 20 erweitern. Im Normalbetrieb werden die Sensoren der Reihe nach ausgelesen und auf dem Display angezeigt. Zuerst erscheint ein kleiner Infotext um welchen Sensor es sich handelt, danach wird die Temperatur für eine einstellbare Zeit auf dem Display angezeigt. Zusätzlich kann man jedem Sensor (optional) eine der 5 LEDs zuordnen, die dann leuchtet, solange solange die Temperatur von diesem angezeigt wird. Ich habe meinen 4 Sensoren 4 verschiedenfarbige LEDs zugeordnet und kann somit mit einem Blick erkennen, welche Temperatur gerade angezeigt wird.
Da eine 7-Segmentanzeige ja nicht alle Buchstaben vernünftig darstellen kann, ist bei der Auswahl des Infotext etwas Phantasie gefragt. Ich habe die Strings "out"," in","SCH" und "FLU" für Aussentemperatur, Innentemperatur, Schlafzimmer und Flur zugeordnet.

1-Wire Bus / Schaltung

Auf der Skizze oben, sieht man wie die Platine des Portview-Moduls verkabelt werden muss.
Die Vorwiderstände müssen je nach verwendeter LED  berechnet werden.

Beispiel für eine rote LED mit 10mA / 2,1V lt. Datenblatt:

Rv=(U-Uled)/I  Bedeutet für uns  5 V - 2,1 V = 2,9 Volt, 2,9 V / 0,01A = 290 Ohm.
Man nimmt dann in der Praxis den nächstmöglichen aus der Normreihe E12 oder E24. In diesem Fall 270 oder 300 Ohm.

Mit dem angeschlossenen Taster, kann man die einzelnen Sensoren "durchzappen". Jeder Tastendruck schaltet einen Sensor weiter, um am Ende wieder beim ersten Sensor zu beginnen. Ist der gewünschte Sensor ausgewählt, wird nur noch dieser Sensor ausgelesen, die Anzeige bleibt bei diesem Sensor stehen. Will man wieder zum automatischen durchschalten der Anzeige zurückkehren, drückt man den Taster 2 mal kurz hintereinander (Doppelklick). In der Skizze sieht man noch den für den 1-Wire Bus nötigen 4,7K Pullup-Widerstand und den Vorwiderstand für den Dezimalpunkt der an PC5 angeschlossen wird.
Der im Datenblatt verwendete Mosfet Transistor für die parasitäre Stromversorgung, wird in meiner Schaltung nicht verwendet, da ein Portpin des Mega8/48 die geforderten 1,5mA die während der Wandlungszeit erforderlich sind, problemlos liefern kann. Zur Sicherheit, lasse ich im Programm jeden Sensor einzeln wandeln, da sich die geforderten 1,5 mA mit jedem weiteren Sensor addieren würden.

Die Software

Ist in Assembler geschrieben. Dazu habe ich das AVR-Studio 4.19 verwendet. Durch die vielfältigen Möglichkeiten, kann ich zum DS18x20-Thermometer leider keine fertige hex Datei liefern. Das Programm ist so geschrieben, dass man im oberen Teil des Quellcodes, durch ändern von ein paar Parametern, das Thermometer nach seinen eigenen Wünschen konfigurieren kann.   Beim assemblieren (Build oder F7), wird dann durch bedingte Assemblierung, das Programm abhängig von den oben gemachten Eingaben übersetzt. Danach ist die brennfertige Hex-Datei auf der Festplatte verfügbar und kann in den AVR geladen werden. 
Zum konfigurieren des DS-Thermometer sind keine Programmierkentnisse erforderlich, allerdings sollte man sich etwas mit dem AVR-Studio vertraut machen.

Im Quellcode kann man im oberen Teil, folgende Einstellungen machen:

So in etwa sieht der relevante Teil des  Quellcodes aus, wen er ins AVR-Studio 4.19 geladen ist.

;-------------------------------------------------------------------------------------------------------   
;µC. Einen der beiden AVRs auskommentieren
;-------------------------------------------------------------------------------------------------------   
#define mega48
;#define mega8
;-------------------------------------------------------------------------------------------------------   
;Passendes Include File laden
;-------------------------------------------------------------------------------------------------------   
.nolist
#if defined mega48
#include "m48def.inc"
#else
#include "m8def.inc"
#endif
.list
;-------------------------------------------------------------------------------------------------------   
;Stromversorgung des Sensors. Wenn +5V an Pin3(Vcc) des DS18x20 soll, auskommentieren
;-------------------------------------------------------------------------------------------------------   
#define parasite
;-------------------------------------------------------------------------------------------------------   
;Nur einen DS18x20 Anonym (ohne Romcode) auslesen. ACHTUNG, es darf nur ein DS am Bus angeschlossen sein
;-------------------------------------------------------------------------------------------------------   
;#define Anonym     ;Sollen also mehrere DS18x20 mit bekanntem Romcode ausgelesen werden, auskommentieren
;#define DS18S20    ;Wird nur 1 Sensor Anonym ausgelesen, den passenden Sensor definieren    
;#define DS18B20    ;Sollen also mehrere Sensoren ausgelesen werden, beide Sensoren auskommentieren.
;-------------------------------------------------------------------------------------------------------   
;Beim DS18S20 die höhere Auflösung von 12 Bit nutzen
;-------------------------------------------------------------------------------------------------------   
#define DS18S20_Zehntel ;Bei Auskommentierung werden bein DS18S20 nur 9 Bit genutzt
;-------------------------------------------------------------------------------------------------------   
;Wartezeit zwischen den Messungen
;-------------------------------------------------------------------------------------------------------   
.set sekunden   =5 ;Sollte im Single & Anonym Modus min.5 Sekunden sein (Eigenerwärmung der Sensoren)
;-------------------------------------------------------------------------------------------------------
;Infotext rollen. Auskommentieren, wenn nicht gewünscht
;-------------------------------------------------------------------------------------------------------   
#define Scroll_In 
#define Scroll_Out
.set Speed=160      ;Verzögerung in mS. Max. 434
   

Die Auskommentierung einer Zeile wird im AVR-Studio mit einem Semikolon gemacht. Alles was dann nach dem Semikolon folgt, wird in grüner Schrift angezeigt und nicht übersetzt. Diese Funktion ist also nur für den Programmierer gedacht, damit dieser Notizen ins Programm einfügen kann und hat keine Auswirkung auf das später übersetzte Programm. Möchte man z.B. das Programm für einen ATMega 8 assemblieren, ändert man den Quelltext wie folgt:

;-------------------------------------------------------------------------------------------------------   
;µC. Einen der beiden AVRs auskommentieren
;-------------------------------------------------------------------------------------------------------   
;#define mega48
#define mega8

Stromversorgung des DS18x20

Möchte man aus irgendwelchen Gründen keine Parasitäre Spannungsversorgung, kann man durch auskommentieren von ;#define Parasite die normale Stromversorung aktivieren.

Gründe dafür könnten sein:  

1.) Im Datenblatt der Sensoren wird erwähnt, das die parasitäre Versorgung nicht für Messungen über 100 °C geeignet ist. 

2.) Während der Messung, muss bei parasitärer Stromversorgung die Datenleitung zum Sensor auf Ausgang programmiert werden, um die nötigen 1,5 mA zu liefern, die der interne DS18x20- A/D-Wandler zum messen braucht. Stürzt der µC während dieser Zeit ab (z.B. EMV) und der DS18x20 will (aus welchen unwahrscheinlichen Gründen auch immer) einen low Pegel auf die Datenleitung legen, haben wir 2 Ausgänge mit unterschiedlichen Pegeln verbunden, was natürlich nicht lange gut geht .
Für diesen unwahrscheinlichen Fall habe ich den Watchdog des AVRs aktiviert, der alle 500 mS zurückgesetzt werden muss. Geschieht das nicht(z.B bei einem Absturz), löst dieser einen Reset aus der die Ports wieder initialisiert und somit die Datenleitung wieder auf Eingang konfiguriert. Der Kurzschluss kann also im schlechtesten Fall 500mS dauern. Ich selbst, habe die parasitäre Stromversorgung aktiviert.

Nur einen Sensor anschliessen

Bei nur einem Sensor am 1-Wirebus, sollte man ";#define Anonym" in "#define Anonym" ändern. In diesem Fall, ist es zusätzlich nötig, den verwendeten Sensor zu definieren. Werden mehrere Sensoren angeschlossen, bleiben alle 3 betreffende Zeilen Auskommentiert. Bei nur einem Sensor, ist der Taster und die LED(s) natürlich sinnlos, weshalb diese Teile des Codes auch nicht übersetzt werden. Es wird dann fortlaufend die Temperatur dieses einen Sensors auf dem Display angezeigt.

;------------------------------------------------------------------------------------------------------------   
;Nur einen DS18x20 Anonym (ohne Romcode) auslesen. ACHTUNG, es darf nur ein DS am Bus angeschlossen sein
;------------------------------------------------------------------------------------------------------------   
#define Anonym     ;Sollen also mehrere DS18x20 mit bekanntem Romcode ausgelesen werden, auskommentieren
;#define DS18S20    ;Wird nur 1 Sensor Anonym ausgelesen, den passenden Sensor definieren    
#define DS18B20    ;Sollen also mehrere Sensoren ausgelesen werden, beide Sensoren auskommentieren.

Beispiel für einen einzelnen DS18B20 am 1-Wire Bus

Auflösung beim DS18S20

Der DS18S20 ist normalerweise für eine Auflösung von 9 Bit (nur 0,5 hinterm Komma) vorgesehen. Da dieser ursprünglich als Nachfolger für den älteren DS1820 entwickelt wurde, wird aus aus Kompatibilitätsgründen in den Temperaturregistern, nach der Messung ein nur 9 Bit Temperaturwert bereitgestellt, obwohl der DS18S20 intern 12 Bit auflöst. Dallas stellt im Datenblatt eine Formel zur Verfügung um den DS18S20 auf 12 Bit zu erweitern. Man kann im Programm durch " #define DS18S20_Zehntel " die 12 Bitauswertung (0..9 hinterm Komma) aktivieren.

Wartezeit zwischen den Messungen

Wie schon erwähnt, zieht der DS18x20 während der Wandlung bis zu 1,5 mA. Würde man den Sensor permanent wandeln lassen, hätte dies eine Eigenerwärmung zur Folge. Bei meinen Versuchen stellte ich bei fortlaufenden Messungen (polling) eine Eigenerwärmung von bis zu 0,5°C fest. Dieser Fehler wird kleiner, je grösser die Intervalle zwischen den Messungen werden. Ab 5 Sekunden, stellte ich keine Temperaturerhöhungen mehr fest. Im Programm kann bei "  .set sekunden   =5 " die Zeit in Sekunden Festgelegt werden.

Infotext rollen

Spielerei . Hier kann man entscheiden, ob Text einfach normal auf dem Display erscheint, oder von rechts hereingeschoben werden soll..  Mann kann das herein und hinausschieben getrennt einstellen. Die Geschwindigkeit in Millisekunden können in der Speedvariable geändert werden. Sinnvolle Werte sind ~120...250

Mehrere Sensoren am 1-Wire Bus

Hierbei gibt es 2 verschiedene Möglichkeiten.
Man kann mit dem 1-Wirebefehl "Search_Rom" und einem speziellen Suchalgorithmus jeden unbekannten Sensor am Bus ansprechen. Allerdings weiss man dann nicht um welchen Sensor es sich handelt. Da ich bis jetzt das erste mal auf dem 1-Wire Bus unterwegs bin, nutze ich (vorerst ) die 2. und auch einfachere Möglichkeit.
Damit die Software später die einzelnen 1-Wire Komponenten auseinanderhalten kann, hat jeder Baustein eine individuelle Signatur. Im Datenblatt von Dallas/Maxim ist die Rede von einem "64-Bit Lasered ROM Code". Dieser 8 Byte lange Code ist bei jedem Sensor unterschiedlich. Ähnlich wie beim I2C-Bus, kann man mit dieser Bytefolge jeden  Baustein einzeln adressieren.
Bei nur einem DS18x20 am Bus, ist das kein Problem. Maxim stellt für diesen Fall sogar extra den 1-Wire Befehl "Skip-Rom" zur Verfügung. Allerdings darf bei Verwendung von "Skip-Rom" nur ein DS18B20 / DS 18S20 am Bus vorhanden sein, da ja sonst alle Sensoren beim auslesen der Temperatur gleichzeitig Antworten würden, was einen Crash auf dem 1-Wire Bus zur Folge hätte.
Will man also einen bestimmten DS18x20 ansprechen, sendet man also zunächst den 8-Byte langen Rom Code. Leider ist die Signatur  nicht auf den DS18x20 aufgedruckt oder sonstwie ersichtlich. Der Romcode muss ausgelesen werden.  Zu diesem Zweck habe ich in die Software eine kleine Routine eingebaut die diese 8 Bytes ausliest und als Hexzahlen auf dem Display anzeigt.

Um den Romcode eines DS18B20 /DS18S20 auszulesen geht man folgendermaßen vor:


 

Wird der Jumper aufgesteckt, erscheint auf der  Anzeige mit "LC0", was soviel wie "Lasered Code 0" bedeutet. Kurz darauf wird für etwa 4..5 Sekunden eine Hexzahl angezeigt (Byte 0) die man sich notiert. Danach wird das Display kurz dunkel und es erscheint "LC1" und kurz darauf Byte 1. Das geht dann so weiter bis zu LC7 um dann wieder mit LC0 zu beginnen. Sind alle 8 Bytes notiert, lässt man die Sequenz zur Sicherheit nochmals durchlaufen um die notierten Werte zu verifizieren.
Diesen Vorgang wiederholt man solange, bis der "64-Bit Lasered ROM Code" aller DS18x20 Sensoren, die an das Thermometer angeschlossen werden sollen, bekannt sind. Jetzt kann man die Hexwerte in den Quellcode einfügen. Natürlich müssen meine Daten entfernt werden.

;*****************************************************************************************
;                               Tabelle der DS18x20 Roms
;*****************************************************************************************
#ifndef Anonym                          ;Bei mehreren Sensoren Assemblieren
.org    flashend-$ff                    ;Ganz hinten rein
RomCode:
;------------------------------------------------------------------------------------------------------
;Sensor 1
;------------------------------------------------------------------------------------------------------
.db $28,$75,$45,$c7,$03,$00,$00,$0d     ;Ein DS18B20 mit Family Code $28
.db _oo,_uu,_t,led0                     ;Infotext "out".LED an PC0 Ein.
;------------------------------------------------------------------------------------------------------
;Sensor 2
;------------------------------------------------------------------------------------------------------
.db $28,$eb,$09,$c7,$03,$00,$00,$67     ;Auch ein 18B20
.db _,_ii,_n,led1                       ;Infotext " in"
; -----------------------------------------------------------------------------------------------------
;Sensor 3
;------------------------------------------------------------------------------------------------------
.db $10,$5b,$74,$35,$02,$08,$00,$af     ;Ein DS18S20
.db _S,_C,_H,led2                       ;Infotext "SCH" für z.B. Schlafzimmer
;------------------------------------------------------------------------------------------------------
;Sensor 4
;------------------------------------------------------------------------------------------------------
.db $10,$c5,$97,$35,$02,$08,$00,$99
.db _F,_L,_U,led3                       ;Infotext "FLU" für Flur
;------------------------------------------------------------------------------------------------------
;Anzahl der Sensoren.(Hier nix machen, wird berechnet)
;------------------------------------------------------------------------------------------------------
.set Anzahl= (PC-RomCode)/6   ;Im Flash wird mit Wortlänge gerechnet, deshalb bei 12 Byte /6
#endif

Jeder Sensor bekommt in der Tabelle einen Datenblock von 12 Bytes zugeordnet. Zuerst werden die 8 Bytes Romcode, den man zuvor ausgelesen hat, eingetragen. Danach folgt ein kleiner Text von 3 Zeichen, der vor dem anzeigen der Temperatur angezeigt wird. In das letzte Byte, wird die LED eingetragen, die leuchten soll, solange der entsprechende Sensor aktiv ist oder eine Null. Es ist wichtig, die länge des Datenblocks von 12 Byte einzuhalten, sonst wird im Programm der Zeiger zum nächsten Datenblock nicht richtig berechnet.
Da nur 5 Leitungen für Leds zur Verfügung stehen, kann man das Led-Byte auch verodern. Bei Eingabe von z.B. "led1|led4"  würden beide Leds leuchten. So könnte man auch eine Duo oder RGB-Led (gemeinsame Anode) verwenden, die dann mit 3 Led-Pins bis zu 7 verschiedene Farben anzeigen könnte.

Da der Romcode im ersten Byte den Familycode enthält, braucht der DS18x20 nicht mehr extra definiert werden. Das ist nur nötig, wenn wie oben beschrieben ein einzelner Sensor ohne Romcode betrieben wird. Das erste Byte, sollte immer mit $10  bei einem DS18S20 oder $28 bei einem DS18B20 beginnen.

Bei den Buchstaben ist man mit einer Siebensegmentanzeige etwas eingeschränkt, da sich auf dieser nicht alle Chars vernünftig darstellen lässt. Hier die Tabelle mit den möglichen Zeichen.

;-------------------------------------------
;Einzelne Segmente
;-------------------------------------------
.equ    a_ = 0b0111111
.equ    b_ = 0b1011111
.equ    c_ = 0b1101111
.equ    d_ = 0b1110111
.equ    e_ = 0b1111011
.equ    f_ = 0b1111101
.equ    g_ = 0b1111110
;-------------------------------------------
;Equates der Chars
.equ _   =  $FF    // Space
.equ _0  =  $81    // 0
.equ _1  =  $CF    // 1
.equ _2  =  $92    // 2
.equ _3  =  $86    // 3
.equ _4  =  $CC    // 4
.equ _5  =  $A4    // 5
.equ _6  =  $A0    // 6
.equ _7  =  $8F    // 7
.equ _8  =  $80    // 8
.equ _9  =  $84    // 9
.equ _A  =  $88    // A
.equ _aa =  $e2    // a
.equ _B  =  $E0    // B
.equ _cc =  $F2    // c
.equ _C  =  $B1    // C
.equ _D  =  $C2    // D
.equ _E  =  $B0    // E
.equ _F  =  $B8    // F
.equ _gg =  $84    // g
.equ _G  =  $A1    // G
.equ _hh =  $E8    // h
.equ _H  =  $C8    // H
.equ _ii =  $EF    // i
.equ _I  =  $CF    // I
.equ _J  =  $C3    // J
.equ _L  =  $F1    // L
.equ _n  =  $EA    // n
.equ _oo =  $E2    // o
.equ _O  =  $81    // O
.equ _P  =  $98    // P
.equ _q  =  $8C    // q
.equ _r  =  $FA    // r
.equ _S  =  $A4    // S
.equ _t  =  $F0    // t
.equ _uu =  $E3    // u
.equ _U  =  $C1    // U
.equ _Y  =  $D8    // Y

Wie man sieht, fehlen die breiteren Buchstaben wie z.B. W und M sowie Buchstaben die einen Schrägstrich beinhalten z.B. Z und K. Bei anderen Buchstaben geht dafür Gross- und Kleinschrift wie z.B. beim O. In Diesem fall wird für ein kleines o der Buchstabe doppelt geschrieben, also _oo.

 Download

Download ASM-Quellcode für AVR-Studio 4.19

Da ich meine Programme in Assembler schreibe, benutze ich immer noch die ältere AVR-Studio 4.xx Version. Ich weiss zwar, das es mittlerweile schon AVR-Studio 6.x zu haben ist, sehe aber im Moment keine Vorteile für ASM-Programmierer (ist nur meine persönliche Meinung). Wer Wert auf schönere Piktogramme und Design legt, kann auch die neuste Version herunterladen und den Quellcode für diese Version konvertieren. Leider kann ich dann nicht weiterhelfen, wenn es dann nicht so funktioniert wie gewünscht.


 Kurzanleitung AVR-Studio 4.19

Da mich immer wieder Emails erreichen, wie den ein Assembler Programm in ein AVR geladen wird habe ich hier eine kleine Anleitung angehängt auf die ich dann in Zukunft verlinken kann
Wer sich im AVR-Studio schon etwas auskennt, dem genügen wohl schon die Informationen von oben um das DS18x20 Thermometer aufzubauen und braucht nicht mehr  weiterzulesen. 

Neues Projekt erstellen

Hat man das AVR-Studio 4.19 installiert und gestartet, kann man auch gleich ein neues Projekt erstellen.

AVR-Studio neues Projekt

Hier Atmel AVR Assembler wählen und einen Projektnamen eingeben.

AVR-Studio Projekt

Ein klick auf Finish, öffnet den Editor. Ausserdem legt AVR-Sudio einen Projektordner an und erzeugt in diesem ein Projektfile welches später durch anklicken das Projekt öffnet.

AVR-Studio ready

AVR-Studio ist nun Bereit. Nun kann der Quelltext in das Mittlere Fenster kopiert werden. Dazu den Quellcode mit dem Windows Editor öffnen und "ALLES markieren".

editor

Kopieren.

Edit2

Und in den AVR-Studio Editor kopieren

Studio Paste

Um das Programm zu assemblieren (übersetzen) und somit die brennbare Hex-Datei zu erhalten im Menü Build wählen, oder einfach F7 drücken. Hat alles geklappt meldet AVR-Studio im Status Fenster unten, Assembly complete, 0 Errors, 0 Warnings.
Nun befindet sich die brennbare Hex-Datei sowie alle anderen Dateien im Projektordner.

Assemblieren

Den AVR programmieren

Den Programmer (in meinem Beispiel der AVR-Dragon) mit der ISP-Pfostenleiste der Hardware und mit dem PC verbinden. Im Tools-Menü  Programm AVR -> Connect wählen um seinen Programmer aus einer Liste auszuwählen. Hat bis dahin alles geklappt, erscheint ein Fenster wie unten.
Zunächst sollte man die Device (den AVR, der am Programmer hängt) auswählen. Danach stellt man den ISP mode ein (ist default) und bei Settings, die ISP Frequenz. Diese sollte maximal 1/4 der µC Frequenz betragen. Langsamer geht immer . Achtung, auch wenn ein 8 MHz Quarz auf der Platine ist, läuft ein neuer AVR (meistens) auf 1 MHz, sodass die maximale ISP-Frequenz 250 KHz betragen darf. Ich gehe meistens aus Sicherheitsgründen noch eine Stufe herunter und stelle 125 KHz ein. Ist alles soweit eingestellt verrät uns ein Klick auf Read Signature ob unser AVR mit uns spricht. Der angezeigte Hex-Wert ist die Signatur eines AT mega48. Wichtig ist der Satz darunter, der besagt das die Signatur zu unserem eingestellten Mega48 passt.

AVR-Studio Prog1

Ein klick auf den Program Reiter, öffnet den Programmierdialog. Hier unter Flash den Pfad zur Hex-Datei herstellen. Ein klick auf Program, lädt die Hex-Datei in unseren AVR.

AVR Studio program

Bei den Fusebits können auch (falls bekannt), die Hex-Werte direkt eingegeben werden.
Bei SUT_CKSEL wählt man die Taktquelle aus. In diesem Fall den internen RC Oszilator mit 8 MHz. Bei der Start-up Time wähle ich aus Sicherheitsgründen immer den höchsten Wert, 65mS.
Die CKDIV8 Fuse die den Systemtakt durch 8 teilt, muss abgeschaltet werden. Diese ist bei einem neuen Mega48 eingeschaltet.
Die BODLEVEL Einstellung bewirkt, das wenn die Betriebsspannung unter den eingestellten Wert fällt, einen Reset. Wenn wir die Schaltung mit einem Steckernetzteil mit nachgeschaltetem 7805 versorgen, kann die Brown-out detection auch abgeschaltet werden.

AVR-Studio Fusebits

Wichtig! Nicht mit den Fusebits herumspielen, wenn man nicht weiss was man macht.

Immer das Datenblatt des entsprechenden µC aufmerksam lesen.
Beispiel: Man stellt an SUT_CKSEL den Takt auf einen externen Quarz (oder Quarzoszillator), obwohl keiner angeschlossen ist.
Der AVR lässt sich jetzt nicht mehr programmieren, weil kein Takt an den entsprechenden XTAL Pins erzeugt wird.
Abhilfe: Einen Quarz (oder Quarzoszillator) anschliessen und die Fuses auf RC Oszilator programmieren.

Beispiel 2: Man schaltet RSTDISBL ein.
Nun haben wir ein Portpin dazubekommen dafür aber keinen Resetpin mehr . Da die Resetleitung auch für ISP benötigt wird, können wir den AVR nicht mehr über ISP programmieren. Wir haben uns also ausgesperrt. Hier hilft nur noch ein Programmiergerät das auch HV-Programmierung unterstützt. Z.B. der AVR-Dragon.