Forschung und Entwicklung: LCD-Anzeige | Mikrocontroller | Software | Sensoren | Gehäuse | Erfahrungsberichte
Geräte: SBTC3 | SBTC4 | Datenmodem zum PC | Simulator für Drucksensor
1.
Die Entwicklungsumgebung
1.0 Einstellen des Prozessortaktes
1.1 Das Makefile
1.2 Das Dekompressionsprogramm
1.2.1 Funktionen der Software
1.2.1.1 Grundstruktur des Programmablaufes
1.2.1.2 Dekompressionsrechnung
1.3 Der Programmcode
1.4 Die Datenübertragung vom
SBTC zu einem PC
1.5 Der Simulator für den
Drucksensor
Hat man das Paket installiert, verfügt man über eine leistungsfähige Entwicklungsumgebung mit der man Programme in C für den AVR-Controller schreiben kann. Dies eröffnet auch dem in Assembler unerfahrenen Programmierer (wie mir), die Möglichkeit, Software für den ATMEL zu erstellen, insbsesondere deshalb, weil die Kontroller für die Sprache C (bzw. das sich daraus ableitende Compilerergebnis) optimiert wurden.
Bevor man an das Erstellen der eigentlichen Dekompressionssoftware geht, müssen einige Einstellungen am Mikrocontroller selbst optimiert werden. Dabei geht es i. W. um das
Der Atmel-Controller wird standardmäßig ab Werk in der Einstellung "Interner Taktoszillater f=1MHz geliefert". Für unsere Zwecke ist es aber günstig, die maximal erzielbare Taktrate von 8 MHz einzustellen umd mehr Rechenleistung zu erhalten. Diese Einstellung wird über die sog. "Fuses" des uC vorgenommen. Es handelt sich um ein Muster von Bits, deren Setzung (oder Nichtsetzung) die Grundeinstellungen des Mikrocontroller definiert. Die Einstellung der Taktrate geschieht dabei über die mit CKSEL (Clock Selection) bezeichneten 4 Bits CKSEL3 bis CKSEL0. Laut Datenblatt benötigt man für die Einstellung "interner Oszillator f=8Mhz" folgende Einstellungen:
Bild 1: Auszug aus
dem Datenblatt: Die Bitmuster der einzelnen Taktraten
Dabei ist zu beachten, dass CKSEL3 von links beginnend gelesen wird und dass weiterhin ein Bit als gesetzt gilt, wenn es auf "0" steht (etwas absurd, man muss hier halt um die Ecke denken können!). Die Einstellung selbst wird mit dem Programm yaap vorgenommen. Man öffnet ein neues Projekt, lässt yaap den Prozessortyp erkennen (Detect Device) und stellt dann folgendes Muster ein:
Bild 2: Bitmuster für
yaap um den ATMega32 auf 8 MHz Taktfrequenz zu setzen
Wichtig: Hier unbedingt genau arbeiten! Bei falschen Einstellungen kann man den Prozessor ins Nirwana schicken, wenn man z. B. auf "Externer Oszillator" umschaltet aber man halt blöderweise keinen zur Hand hat. Pech gehabt! Der Mikrocontroller will dann nämlich unbedingt einen externen Taktgenerator (irgendwoher braucht er ja schließlich sein "Clock"-Signal) und verweigert natürlich auch eine Neuprogrammierung, denn da wo kein Takt da auch kein Abarbeiten von Befehlen.
Ist das erledigt und der Prozessor lebt noch und kommuniziert weiterhin mit einem (z. B. eben über yaap, d. h. man kann die Einstellungen der Bits noch lesen), kann man sich den schönen Dingen des Lebens zuwenden, der Entwicklung der Dekosoftware. Diese Softwareerstellung ist leider ein klein wenig komplizierter als das Programmieren unter Visual Basic, es müssen erst ein paar kleine Vorarbeiten erledigt werden. Die erste ist....
Mit der in sbtc-make.zip enthaltenen Batchdatei _build.bat kann man den Compiliervorgang starten, aus dem C-Programm wird dann eine sog. "HEX"-Datei erzeugt, also vom Mikrocontroller interpretierbarer Maschinencode, der in selbigen geladen wird. Wenn man das alles mehrmals gemacht hat, wird es ein automatischer Handlungsablauf:
Size after:
sbtc.elf
:
section
size addr
.text
6046 0
.data
298 8388704
.bss
13 8389002
.noinit
0 8389015
.eeprom
0 8454144
.stab
7212 0
.stabstr
3225 0
Total
16794
.text und .data dürfen für ATmega32 zusammen nicht mehr als 32767 Byte einnehmen, das dürfte aber schwer zu erreichen sein.
Ein Wort noch zu AVR Studio : Auf der Homepage von ATMEL findet man AVR Studio , eine Entwicklungsumgebung für die AVR-Controller. Anfangs habe ich mit dieser gearbeitet, weil man die Programme, die man geschrieben hat, zuerst in einer Simulationsumgebung testen kann und sich z. B. die Signalmuster, die man an den Ports erzeugt, ansehen kann. Leider hat der Simulator sehr enge Grenzen, z. B. kann er nicht in Echtzeit simulieren. Auch fehlt natürlich die Peripherie, wie das LCD. Da der AVR-ATmega32 dagegen ca. 10000 Zyklen Schreiben in den Flashspeicher zulässt und nur 11,50 Euro kostet, teste ich heute direkt im Controller. Ist das Schreiben des Flash eines Tages nicht mehr möglich, wechselt man eben schnell den Controller. Bis jetzt habe ich allerdings den ersten Controller immer noch am Arbeiten.
Das eigentliche Rechenprogramm des SBTC besteht aus den mehreren Funktionsgruppen. Die wichtigsten:
a) Berechnungsfunktionen für
Anschließend wird ein sog. Interrupthandling mit den Timerfunktionen des uC generiert und über die Funktion sei() (Enable Interupts) freigegeben. Nach dem Ablauf eines der in den uC integrierten Timers (hier Timer2) wird nun jeweils in regelmäßigen Zeitabständen eine Interuptroutine SIGNAL (SIG_OVERFLOW2) aufgerufen, die einen Zähler im Sekundetakt erhöht. Die seit Start des Programmes verstrichene Zeit wird in der Variablen runseconds gespeichert, zusätzlich wird die Oberflächenzeit in der Variablen surf_time abgelegt. Die Tauchzeit wird in diveseconds abgelegt. . Verschiedenen Aktionen (Drucksensor lesen, Dekorechnung durchführen) werden basierend auf diesem dieses Sekundetakt in bestimmten Zeitintervallen (1, 2 und 10 s) durchgeführt. Dadurch erhält man eine sehr präzise Zeitmessung aus der sich alle zeitkritischen Funktionen des Programmes ableiten lassen.
Der Grundablauf ist in etwa folgender:
a) Messe den
Druck
jede Sekunde.
b) Errechne daraufhin
den Stickstoffpartialdruck (ppN
2
) bzw. Heliumpartialdruck (ppHe)
aller Gewebe (Kompartimentsättigung).
c) Ermittle alle 10
Sekunden die gerade noch erlaubte Tiefe (Dekoberechnung).
d) Ist die gerade noch
erlaubte Tiefe größer als 0 Meter berechne ein
Dekompressionsphase,
ansonsten beginne von vorne.
Die Berechnung der Dekompressionsphase verläuft dann in der Funktion calc_deco() in folgenden Teilschritten:
a) Kopiere die
aktuelle
Sättigung aller Gewebe in ein temporäres Datenfeld mit 2x16
diskreten
Werten (für N
2
und He).
b) Ermittele von allen
16 Geweben den größten erforderlichen Umgebungsdruck.
c) Ermittele die hierzu
korrespodierende Wassertiefe.
d) Verringere den
Druck auf dieses Tiefenäquivalent.
e) Berechne nun die
Sättigung und erhöhe den Minutenzähler um 1.
f) Ermittele wieder
von allen 16 Geweben den größten erforderlichen
Umgebungsdruck.
g) Ermittele, ob dieser
auch erreicht wird, wenn die Tauchtiefe um 3 m verringert wird.
h) Wenn g) mit JA
beantwortet wird, verringe die Tauchtiefe um 3 m, wenn NEIN warte eine
weitere
Minute auf dieser Tiefe.
i) Setze fort mit
e) solange, bis die Dekompressionstiefe 0 beträgt.
j) Dekompressionphase
ist beendet, zeige an "NZ" (Nullzeit).
Die SBTC-Seiten
Konzeption | LCD-Anzeige | Mikrocontroller | Software | Sensoren | Gehäuse | Erfahrungsberichte