diplomarbeit

116
Diplomarbeit zum Thema Erhöhung der Kanalanzahl des Modular-EEG auf Mikrocontroller-Ebene An der Fachhochschule Dortmund im Fachbereich Informatik erstellte Diplomarbeit im Studiengang Informatik Vertiefungsrichtung Technische Informatik zur Erlangung des Grades Diplom-Informatiker (FH) von Bastian Holtermann geboren am 29.09.1979 (Matr.- Nr.: 7051425) Betreuung: Prof. Dr. Engels Dortmund, 27. März 2008

Upload: ika-caika-rizkyka-mika

Post on 26-Sep-2015

219 views

Category:

Documents


1 download

DESCRIPTION

skripsi

TRANSCRIPT

  • Diplomarbeit

    zum Thema

    Erhhung der Kanalanzahl desModular-EEG auf

    Mikrocontroller-Ebene

    An der Fachhochschule Dortmundim Fachbereich Informatik

    erstellte Diplomarbeitim

    Studiengang InformatikVertiefungsrichtung Technische Informatik

    zur Erlangung des GradesDiplom-Informatiker (FH) von

    Bastian Holtermanngeboren am 29.09.1979

    (Matr.- Nr.: 7051425)

    Betreuung: Prof. Dr. Engels

    Dortmund, 27. Mrz 2008

  • Markenrechtlicher Hinweis

    Die in dieser Arbeit wiedergegebenen Gebrauchsnamen, Handelsnamen, Wa-renzeichen usw. knnen auch ohne besondere Kennzeichnung geschtzteMarken sein und als solche den gesetzlichen Bestimmungen unterliegen.

    Smtliche in dieser Arbeit abgedruckten Bildschirmabzge unterliegendem Urheberrecht () des jeweiligen Herstellers.

    Das Wort Brockhaus ist fr den Verlag Bibliographisches Institut & F.A.Brockhaus AG als Marke geschtzt.

    Atmel ist eine eingetragene Marke der Atmel Corporation

    II

  • Kurzfassung

    In dieser Diplomarbeit wird das Modular-EEG-Gert aus dem OpenEEG-Projekt von 6 auf 16 Kanle erweitert. Diese Erweiterung wird durch dieVerwendung eines ATmega1280 Mikrocontrollers mglich. Die ntigen n-derungen werden in dieser Arbeit beschrieben. Dazu zhlen die nderungendes Schaltplans, des Platinenlayouts und der Firmware.

    III

  • Abstract

    In this diploma thesis the Modular-EEG device from the OpenEEG projectwill be expanded from 6 channel to 16 channel support. This is possible byusing an ATmega1280 microcontroller. The changes made to the schematicdiagram, the board layout and the firmware will be described in this work.

    IV

  • Inhaltsverzeichnis

    1. Einleitung 1

    1.1. Zielsetzung der Arbeit . . . . . . . . . . . . . . . . . . . . 41.2. Vorgehensweise und Gliederung . . . . . . . . . . . . . . . 5

    2. Hauptteil 6

    2.1. Machbarkeitsstudie . . . . . . . . . . . . . . . . . . . . . . 62.1.1. Einfhrung in die Timing-Problematik . . . . . . . . 72.1.2. Berechnung des Timings mit 6 Kanlen . . . . . . . 82.1.3. Berechnung des Timings mit 16 Kanlen . . . . . . 122.1.4. Lsungsmglichkeiten fr das Timing-Problem . . . 132.1.5. Berechnung eines realisierbaren Timings . . . . . . 14

    2.2. Analyse der Firmware fr den ATmega8 . . . . . . . . . . . 172.2.1. Programmiersprache C . . . . . . . . . . . . . . . . 182.2.2. Verwendete Anweisungen . . . . . . . . . . . . . . 182.2.3. Analyse . . . . . . . . . . . . . . . . . . . . . . . . 21

    2.3. Schaltplannderungen . . . . . . . . . . . . . . . . . . . . . 352.4. Platinenlayout . . . . . . . . . . . . . . . . . . . . . . . . . 372.5. Bauteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402.6. Firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    2.6.1. Firmware fr 6-Kanal-EEG mit ATmega1280 . . . . 452.6.2. Firmware fr 16-Kanal-EEG mit ATmega1280 . . . 60

    2.7. Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    V

  • 2.8. Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

    3. Abschluss 74

    3.1. Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 743.2. Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    Literaturverzeichnis 76

    A. Original Firmware fr ATmega8 79

    B. 6-Kanal-EEG Firmware fr ATmega1280 88

    C. 16-Kanal Firmware fr ATmega1280 99

  • Abbildungsverzeichnis

    2.1. Ausschnitt einer Tabelle aller Atmel-Mikrocontroller nachA/D-Kanlen sortiert . . . . . . . . . . . . . . . . . . . . . 7

    2.2. Original-Schaltplan der Digital-Platine des Modular-EEG (Quel-le: [Pro]) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    2.3. Schaltplan mit ATmega1280 . . . . . . . . . . . . . . . . . 392.4. Pin-Konfigurartion des ATmega8 (Quelle: [Atm07b]) . . . . 402.5. Pin-Konfigurartion des ATmega1280 (Quelle: [Atm07a]) . . 412.6. Oberseite des Original-Layout (Quelle: [Pro]) . . . . . . . . 422.7. Oberseite des Layout fr ATmega1280 . . . . . . . . . . . . 422.8. Unterseite des Original-Layout (Quelle: [Pro]) . . . . . . . . 432.9. Unterseite des Layout fr ATmega1280 . . . . . . . . . . . 432.10. Oberseite der leeren Platine . . . . . . . . . . . . . . . . . . 442.11. Unterseite der leeren Platine . . . . . . . . . . . . . . . . . 452.12. Oberseite der bestckten Platine . . . . . . . . . . . . . . . 462.13. Unterseite der bestckten Platine . . . . . . . . . . . . . . . 462.14. Screenshot aus Brainbay mit 16 Kanlen . . . . . . . . . . . 73

    VII

  • Tabellenverzeichnis

    2.1. Bestimmung des optimalen Quarz . . . . . . . . . . . . . . 152.2. Bitmuster fr die A/D-Wandler Kanalauswahl mit den Bits

    MUX0-MUX5 [Atm07a] . . . . . . . . . . . . . . . . . . . 582.3. Anordnung der Daten im Textpuffer ohne Komprimierung . 652.4. Anordnung der Daten im Textpuffer mit Komprimierung . . 66

    VIII

  • Kapitel 1.

    Einleitung

    Computer werden in vielen Gebieten und fr viele Zwecke eingesetzt. Frden sinnvollen Einsatz von Computern sind Schnittstellen unbedingt erfor-derlich. Computer knnen ohne Schnittstellen weder programmiert noch be-dient werden und knnen auch keine Ergebnisse prsentieren. Je mehr Schnitt-stellen ein Computer hat, desto mehr Mglichkeiten gibt es, ihn einzusetzen.Gngige Schnittstellen, die jedem Computerbenutzer bekannt sein drften,sind Tastatur, Maus und Monitor.

    Eine spezielle Gruppe von Schnittstellen sind die BCI.1 Diese Schnittstel-len basieren darauf, Signale vom Gehirn zu erfassen und auf einem Compu-ter zu verarbeiten. Ein Verfahren, mit dem man Signale vom Gehirn gewin-nen kann, ist das EEG.

    EEG ist die Abkrzung fr das Elektroenzephalogramm2, das Hirnstrom-bild. Die Gehirnttigkeit verursacht schwache elektrische Strme, die fr dieErstellung eines EEGs an verschiedenen Punkten der Kopfhaut mit Hilfe vonElektroden abgeleitet werden. Die Spannungsdifferenz und die Spannungs-schwankungen werden verstrkt und entweder von einem Mehrkanalschrei-ber aufgezeichnet oder von einem Computer oder Mikrocontroller verarbei-

    1BCI steht fr Brain-Computer-Interface2griechisch egkphalon = was im Kopf ist, Gehirn

    1

  • Kapitel 1. Einleitung

    tet.3

    Ein EEG-Signal kann nach sechs abgrenzbaren Kurvenformen untersuchtwerden, die in unterschiedlichen Frequenzbereichen auftreten und den Zu-stand der Gehirnaktivitt zeigen.

    Deltawellen treten im Schlaf auf und haben eine Frequenz von 1 bis4 Hz.

    Thetawellen sind mit Kreativitt, Spontanitt, Ablenkbarkeit, Tagtru-men, Depressionen und Angstzustnden verknpft. Die Frequenz be-trgt 48 Hz.

    Alphawellen haben eine Frequenz von 812 Hz und treten bei Medita-tion, innerer Ruhe und Friedlichkeit auf.

    Betawellen treten bei aktivem, aufmerksamem wachsein auf und ha-ben eine Frequenz von 13 bis 21 Hertz.

    Hohe Betawellen werden mit Zustnden wie Hchstleistung, Sorge,Angst und Grbeln in Verbindung gebracht und treten bei einer Fre-quenz von 2032 Hz auf.

    Gammawellen haben eine Frequenz von 3840 Hz und sind mit Problem-Lsungs Aufgaben verknpft.4

    Man kann also mit dem EEG den Aktivittsgrad von verschiedenen Hirn-regionen5 feststellen und auch Gehirnerkrankungen erkennen. Mit einemEEG knnen keine Gedanken gelesen werden.6

    Da professionelle medizinische Gerte fr den Hausgebrauch zu teuer sindum damit herum zu experimentieren wurde das OpenEEG-Projekt ins Leben

    3vgl. [Bro07a] aus [Hol07] bernommen4vgl. [Dem05]5je nach Positionierung der Elektroden6vgl. [Bro07a] aus [Hol07] bernommen

    2

  • Kapitel 1. Einleitung

    gerufen. Das Projekt beschftigt sich mit der Entwicklung von do-it-yourselfEEG-Gerten und richtet sich an jeden der sich Amateurhaft mit EEG be-schftigen mchte.7

    Der erste Teil von OpenEEG, also Open, sagt aus, dass die Entwick-ler, die an diesem Projekt arbeiten, ihre Erfahrungen und ihr Wissen teilen.Dies erfolgt in diesem Fall auf der Internetseite des OpenEEG-Projekts8, indem dort Berichte, Anleitungen und vor allem die Quelltexte fr Softwa-re und Schaltplne fr Hardware verffentlicht werden. Die Inhalte dieserInternetseiten sind, soweit auf einzelnen Seiten nichts anderes vermerkt ist,unter der creative commons Attribution-Sharealike 2.0 Lizenz verffent-licht.9

    Die Lizenz legt fest, dass man das Werk vervielfltigen, verbreiten, ffent-lich zugnglich machen und Bearbeitungen des Werkes anfertigen darf. Je-doch nur unter folgenden Bedingungen. Der Autor oder Rechteinhaber mussin der von ihm festgelegten Weise genannt werden und das neu entstandeneWerk darf nur unter Verwendung von identischen oder vergleichbaren Li-zenzbedingungen weitergegeben werden.10

    Die Hardware des Projekts beschrnkt sich bisher auf zwei EEG-Gerte.Zum einen das Modular-EEG, das schon fertig entwickelt ist, whrend mei-ner Projektarbeit11 in Betrieb genommen und in dieser Diplomarbeit erwei-tert wird. Zum anderen das Soundcard-EEG, das wie der Name schon sagt,die Soundkarte als Schnittstelle zum Computer benutzt und dessen Entwick-lung bisher nicht abgeschlossen ist.12

    Das Modular-EEG verdankt seinen Namen dem modularen Aufbau. Essetzt sich aus einer Digital-Platine und bis zu drei Analog-Platinen zusam-

    7vgl. [Pro]8http://openeeg.sourceforge.net/9vgl. [Lic] aus [Hol07] bernommen

    10vgl. [Cre] aus [Hol07] bernommen11[Hol07]12vgl. [Pro] aus [Hol07] bernommen

    3

  • Kapitel 1. Einleitung

    men. Die Analog-Platinen haben die Aufgabe, die empfindlichen EEG-Signalezu verstrken und durch mehrere Filterstufen von Strungen zu befreien. Ei-ne Analog-Platine ist mit zwei Kanlen ausgestattet. Auf der Digital-Platinebefindet sich der Mikrocontroller, der die analogen Signale von den Analog-Platinen Digital-Signale umwandelt und per serieller Datenbertragung zueinem Computer sendet. Auf der Digital-Platine befindet sich ein Netzteilbe-reich, der durch Optokoppler vom Mikrocontroller-Teil galvanisch getrenntist. Dieses Netzteil versorgt auch die Analog-Platinen mit Strom.13

    1.1. Zielsetzung der Arbeit

    Das Ziel dieser Arbeit ist die Erhhung der Kanalanzahl des Modular-EEGGertes auf 16-Kanle. Dazu ist der ATmega8 Mikrocontroller durch einengreren Mikrocontroller zu ersetzen. Um die Fehlerquellen gering zu hal-ten, sollte nur das Ntigste gendert werden. Bestandteil dieser Arbeit sind

    die theoretische Vorbereitung,

    die nderung des Schaltplans und des Platinen-Layouts fr die Ferti-gung einer neuen Platine,

    die Anpassung der Firmware auf den neuen Mikrocontroller inklusiveder Erweiterung auf mehr Kanle und

    die Anpassung einer Software-Schnittstelle zur berprfung der Funk-tion.

    Die Funktion der Digital-Platine wird mit Hilfe des PWM-Signals getestet,indem dieses auf alle Eingnge des Analog/Digital-Wandlers gelegt wird.

    13vgl. [GNP+03]

    4

  • Kapitel 1. Einleitung

    1.2. Vorgehensweise und Gliederung

    Im Hauptteil wird zuerst die theoretische Erreichbarkeit der Zielsetzung ber-prft. Anschlieend wird eine Firmware aus dem OpenEEG-Projekt detail-liert analysiert. Danach wird auf die nderungen am Schaltplan und amPlatinen-Layout eingegangen. Darauf folgt ein Abschnitt ber die nderungder Firmware von ATmega8 auf ATmega1280 unter Beibehaltung der Ar-beitsweise. Als nchstes wird die Firmware von 6-Kanal auf 16-Kanal Ver-wendung erweitert. Die letzten Abschnitte des Hauptteils befassen sich mitder Software-Schnittstelle und den Tests. Nach dem Hauptteil folgt ein Fazitund ein Ausblick. Neben anderen Quellen werden hauptschlich die Firm-ware, der Schaltplan, das Platinenlayout und die Software-Schnittstelle ausdem OpenEEG-Projekt verwendet. Die wichtigste und am hufigsten ver-wendete Literatur sind die Datenbltter der Mikrocontroller ATmega8 undATmega1280.

    5

  • Kapitel 2.

    Hauptteil

    2.1. Machbarkeitsstudie

    Vor Beginn der eigentlichen Arbeiten wird an dieser Stelle berprft, ob dasgesetzte Ziel theoretisch erreichbar ist.

    Ein wichtiger Punkt fr die berprfung der Machbarkeit ist die Berech-nung, wie viel Zeit der Mikrocontroller braucht, um 16 Kanle zu verar-beiten. In den nchsten Abschnitten folgen eine Einfhrung in die Timing-Problematik und Berechnungen der Timings fr Sechs- und 16-Kanal-Betrieb.

    Neben den theoretischen Voraussetzungen wird jedoch auch ein Mikro-controller bentigt, der die entsprechende Anzahl an Analog/Digital-Wandler-Kanlen hat. Die bisher eingesetzten Mikrocontroller im Modular-EEG stam-men von der Firma Atmel. Auf der Internetseite von Atmel lieen sich am12.09.2007 noch alle Atmel-Mikrocontroller in einer Tabelle1 auflisten undnach bestimmten Kriterien sortieren. In der Fassung vom 27.02.2008 ist dieAnzahl der A/D-Kanle fr viele Mikrocontroller in der Tabelle nicht mehreingetragen und daher an dieser Stelle nicht mehr fr die Recherche nachdem geeigneten Mikrocontroller verwendbar. Ein Ausschnitt der nach A/D-Kanlen sortierten Tabelle vom 12.09.2007 ist in Abbildung 2.1 zu sehen.

    1Parametric Product Table

    6

  • Kapitel 2. Hauptteil

    Die Typen ATmega640, ATmega1280 und ATmega2560 eignen sich fr die-se Arbeit. Diese drei sind bis auf den Flash Speicher baugleich und werdenim selben Datenblatt beschrieben.2 Von den drei Typen sind bei Conrad oderReichelt nur der ATmega1280 oder der ATmega2560 kuflich zu erwerben.Fr den ATmega128RZBV und den ATmega256RZBV lieen sich keine Be-zugsquellen finden. Um nicht alle drei Typen aufzuzhlen, wird im weiterenVerlauf der Arbeit nur noch der ATmega1280 verwendet.

    Abbildung 2.1.: Ausschnitt einer Tabelle aller Atmel-Mikrocontroller nachA/D-Kanlen sortiert

    2.1.1. Einfhrung in die Timing-Problematik

    In diesem Abschnitt werden die fr die Berechnung des Timings wichtigenPunkte oberflchlich eingefhrt. Ein Anhaltspunkt ist die aktuell eingesetzteFirmware fr das 6-Kanal-Modular-EEG Gert. Die detaillierte Analyse derFirmware folgt im Abschnitt 2.2 auf Seite 17.

    Die Abtastrate legt fest, mit welcher Frequenz die EEG-Signale digita-lisiert und zum Computer bertragen werden. Diese Frequenz betrgt zumBeispiel beim Modular-EEG 256 Hz.3 Alle Kanle werden 256-mal pro Se-kunde von Analog zu Digital gewandelt und zum Computer bertragen. DieUmwandlung und die Datenbertragung drfen zusammen nicht lnger als

    2vgl. [Atm07a]3vgl. [HPR03]

    7

  • Kapitel 2. Hauptteil

    3,90625 ms4 dauern. Ansonsten wre der erste Zyklus noch nicht vollstn-dig abgearbeitet, bevor der nchste begonnen wird. Die Deadline wre dannberschritten und das bedeutet, dass der Mikrocontroller nicht genug Zeithat, das Programm ordnungsgem auszufhren.

    Der Analog/Digital-Wandler wird beim Modular-EEG mit 10-Bit-Auflsungbetrieben.5 Die Geschwindigkeit des A/D-Wandlers wird durch den System-takt festgelegt. Der Systemtakt wird dafr durch einen fr den A/D-Wandlerseparat vorhandenen Prescaler entsprechend skaliert. Die Frequenz des A/D-Wandlers darf bei 10-Bit Auflsung nicht mehr als 200 kHz betragen, um diemaximale Auflsung zu erreichen. Die Umwandlungszeiten betragen fr dieerste Umwandlung 25 A/D-Takte und fr die folgenden Umwandlungen je-weils 13 A/D-Takte.6

    Die Datenbertragung erfolgt seriell ber einen USART7. Die Datenber-tragungsrate fr den USART wird wie der A/D-Wandler Takt ebenfalls vomSystemtakt festgelegt und ber einen Prescaler eingestellt.8 Fr die Daten-bertragung wird pro Byte noch ein Start-Bit und ein Stop-Bit mit bertra-gen, dadurch werden pro Byte 10 Bit bertragen.9

    2.1.2. Berechnung des Timings mit 6 Kanlen

    In diesem Abschnitt wird das Timing fr den Mikrocontroller ATmega8 mitder Firmware Version 0.5.4-p2 berechnet. Diese Firmware wurde in meinerProjektarbeit10 zur Inbetriebnahme eines Modular-EEG Gertes eingesetztund dabei ausreichend getestet. Das p2 steht fr Paket-Version 2, neben der

    4siehe Gleichung 2.15vgl. [HPR03]6vgl. [Atm07b]7Universal Synchronous and Asynchronous serial Receiver and Transmitter8vgl. [Atm07b]9vgl. [HPR03]

    10[Hol07]

    8

  • Kapitel 2. Hauptteil

    es auch eine Paket-Version 3 gibt. Diese wird jedoch nicht von allen Pro-grammen untersttzt und hier nicht thematisiert.

    Wie oben beschrieben, betrgt die Abtastrate 256 Hz. Daraus resultiertnach Gleichung 2.1 eine Zeit von 3,90625 ms, in der ein Zyklus abgearbeitetsein muss.

    Zeit t =1

    Frequenz f=

    1256 1s

    = 0,00390625s = 3,90625ms (2.1)

    Die Frequenz des A/D-Wandlers darf nicht mehr als 200 kHz betragen.Der Wert fr den Prescaler ergibt sich somit aus der Ungleichung 2.2. DerPrescaler fr den A/D-Wandler kann aber nur die Werte 2, 4, 8, 16, 32, 64 und128 annehmen. Hier wird der Wert fr den Prescaler also auf 64 festgelegt.

    A/D-Prescaler >Systemtakt-Frequenz

    Max. Frequenz des A/D-Wandlers

    >7,3728MHz

    200kHz> 36,864

    (2.2)

    Die Taktfrequenz des A/D-Wandlers betrgt 115,2 kHz und resultiert ausder Gleichung 2.3. Ein Taktzyklus des A/D-Wandlers bentigt nach Glei-chung 2.4 8,68s.

    Frequenz des A/D-Wandlers =System-Taktfrequenz

    A/D-Prescaler

    =7,3728MHz

    64= 0,1152MHz

    = 115,2kHz

    (2.3)

    9

  • Kapitel 2. Hauptteil

    Zeit t =1

    Frequenz f=

    1115200 1s

    = 8,68s (2.4)

    Bei der Berechnung der Zeiten fr die A/D-Wandlung werden in der Firm-ware fr die jeweils erste von sechs Umwandlungen 26 A/D-Taktzyklen undfr die folgenden 14 A/D-Taktzyklen zugrunde gelegt.11 Nach Gleichung 2.5betrgt die Zeit fr die erste A/D-Wandlung 225,68s und nach Gleichung2.6 die Zeit fr jede folgende A/D-Wandlung 121,52s.Um die sechs Kan-le umzuwandeln, bentigt der A/D-Wandler nach Gleichung 2.7 insgesamt0,83328ms.

    Zeit fr die erste A/D-Wandlung = 26 Taktzyklen 8,68s= 225,68s

    (2.5)

    Zeit fr folgende A/D-Wandlungen = 14 Taktzyklen 8,68s= 121,52s

    (2.6)

    Gesamtzeit A/D-Wandlung = 1 225,68s+5 121,52s= 833,28s

    = 0,83328ms

    (2.7)

    Pro Zyklus der Abtastrate wird ein Datenpaket gesendet. Dieses Paket ent-hlt vier Byte fr den Paketheader, zwei Byte fr die Daten pro Kanal undein Byte fr den Paketfooter. Bei sechs Kanlen ist das Paket also 17 Bytegro. Bei der Datenbertragung werden pro Byte noch ein Start- und einStop-Bit mitgesendet. Die Gesamtgre eines Paketes betrgt somit 170 Bit.

    11vgl. [HPR03]

    10

  • Kapitel 2. Hauptteil

    Bei der hier verwendeten bertragungsrate von 57600 Bits dauert die ber-tragung nach Gleichung 2.8 2,95139ms.

    Gesamtzeit Datenbertragung =Datenmenge

    bertragungsrate

    =170Bit

    57600 Bits= 0,00295139s

    = 2,95139ms

    (2.8)

    Zieht man nun die Zeiten fr die A/D-Wandlung und die Datenbertra-gung von der, fr einen Abtast-Zyklus, zur Verfgung stehenden Zeit ab, sobleiben noch 0,12158 ms brig.

    Restzeit = 3,90625ms0,83328ms2,95139ms = 0,12158ms (2.9)

    In dieser Restzeit sind die Zeiten fr die restlichen Anweisungen enthal-ten. Hier wird jedoch nicht die Dauer jeder einzelnen Anweisung analysiert,sondern die Anzahl der Single-Cycle Anweisungen berechnet, die in derRestzeit ausgefhrt werden knnten. Single-Cycle bedeutet, dass die Anwei-sung mit einem Taktzyklus des Mikrocontrollers ausgefhrt werden kann. Esgibt auch Anweisungen, die mehr als einen Taktzyklus fr die Ausfhrungbentigen.

    Bei einer Taktfrequenz von 7,3728 MHz dauert ein Taktzyklus 0,1356s.Es bleibt also noch Zeit fr 896 Sigle-Cycle Anweisungen.

    Zeit t =1

    Frequenz f=

    17372800 1s

    = 0,1356s (2.10)

    11

  • Kapitel 2. Hauptteil

    2.1.3. Berechnung des Timings mit 16 Kanlen

    Hier wird das Timing, auf der Grundlage der obigen Rechnung, fr 16 Kan-le berechnet.

    Die Gesamtzeit fr die A/D-Wandlung erhht sich von 0,83328 ms auf2,04848 ms.

    Gesamtzeit A/D-Wandlung = 1 225,68s+15 121,52s= 2048,48s

    = 2,04848ms

    (2.11)

    Die Paketgre steigt von 17 Byte auf 37 Byte, da pro Kanal zwei Bytebertragen und nun zehn Kanle mehr verwendet werden. Durch die Start-und Stop-Bits entspricht ein Paket 370 Bit. Die Datenbertragung bentigtbei einer bertragungsrate von 57600 Bits eine Zeit von 6,42361 ms.

    Gesamtzeit Datenbertragung =Datenmenge

    bertragungsrate

    =370Bit

    57600 Bits= 0,00642361s

    = 6,42361ms

    (2.12)

    Die Datenbertragung braucht schon mehr Zeit als zur Verfgung steht.Mit den bisherigen Einstellungen kann das Programm nicht ordnungsgemausgefhrt werden, wenn 16 Kanle verarbeitet werden. Im folgenden Ab-schnitt werden Lsungsmglichkeiten fr dieses Problem aufgezhlt.

    12

  • Kapitel 2. Hauptteil

    2.1.4. Lsungsmglichkeiten fr das Timing-Problem

    In diesem Abschnitt werden Mglichkeiten aufgezeigt, mit denen das Timing-Problem aus dem vorherigen Abschnitt gelst werden knnte.

    Die Abtastrate legt den Zeitrahmen fest, in dem alles abgearbeitet werdenmuss, um eine ordnungsgeme Funktion des Programms zu gewhrleisten.Die Abtastrate muss nach dem Abtasttheorem von Harry Nyquist mindes-tens das 212 fache der hchsten Frequenz betragen. Das Signal muss dabeidurch einen Tiefpassfilter begrenzt werden. Es muss bestimmt werden, biszu welcher Frequenz die Signale wichtig sind und welche Signalanteile frdie Auswertung nicht bentigt werden.12

    Wie in der Einleitung beschrieben, haben die Gammawellen mit 42 Hz diehchste Frequenz, die zum Beispiel beim Neurofeedback Training relevantist.13

    Die Abtastrate knnte nach dem Nyquist-Theroem bis auf ein Minimumvon 105 Hz reduziert werden. Je hher jedoch die Abtastrate ist desto besserlsst sich das analoge Signal digital abbilden. Die meisten Programme ausdem OpenEEG-Projekt verwenden 256 Hz als Standard-Abtastrate.

    Bei der Datenbertragung kann die Geschwindigkeit durch Verndern desPrescalers problemlos von 57600 Bits auf 115200

    Bits erhht werden. Dadurch

    wrde sich die Zeit fr die bertragung auf die Hlfte reduzieren.Weiterhin werden pro Kanal zwei Byte bermittelt. Der A/D-Wandler hat

    aber eine maximale Auflsung von zehn Bit. Es bleiben demnach pro Kanalsechs Bit im Datenpaket frei. Bei 16 Kanlen sind das immerhin 12 Byte.Durch Komprimierung knnten sich zum Beispiel zwei Kanle drei Byteteilen.14 Der Paketumfang wre dann nur noch 29 Byte anstelle von 37 By-tes. Ein weiteres Byte lsst sich auch im Paketheader sparen, wenn das Byte

    12vgl. [Stu04]13vgl. [Dem05]14siehe Tabelle 2.4 auf Seite 66

    13

  • Kapitel 2. Hauptteil

    fr die Paketversion weggelassen wird.

    Die maximale Frequenz des A/D-Wandlers von 200 kHz ist mit 115,2 kHznoch nicht voll ausgeschpft. Fr eine Erhhung der Frequenz muss die Sys-temtaktfrequenz erhht werden. Diese Frequenz wird durch ein Quarz aufder Platine festgelegt. Die Tabelle 2.1 dient der Bestimmung der optimalenTaktfrequenz. In ihr werden fr die Frequenzen der handelsblichen Quarzedie zugehrigen Datenbertragungsraten und Frequenzen des A/D-Wandlersdargestellt. Die Tabelle enthlt nur Quarzfrequenzen zwischen 1000 und16000 kHz und davon nur diejenigen, mit der sich Anhand des Prescalers ei-ne Datenbertragungsrate von 115200 Bits einstellen lsst. Die optimale Fre-quenz betrgt 11059,2 kHz, da bei dieser Frequenz die hchste A/D-Frequenz, bei gleichzeitig eingestellter bertragunsgrate von 115200 Bits , erzielt wer-den kann.

    2.1.5. Berechnung eines realisierbaren Timings

    Hier erfolgt die Berechnung eines mglichen Timings, mit dem die Funktionfr 16 Kanle sichergestellt werden kann. Die Abtastrate bleibt unverndertund der Prescaler fr den A/D-Wandler kann ebenfalls auf 64 eingestelltbleiben. Durch die Erhhung der Systemtaktfrequenz auf 11,0592 MHz wirddie Frequenz des A/D-Wandlers auf 172,8 kHz erhht.

    Frequenz des A/D-Wandlers =System-Taktfrequenz

    A/D-Prescaler

    =11,0592MHz

    64= 0,1728MHz

    = 172,8kHz

    (2.13)

    Die Zeit fr einen A/D-Taktzyklus vermindert sich auf 5,787s.

    14

  • Kapitel 2. Hauptteil

    Tabe

    lle2.

    1.:B

    estim

    mun

    gde

    sop

    timal

    enQ

    uarz

    Qua

    rz

    bert

    ragu

    ngsr

    ate

    mit

    Pres

    cale

    rA

    /D-F

    requ

    enz

    mit

    Pres

    cale

    r

    Freq

    uenz

    1632

    6480

    9612

    88

    1632

    6412

    8

    1843

    ,211

    5,2

    57,6

    28,8

    23,0

    419

    ,214

    ,4-

    115,

    257

    ,628

    ,814

    ,436

    86,4

    230,

    411

    5,2

    57,6

    46,0

    838

    ,428

    ,8-

    -11

    5,2

    57,6

    28,8

    7372

    ,846

    0,8

    230,

    411

    5,2

    92,1

    676

    ,857

    ,6-

    --

    115,

    257

    ,692

    16,0

    576,

    028

    8,0

    144,

    011

    5,2

    96,0

    72,0

    --

    -14

    472

    11059,2

    691,

    234

    5,6

    172,

    813

    8,2

    115,2

    86,4

    --

    -172,8

    86,4

    1474

    5,6

    921,

    646

    0,8

    230,

    418

    4,3

    153,

    611

    5,2

    --

    --

    115,

    2

    15

  • Kapitel 2. Hauptteil

    Zeit t =1

    Frequenz f=

    1172800 1s

    = 5,787s (2.14)

    Damit ndert sich auch die Gesamtzeit fr die A/D-Wandlung von 2,04848 msauf 1,365732ms.

    Zeit fr die erste A/D-Wandlung = 26 Taktzyklen 5,787s= 150,462s

    (2.15)

    Zeit fr folgende A/D-Wandlungen = 14 Taktzyklen 5,787s= 81,018s

    (2.16)

    Gesamtzeit A/D-Wandlung = 1 150,462s+15 81,018s= 1365,732s

    = 1,365732ms

    (2.17)

    Die Paketgre wird durch Komprimierung nach dem Schema in Tabelle2.4 auf Seite 66 von 37 Byte auf 29 Byte verringert und das Byte fr diePaketversion im Header wird ebenfalls eingespart. Insgesamt ist ein Paketdann 28 Byte gro. Die Datenbertragungsrate wird auf 115200 Bits erhht.Diese Manahmen krzen die Zeit fr die Datenbertragung von 6,42361 msauf 2,43056 ms.

    16

  • Kapitel 2. Hauptteil

    Gesamtzeit Datenbertragung =Datenmenge

    bertragungsrate

    =280Bit

    115200 Bits= 0,00243056s

    = 2,43056ms

    (2.18)

    Es bleibt noch eine restliche Zeit von 0,109958 ms. Bei 11,0592 MHz dau-ert ein Taktzyklus 0,0904s. Die restliche Zeit reicht demnach fr 1216Single-Cycle Anweisungen.

    Restzeit = 3,90625ms1,365732ms2,43056ms = 0,109958ms (2.19)

    Zeit t =1

    Frequenz f=

    111059200 1s

    = 0,0904s (2.20)

    Dieses Timing ermglicht die Verarbeitung von 16 Kanlen mit einer Ab-tastrate von 256 Hz.

    2.2. Analyse der Firmware fr den ATmega8

    Fr die nderungen des Schaltplans und des Platinenlayouts ist das Ver-stndnis der Arbeitsweise notwendig. Weiterhin muss fr die nderung derFirmware, fr die Verwendung auf einem anderen Mikrocontroller, die Wir-kung jeder Anweisung in der Original-Firmware klar sein. Aus diesen Grn-den erfolgt hier eine detaillierte Analyse der Firmware. Zunchst wird aufdie verwendete Programmiersprache und anschlieend auf die hufig ver-wendeten Anweisungen eingegangen.

    17

  • Kapitel 2. Hauptteil

    2.2.1. Programmiersprache C

    Die Firmware ist in der Programmiersprache C geschrieben. Die Sprache Cwurde von Dennis Ritchie und Brian Kernighan aus der Programmierspra-che B weitermodifiziert, die von Ken Thompson entwickelt wurde. Verf-fentlicht wurde C das erste Mal im Jahr 1978. Der erste Standard namensANSI-C wurde 1989 vom American Nationals Standards Institute festge-legt. Ein paar Elemente aus der Weiterentwicklung von C zu C++ sind inden ISO-Standard C99 von C aus dem Jahre 1999 aufgenommen worden.15

    C ist eine maschinennahe und eine hhere Programmiersprache. Auf dereinen Seite kann mit C hardwareorientiert programmiert und somit die Ei-genschaften einer speziellen Hardware optimal ausgenutzt werden. Und aufder anderen Seite kann ein C Programm, welches nicht so maschinennahprogrammiert ist, auf einer anderen Computerarchitektur oder einem ande-ren Betriebssystem verwendet werden. Dafr muss es aber von einem Com-piler neu bersetzt werden. Der Sprachumfang von C umfasst 31 reservierteWorte und beinhaltet dennoch Elemente aus hheren Programmiersprachen.Weiterhin stehen 40 verschiedene Operatoren fr die Verknpfung von Va-riablen und Zahlen zur Verfgung.16

    Das Hauptprogramm ist wie alle Unterprogramme und Programmmoduleals Funktion realisiert. Wobei das Hauptprogramm die einzige Funktion ist,die sich selbst aufruft. Dieser Selbstaufruf der Funktion main() erfolgt beimProgrammstart.17

    2.2.2. Verwendete Anweisungen

    An dieser Stelle werden verschiedene Anweisungen erklrt, die in der Firm-ware verwendet werden. Dadurch kann bei der Analyse auf die wiederholte

    15vgl. [Bro07b]16vgl. [Bro07b]17vgl. [Bro07b]

    18

  • Kapitel 2. Hauptteil

    Erklrung der Funktionsweise verzichtet werden.Die #include-Anweisung gefolgt von einem Dateinamen bewirkt, dass der

    Inhalt der angegebenen Datei an Stelle der #include-Anweisung in das Pro-gramm geschrieben wird.18

    Mit #define werden symbolische Konstanten definiert. Mit der Anweisung

    # d e f i n e NUMCHANNELS 6

    wird der symbolischen Konstanten NUMCHANNELS der Wert 6 zugewie-sen. NUMCHANNELS steht hier fr die Anzahl der verwendeten A/D-Kanle.Im Programm wird an allen Stellen, an denen die Anzahl der Kanle angege-ben wird, statt der Zahl die symbolische Konstante eingetragen. Der Vorteilvon symbolischen Konstanten ist, dass, bei einer ntigen nderung des Wer-tes, nur an einer zentralen Stelle und nicht im ganzen Programm verstreutder Wert angepasst werden muss. Auerdem wird das Programm dadurchbesser lesbar.19

    Die Funktion outb(ZIEL, WERT) dient der Ausgabe des Wertes WERT inZIEL.20 Diese Funktion wird in der Firmware fr das Schreiben in Registerverwendet.

    Mit inp(PORT) werden Daten vom angegebenen Port gelesen.21

    Die Anweisung BV(BIT) wird durch die eingebundene Datei avr/sfr_defsin (1 (BIT)) umgewandelt.22 Es wird also eine 1 um BIT stellen nach linksverschoben. Die 1 steht dann an genau der Stelle, an der sich das Bit imjeweiligen Register befindet.

    sbi(REGISTER, BIT) ist eine Funktion, die im angegebenen Register das

    18vgl. [Wol06]19vgl. [Wol06]20vgl. [AVR07]21vgl. [AVR07]22vgl. [AVR07]

    19

  • Kapitel 2. Hauptteil

    angegebene Bit auf den Wert 1 setzt.23

    Das gegenteilige wird mit der Funktion cbi(REGISTER, BIT) bewirkt. DasBit wird im Register gelscht, also mit dem Wert 0 versehen.24

    Die folgenden Anweisungen werden bei der bersetzung des Quellpro-gramms in ein ausfhrbares Programm ausgewertet. Anweisungen, die zwi-schen #if defined (__AVR_ATmega8__) und #else stehen werden nur dannbersetzt, wenn das Programm fr einen AVR ATmega8 Mikrocontrollerbersetzt wird. In allen anderen Fllen werden die Anweisungen zwischen#else und #endif bersetzt und somit in das ausfhrbare Programm ber-nommen.

    # i f d e f i n e d ( __AVR_ATmega8__ )/ / Anweisungen# e l s e/ / Anweisungen# e n d i f

    hnliches gilt bei dieser Verzweigung, die jedoch bei der Ausfhrung desProgramms und nicht bei der bersetzung des Programms ausgewertet wird.Diesmal mssen die jeweiligen Anweisungen, die ausgefhrt werden sollen,in geschweifte Klammern gefasst werden. Ist die BEDINGUNG erfllt25,dann werden die Anweisungen zwischen den Klammern nach if(BEDINGUNG)ausgefhrt.

    i f (BEDINGUNG){/ / Anweisungen}e l s e{/ / Anweisungen

    23vgl. [AVR07]24vgl. [AVR07]25wahr oder 1

    20

  • Kapitel 2. Hauptteil

    }

    Das waren die Anweisungen, die am hufigsten in der Firmware verwen-det werden. Die restlichen werden in der nun folgenden Analyse der Firm-ware beschrieben.

    2.2.3. Analyse

    Die Analyse der Original-Firmware findet in der Reihenfolge des Programm-ablaufs statt. Die Anweisungen, die im Abschnitt Definitionen dargestelltsind, werden sogar schon vor dem eigentlichen Programmstart beim ber-setzen des Quelltextes in ein ausfhrbares Programm abgearbeitet. Die An-weisungen, die bei jeder Ausfhrung eines Programms als erstes ausgefhrtwerden, stehen in der Hauptfunktion main(), welche sich beim Programm-start selbst aufruft.

    In dieser Analyse wird nur erlutert, was durch welche Anweisung bewirktwird. Auf die Darstellung von weiteren Optionen, welche mit den Registernnoch konfiguriert werden knnen, wird hier verzichtet, da dies im Rahmendieser Arbeit nicht zu leisten ist. Die Konzentration liegt auf der Funktions-weise der Firmware.

    Definitionen

    Der Inhalt der folgenden Dateien wird bei der bersetzung in das Programmeingebunden. Da diese Dateien zum Teil auch #inlude-Anweisungen mitweiteren Dateien enthalten und nicht alle Dateien fr das Verstndnis desProgramms erwhnt werden mssen, werden hier nicht alle Dateien behan-delt.

    # i n c l u d e < a v r / i o . h># i n c l u d e < i n t t y p e s . h># i n c l u d e < a v r / i n t e r r u p t . h>

    21

  • Kapitel 2. Hauptteil

    # i n c l u d e < a v r / s i g n a l . h>

    Die Datei avr/io.h bindet die fr den Mikrocontroller entsprechenden IO-Definitionen in das Programm ein. Dazu gehren die folgenden weiterenDateien. Die Datei avr/iom8.h wird nur eingebunden, wenn das Programmfr einen AVR ATmega8-Mikrocontroller bersetzt wird. Mit einer ganzenReihe von solchen Bedingungen in der Datei avr/io.h wird fr jeden Mikro-controller die richtige IO-Definitions Datei gefunden.26

    # i n c l u d e < a v r / s f r _ d e f s . h># e l i f d e f i n e d ( __AVR_ATmega8__ )# i n c l u d e < a v r / iom8 . h># e n d i f# i n c l u d e < a v r / p o r t p i n s . h># i n c l u d e < a v r / common . h># i n c l u d e < a v r / v e r s i o n . h># i n c l u d e < a v r / f u s e . h># i n c l u d e < a v r / l o c k . h>

    avr/sfr_defs.h beinhaltet die Definitionen fr die Funktionen, mit denen aufdie Special Function Register zugegriffen werden kann. Darunter ist auchdie oben erwhnte Funktion BV(). Dadurch wird eine Abstraction von denspezifischen AVR Anweisungen fr den Zugriff auf die Register mit Spezial-funktionen erreicht. So kann zum Beispiel im Programm direkt auf PORTAzugegriffen werden. Der Compiler ersetzt beim bersetzen PORTA durchden Funktionsaufruf _SFR_IO8(0x02) mit der zugehrigen Adresse fr PortA.

    # d e f i n e PORTA _SFR_IO8 (0 x02 )

    In der Datei avr/iom8.h wird unter anderem zu jedem Registernamen die zu-gehrige Speicheradresse und zu jedem Bitnamen die zugehrige Bitpositionim Register definiert.27

    26vgl. [MWW07]27vgl. [Mic02]

    22

  • Kapitel 2. Hauptteil

    Als nchstes folgt die Definition der symbolischen Konstanten. NUM-CHANNELS steht fr die Anzahl der A/D-Kanle, HEADERLEN fr dieLnge des Paket-Headers in Byte und PACKETLEN fr die Lnge des Da-tenpaketes insgesamt. Die Paketlnge setzt sich aus zwei Byte fr jeden Ka-nal plus der Lnge des Paketheaders plus einem Byte fr den Paket-Footerzusammen. SAMPFREQ steht fr die Abtastrate und TIMER0VAL fr denWert, den der Timer 0 erhlt, um die Abtastrate zu realisieren. Die Zahl7372800 in TIMER0VAL ist die Frequenz des Quarzes, der die Taktfrequenzdes Mikrocontrollers bestimmt. Die detaillierte Beschreibung der Berech-nung von TIMER0VAL findet sich weiter unten auf Seite 31.

    # d e f i n e NUMCHANNELS 6# d e f i n e HEADERLEN 4# d e f i n e PACKETLEN (NUMCHANNELS * 2 + HEADERLEN + 1)# d e f i n e SAMPFREQ 256# d e f i n e TIMER0VAL 256 ( (7372800 / 256) / SAMPFREQ)

    Nun folgen einige Variablen, die fr das ganze Programm gltig sind.channel_order[] ist eine konstante28 Liste aus Werten vom Datentyp char.Die Liste legt fest, in welcher Reihenfolge die A/D-Kanle bearbeitet wer-den. Die Reihenfolge entspricht der Zuordnung der Kanle zu den Analog-Platinen. Kanal 0 und 3 sind auf der ersten Platine, 1 und 4 auf der zweitenund 2 und 5 auf der dritten Analog-Platine.

    Der Datentyp char ist ein Byte gro und kann fr einzelne Zeichen oderfr Ganzzahlen zwischen -128 und +127 verwendet werden.29

    TXBuf ist ebenfalls eine Liste. Diese Liste dient als Puffer fr die Paket-daten, die diesmal vom Datentyp uint8_t sind. Die Lnge, also die Gre desPuffers, wird durch PACKETLEN festgelegt.

    28const29vgl. [Wol06]

    23

  • Kapitel 2. Hauptteil

    Das Schlsselwort volatile bewirkt, dass der Wert einer Variablen bei je-dem Zugriff neu aus dem Speicher gelesen wird und der Compiler beimbersetzen des Programms keine Optimierungen an diesem Variablenzugriffvornimmt.30

    Weiterhin bewirkt volatile, dass die Variable im Speicher und nicht ineinem Register gespeichert wird. Dies ist notwendig, wenn mit, in einemC-Programm eingebetteten, Assembler-Anweisungen auf die Variable zuge-griffen werden soll.31

    uint8_t steht fr unsigned integer 8 bit type und kann fr vorzeichenlose,also nur positive, Ganzzahlen von 0255 verwendet werden.32

    Die Variable TXIndex wird zur Indizierung des Paketpuffers und Cur-rentCh wird zur Indizierung der Kanalliste verwendet.

    c h a r c o n s t c h a n n e l _ o r d e r [ ] = { 0 , 3 , 1 , 4 , 2 , 5 } ;

    / * * The t r a n sm i s s i o n p a ck e t * /v o l a t i l e u i n t 8 _ t TXBuf [PACKETLEN ] ;

    / * * Next by t e t o r e ad o r w r i t e i n t h e t r a n sm i s s i o n p a ck e t . * /v o l a t i l e u i n t 8 _ t TXIndex ;

    / * * Cu r r e n t c h anne l be i ng sampled . * /v o l a t i l e u i n t 8 _ t Cur ren tCh ;

    Initialisierung in der Hauptfunktion

    In diesem Abschnitt werden die Anweisungen analysiert, die beim Programm-start einmalig ausgefhrt werden.

    Zuerst werden die ersten vier Byte des Textpuffers geschrieben. In die ers-ten zwei Byte kommen Werte fr die Synchronisierung mit der Software. Die30vgl. [Wol06]31vgl. [Fli01]32vgl. [AVR07]

    24

  • Kapitel 2. Hauptteil

    Software kann anhand dieser aufeinanderfolgenden und festgelegten Werteden Anfang eines Datenpaketes erkennen. Im dritten Byte des Puffers wirddie Nummer der Paketversion untergebracht. Dies zeigt der Software an, inwelcher Reihenfolge die Daten in einem Datenpaket gespeichert sind. Unddas vierte Byte enthlt einen Zhler fr die Pakete von 0255, der bei jedemPaket um eins hochgezhlt wird. Hier wird der Paketzhler mit 0 initialisiert.

    / / Wr i t e p a ck e t h e ade r and f o o t e rTXBuf [ 0 ] = 0 xa5 ; / / Sync 0TXBuf [ 1 ] = 0 x5a ; / / Sync 1TXBuf [ 2 ] = 2 ; / / P r o t o c o l v e r s i o nTXBuf [ 3 ] = 0 ; / / P a cke t c o u n t e r

    Danach werden die Ports D und B initialisiert:DDRD ist das Data Direction Register fr Port D. Analog dazu ist DDRBfr Port B. Diese Register legen fr die einzelnen Pins am jeweiligen Portfest, ob diese als Eingang oder als Ausgang verwendet werden sollen. Durchsetzen eines Bits auf 1 wird der zugehrige Pin als Ausgang definiert. DieRegister werden mit 0 initialisiert. Daher sind alle Pins von allen IO-Portsbeim Programmstart als Eingang konfiguriert.33

    Hier werden die Pins PD7, PD6 und PD1 von Port D und die Pins PB2,PB1 und PB0 von Port B als Ausgang umkonfiguriert.

    ou tb (DDRD, 0 xc2 ) ;ou tb (DDRB, 0x07 ) ;

    PORTD steht fr das Port D Data Register. Durch die folgenden Anwei-sungen werden fr alle Pins an Port D und Port B, die als Eingang konfigu-riert sind, interne Pull-up Widerstnde aktiviert.34

    ou tb (PORTD, 0 x f f ) ;

    33vgl. [Atm07b]34vgl. [Atm07b]

    25

  • Kapitel 2. Hauptteil

    ou tb (PORTB, 0 x f f ) ;

    Als nchstes wird als Sleep Mode Idle ausgewhlt:MCUCR ist das MCU Control Register, SE ist das Sleep Enable Bit undSM2SM0 sind die Sleep Mode Bits. Im Idle Mode wird die CPU gestoppt,aber SPI, USART, A/D-Wandler, Timer und Interrupts funktionieren weiter.So kann der Mikrocontroller durch Interrupts geweckt werden, die in dieserFirmware vom USART, dem A/D-Wandler, dem Timer 0 und dem Timer 1ausgelst werden.35

    ou tb (MCUCR,( i n p (MCUCR) | BV( SE ) ) & (~BV(SM0) | ~BV(SM1) | ~BV(SM2 ) ) ) ;

    Nun erfolgt die Initialisierung des A/D-Wandlers:ADMUX ist das ADC Multiplexer Selection Register, in dem die MUX0-MUX5 Bits, die REFS0 + REFS1 Bits und das ADLAR Bit. Diese Bits wer-den beim Einschalten mit 0 initialisiert. ber die MUX Bits wird der Kanalund mit den REFS Bits die Quelle der Referenzspannung fr die nchsteA/D-Wandlung festgelegt. REFS steht fr Reference Selection Bits und AD-LAR fr ADC Left Adjust Result. Als Quelle fr die Referenzspannung wirdder Pin AREF ausgewhlt. ADCH und ADCL sind die Datenregister in de-nen das Ergebnis der A/D-Wandlung gespeichert wird. Das ADLAR Bit legtdie Sortierung der Daten in den Datenregistern fest. Durch ADLAR = 0 wer-den die Bits 9 und 8 in ADCH und die Bits 7 bis 0 in ADCL gespeichert.Durch setzten des ganzen Registers ADMUX auf 0 wird auch der Kanal 0 frdie erste A/D-Wandlung ausgewhlt.36

    ADCSR steht fr ADC Control and Status Register, ADPS2-ADPS0 sinddie ADC Prescaler Select Bits, ADIF ist das ADC Interrupt Flag und ADENist das ADC Interrupt Enable Bit. Durch setzen der ADPS2 und des ADPS1

    35vgl. [Atm07b]36vgl. [Atm07b]

    26

  • Kapitel 2. Hauptteil

    Bits auf 1 wird der Prescaler fr den A/D-Wandler auf 64 eingestellt. DasADIF Bit zeigt einen bestehenden Interrupt des A/D-Wandlers an, wenn es0 ist. Wird es auf 1 gesetzt, werden die Interrupts zurck gesetzt. Mit ADENwird der A/D-Wandler eingeschaltet.37

    ou tb (ADMUX, 0 ) ; / / S e l e c t c h anne l 0/ / P r e s c a l e r = 64 , f r e e r unn i ng mode = o f f , i n t e r r u p t s o f f .ou tb (ADCSR, BV(ADPS2) | BV(ADPS1 ) ) ;s b i (ADCSR, ADIF ) ; / / Re se t any pend ing ADC i n t e r r u p t ss b i (ADCSR, ADEN) ; / / Enab le t h e ADC

    Initialisierung des USART:Der Wert 7, der fr eine bertragungsrate von 57600 Bits , in die USART BaudRate Register UBRRL und UBRRH geschrieben werden muss resultiert ausGleichung 2.21. UCSRA bis UCSRC sind die USART Control and StatusRegister.38

    UBRR =Systemtakt f requenz16 bertragunsrate 1

    =7372800 1s

    16 57600 Bits1

    = 7

    (2.21)

    Im UCSRA Register wird nur ein Bit bei der Systemstart mit 1 initiali-siert. Das ist das USART Data Register Empty Bit, welches anzeigt, ob derSendepuffer leer ist. Ist das Bit 1, kann ein Interrupt ausgelst werden. Daswird durch lschen des Bits verhindert.

    Das Register UCSRC teilt sich eine Speicheradresse mit dem UBRRHRegister. Durch wenn das USART Register Select Bit URSEL in der Anwei-

    37vgl. [Atm07b]38vgl. [Atm07b]

    27

  • Kapitel 2. Hauptteil

    sung 1 ist, wird in das UCSRC geschrieben. Die USART Character Size BitsUCSZ2UCSZ0 legen durch setzten von UCSZ1 und UCSZ0 auf 1 fest, dassacht Datenbits pro Frame bertragen werden. Ein Frame beginnt mit einemStart-Bit und endet mit einem Stop-Bit.

    TXEN heit Transmitter Enable und aktiviert den USART Sender.39

    # i f d e f i n e d ( __AVR_ATmega8__ )ou tb (UBRRH, 0 ) ; / / S e t speed t o 57600 bpsou tb (UBRRL, 7 ) ;ou tb (UCSRA, 0 ) ;ou tb (UCSRC, BV(URSEL) | BV(UCSZ1) | BV(UCSZ0 ) ) ;ou tb (UCSRB, BV(TXEN ) ) ;

    Jetzt wird der Timer 0 fr die Abtastrate initialisiert:TCNT0 ist das Timer/Counter 0 Register, das dessen Zhlwert enthlt. DerZhler wird gelscht. TCCR0 steht fr Timer/Counter 0 Control Registerwelches nur drei Clock Select Bits (CS02 bis CS00) enthlt. Diese Bits le-gen die Quelle fr den Zhlertakt fest, die hier auf den Systemtakt mit einemPrescaler von 256 eingestellt wird. Durch Auswahl der Quelle wird der Zh-ler gestartet. Wenn das Timer/Counter 0 Overflow Flag TOIE0 im Timer/-Counter Interrupt Mask Register TIMSK auf 1 gesetzt wird und globale In-terrupts aktiviert sind, dann ist der Timer 0 berlauf Interrupt eingeschaltet.Dass heit, dass unter dieser Voraussetzung beim nchsten Timer 0 berlaufein Interrupt ausgelst wrde. Globale Interrupts sind zu diesem Zeitpunktnoch nicht aktiviert.40

    / / I n i t i a l i z e t ime r 0ou tb (TCNT0 , 0 ) ; / / C l e a r i t .ou tb (TCCR0 , 4 ) ; / / S t a r t i t . F requency = c l k / 256ou tb (TIMSK , BV( TOIE0 ) ) ; / / Enab le t h e i n t e r r u p t s .

    39vgl. [Atm07b]40vgl. [Atm07b]

    28

  • Kapitel 2. Hauptteil

    Danach folgt optional die Initialisierung des PWM Signals durch den Auf-ruf der Funktion pwm_init():

    / / I n i t i a l i z e PWM ( o p t i o n a l )pwm_ini t ( ) ;

    Der folgende Funktionsaufruf ist in der Datei interrupt.h definiert, die zuBeginn eingebunden wurde. Die Definition wandelt diesen in einen Inline-Assembler-Aufruf um, der wiederrum in [Atm05] beschrieben ist. Letztend-lich wird durch diese Anweisung das Global Interrupt Flag im Status Re-gister des Mikrocontrollers gesetzt und dadurch werden globale Interruptsaktiviert. Beim nchsten berlauf von Timer 0 wird somit der Timer 0 Over-flow Interrupt ausgelst.

    s e i ( ) ;

    Zum Abschluss der Initialisierungsphase wird der Prozessor angehalten,in dem der Mikrocontroller in den Schlaf-Modus versetzt wird. Es handeltsich hier wieder um eine Inline-Assembler-Anweisung, die hier in einerEndlos-Schleife ausgefhrt wird. Der Mikrocontroller wird immer wiederin den Schlaf-Modus versetzt.

    w h i l e ( 1 ){

    __asm__ _ _ v o l a t i l e _ _ ("sleep" ) ;}

    PWM-Testsignal

    Fr das PWM-Testsignal wird der Timer 1 verwendet. Die Anweisungenin diesem Abschnitt werden durch den Funktionsaufruf pwm_init() in derHauptfunktion ausgefhrt.

    29

  • Kapitel 2. Hauptteil

    OCR1A bedeutet Output Compare Register A fr Timer 1. Der Wert inden Registern OCR1AH und OCR1AL wird stndig mit dem Zhlerwert desTimers 1 verglichen. Durch die Timer/Counter 1 Control Register TCCR1Aund TCCR1B wird die Funktion des Timers konfiguriert. WGM steht fr Wa-veform Generation Mode. Die Bits WGM13 bis WGM10 legen den Funkti-onsmodus des Timer 1 fest. Durch setzten der Bits WGM11 und WGM10 auf1 wird der phasenkorrekte 10-Bit PWM Modus ausgewhlt. Durch die Bit-kombination der Compare Output Mode Bits COM1A1 und COM1A0 mitCOM1A1 = 1 und COM1A0 = 0 wird festgelegt, dass der Pin OC1A, beibereinstimmung von OCR1A mit dem Zhlerwert, beim Hochzhlen desTimers auf 0 und beim Runterzhlen auf 1 gesetzt wird. Der Zhler 1 zhltin dieser Konfiguration von 0 bis 1023 hoch und dann wieder bis 0 runter.Wenn er den Wert 512 erreicht, wird beim hochzhlen OC1A auf 0 und beimrunterzhlen auf 1 gesetzt. CS steht fr Clock Select. Durch setzen von CS12auf 1 wird als Quelle fr den Timer 1 der Prescaler mit einer Einstellung von256 gewhlt. Nach Gleichung 2.22 betrgt die Frequenz des Signals, durchFestlegen des Vergleichswertes auf die Mitte des Wertebereiches, 14,076 Hz.Der Wert 2046 kommt dadurch zustande, dass der Pin nur bei jeder zweitenbereinstimmung umgeschaltet wird.41

    PWM-Frequenz =Systemtakt f requenz

    Prescaler2046

    =7372800 1s

    2562046

    = 14,0761s

    (2.22)

    # i f d e f i n e d ( __AVR_ATmega8__ )ou tb (OCR1AH, 2 ) ; / / S e t OCR1A = 512

    41vgl. [Atm07b]

    30

  • Kapitel 2. Hauptteil

    ou tb (OCR1AL , 0 ) ;/ / S e t 10 b i t PWM modeou tb (TCCR1A, BV(COM1A1) + BV(WGM11) + BV(WGM10) ) ;/ / S t a r t and l e t run a t c l k / 256 Hz .ou tb (TCCR1B , (1

  • Kapitel 2. Hauptteil

    Abtastrate =Timer 0 Frequenz

    Zhlerschritte bis berlauf

    =28800 1s

    256

    = 112,51s

    (2.24)

    Zhlerschritte bis berlauf =Timer 0 Frequenz

    Abtastrate

    =28800 1s

    256

    = 112,51s

    (2.25)

    / / Re se t t im e r t o g e t c o r r e c t s amp l ing f r e qu en cy .ou tb (TCNT0 , TIMER0VAL ) ;

    Die folgenden Anweisungen setzen den Index fr die Kanalliste auf 0 zu-rck, erhhen den Paketzhler im Datenpuffer um 1 und schreiben in dasletzte Byte des Puffers die digitalen Werte von Port D. Diese Werte wer-den um zwei Stellen nach rechts verschoben um die Werte von PD5 bisPD2 rechtsbndig zu haben. Anschlieend wird noch mit 0x0F maskiert.Das heit, dass alle bis auf die rechten vier Bits gelscht werden.

    Curren tCh = 0 ;/ / Wr i t e h eade r and f o o t e r :/ / I n c r e a s e p a ck e t c o u n t e r ( f o u r t h by t e i n heade r )TXBuf [ 3 ] + + ;/ / Get s t a t e o f sw i t c h e s on PD2 . . 5 ,/ / i f any ( l a s t by t e i n p a ck e t ) .TXBuf [2 * NUMCHANNELS + HEADERLEN] = ( i n p ( PIND ) >> 2) &0x0F ;

    32

  • Kapitel 2. Hauptteil

    Als letztes wird in dieser Interruptroutine, durch lschen und setzen vonverschiedenen Interupts, sichergestellt, welche Interruptroutine als nchs-tes ausgefhrt wird. UDRIE ist das USART Data Register Empty InterruptEnable Bit, welches hier gelscht wird, um einen USART Interrupt zu ver-hindern. Durch Setzen des ADIF auf 1 werden bestehende A/D-Wandler-Interrupts gelscht und mit dem ADC Interrupt Enable Bit ADIE wird einA/D-Interrupt ausgelst, der als Anzeige fr eine abgeschlossene A/D-Wandlungdient.43

    c b i (UCSRB, UDRIE ) ; / / Ensure UART IRQ s a r e d i s a b l e d .s b i (ADCSR, ADIF ) ; / / Re se t any pend ing ADC i n t e r r u p t ss b i (ADCSR, ADIE ) ; / / Enab le ADC i n t e r r u p t s .

    A/D-Wandlung

    Die Interruptroutine SIGNAL(SIG_ADC) reagiert auf den Interrupt, der eineabgeschlossene A/D-Wandlung anzeigt.44 Diese Funktion wird immer wie-der von neuem aufgerufen, bis das ADIE Bit gelscht wird.

    Zunchst wird eine lokale Variable mit Namen i deklariert, die zur Indi-zierung der Datenbytes im Puffer dient. Diese Variable ist nur in dieser Inter-ruptroutine gltig und wird bei jedem Aufruf neu berechnet. Fr den erstenDurchlauf hat sie den Wert 4. Mit den folgenden Anweisungen werden dieuntersten acht Bit des Ergebnisses der letzten A/D-Wandlung in das sechsteByte und die restlichen zwei Bit in das fnfte Byte des Puffers geschrieben.Anschlieend wird der Index fr die Kanalliste um eins erhht.

    v o l a t i l e u i n t 8 _ t i ;i = 2 * Cur ren tCh + HEADERLEN;TXBuf [ i +1] = i n p (ADCL ) ;TXBuf [ i ] = i n p (ADCH) ;

    43vgl. [Atm07b]44vgl. [AVR07]

    33

  • Kapitel 2. Hauptteil

    Curren tCh ++;

    Wenn der Index fr die Kanalliste kleiner ist als die Anzahl der Kanle,wurden noch nicht alle Kanle verarbeitet. In diesem Fall wird der Wert frden nchsten Kanal in den A/D-Wandler-Multiplexer gespeichert und somitausgewhlt. Sind alle Kanle verarbeitet worden, so wird wieder der Kanal0 als erster Kanal ausgewhlt und der A/D-Wandler-Interrupt deaktiviert.Dann wird das erste Byte des Puffers in das USART Daten Register UDRgeschrieben, der USART-Interrupt aktiviert und der Index fr den Puffer auf1 gesetzt. Durch das schreiben der Daten in den das UDR Register werdendie Daten gesendet.

    i f ( Cur ren tCh < NUMCHANNELS){

    / / S e l e c t t h e nex t ch anne l .ou tb (ADMUX, c h a n n e l _ o r d e r [ Cur ren tCh ] ) ;/ / The nex t s amp l ing i s s t a r t e d a u t om a t i c a l l y .

    }e l s e{

    / / P r e p a r e n ex t conve r s i on , on channe l 0 .ou tb (ADMUX, c h a n n e l _ o r d e r [ 0 ] ) ;/ / D i s a b l e ADC i n t e r r u p t s t o p r e v e n t

    / / f u r t h e r c a l l s t o SIG_ADC .c b i (ADCSR, ADIE ) ;/ / Hand ove r t o SIG_UART_DATA, by s t a r t i n g/ / t h e UART t r a n s f e r and e n a b l i n g UDR IRQ s .ou tb (UDR, TXBuf [ 0 ] ) ;s b i (UCSRB, UDRIE ) ;TXIndex = 1 ;

    }

    34

  • Kapitel 2. Hauptteil

    Datenbertragung

    In der Interruptroutine fr den A/D-Wandler wird der USART Data RegisterEmpty Interrupt aktiviert, durch den die die Interruptroutine fr die Daten-bertragung aufgerufen wird. Zuerst wird das nchste Byte an Daten ber-tragen, dann wird der Index fr den Puffer um 1 erhht und danach wirdberprft, ob alle Daten fr ein Paket gesendet wurden. Wenn alle Daten ge-sendet wurden, wird der USART Data Register Empty Interrupt deaktiviert.Durch den nchsten Timer 0 berlauf wird dann wieder die Interruptroutinefr die Abtastrate45 aufgerufen und der Zyklus beginnt von vorne. Ansons-ten wird diese Funktion solange wieder aufgerufen, bis alle Daten gesendetwurden.46

    SIGNAL(SIG_UART_DATA){

    ou tb (UDR, TXBuf [ TXIndex ] ) ; / / Send nex t by t eTXIndex ++;

    / / See i f we r e done wi th t h i s p a ck e ti f ( TXIndex == PACKETLEN){

    / / D i s a b l e SIG_UART_DATA i n t e r r u p t s .c b i (UCSRB, UDRIE ) ;/ / Next i n t e r r u p t w i l l be a SIG_OVERFLOW0 .

    }}

    2.3. Schaltplannderungen

    Neben der Original-Firmware stehen auch die Schaltplne der Platinen imInternet zum Download zur Verfgung. Die Schaltplne wurden mit Eagle

    45siehe Seite 3146vgl. [Atm07b]

    35

  • Kapitel 2. Hauptteil

    gezeichnet. Dieses Programm ist in einer eingeschrnkten Version kostenlosim Internet erhltlich. Fr die Herstellung einer Platine wird das Platinen-Layout bentigt. Eagle verknpft den Schaltplan mit dem Layout und siehtvor, dass zuerst der Schaltplan und dann das Layout fertiggestellt wird.

    Die Abbildung 2.2 zeigt den Original-Schaltplan, in dem noch der Mikro-controller AT90S4433P verwendet wird. Dieser Mikrocontroller wurde vonAtmel durch den ATmega8 ersetzt. Diese beiden Mikrocontroller haben diegleiche Pin-Konfiguration. In Abbildung 2.3 ist der genderte Schaltplan mitdem ATmega1280 Mikrocontroller dargestellt. Um Platz fr den Mikrocon-troller zu schaffen werden die umliegenden Schaltungsteile verschoben.

    Die Belegung von J102 wird nicht grundlegend gendert, um die Kom-patibilitt zum Original-Modular-EEG zu erhalten. Die Zuordnung der Pinsin J102 wird an die Pin-Konfiguration des ATmega1280, unter Bercksichti-gung der Lage jedes Pin am Gehuse, angepasst. Die Funktionsweise bleibtaufgrund der folgenden Anpassungen in der Firmware die gleiche. So wer-den die A/D-Kanle 1015 anstelle der Kanle 05 an J102 angeschlossen.

    Die Digital-Eingnge PD2PD5 werden durch PA3PA6 ersetzt. Bei dendigitalen Ausgngen wird die alternative Port-Funktion bei der Auswahlder Pins teilweise mit bercksichtigt. Dies ist besonders wichtig bei PB1,der die alternative Port-Funktion fr den Output Compare Pin von Timer1 hat und das PWM-Signal hier ausgegeben wird. Die alternativen Port-Funktionen werden in der Pin-Konfiguration in Klammern dargestellt. DiePin-Konfiguration des ATmega8 ist in Abbildung 2.4, die des ATmega1280in Abbildung 2.5 zu sehen. PB0 und PB2 werden aufgrund der alternativenPort-Funktionen ICP1 und OC1B anderen Ports zugewiesen, die die selbe al-ternative Funktion haben. PB0 wird PD4, PB1 wird PB5 und PB2 wird PB6.Bei den anderen Digital-Ausgngen, die mit J102 verbunden sind, kann ir-gend ein Port verwendet werden. PD7 wird PD5.

    Die Programmier-Schnittstelle J101 wird entsprechend der alternativenPort-Funktionen von MISO, MOSI, SCK und /RESET mit PB1PB3 und dem

    36

  • Kapitel 2. Hauptteil

    Reset-Pin verbunden.Eine weitere Schnittstelle J103 wird eingefgt um die erweiterten A/D-

    Kanle anschlieen zu knnen. Dabei ist bercksichtigt, dass die Kanle05 ber ein Flachbandkabel mit drei Analog-Platinen verbunden werdenkann und dabei auch die Versorgungsspannungen fr die Analog-Platinenmit gefhrt werden. Es bleiben noch vier Kanle brig, die auf zwei Analog-Platinen verteilt werden knnen. Dabei ist darauf zu achten, dass bei demVerbindungskabel, auf der Seite der Analog-Platinen eine Reihe zwischenADC7 und ADC8 frei bleiben muss, um die Zuordnung der Kanle zu denAnalog-Platinen nach dem bisherigen Schema beizubehalten.

    Fr jeden A/D-Kanal ist ein RC-Tiefpass vorhanden.

    2.4. Platinenlayout

    Da die kostenlose Eagle-Version nur Platinengren bis 10 cm x 8 cm er-laubt, werden die Mae hier nicht berschritten. Dadurch wird Sicherge-stellt, dass andere Entwicklern im OpenEEG-Projekt die Mglichkeit ha-ben das Platinen-Layout zu ndern. Die Original-Platine erfllt bereits dieseMaximal-Mae.

    Aus Platzgrnden wurden einige Widerstnde und Kondensatoren durchSMD-Bauteile ersetzt. Dies sind alle 470 Vorwiderstnde an J102, alle7,5kWiderstnde fr den RC-Tiefpass an den A/D-Kanlen und ein 10kWiderstand. Die ersetzten Kondensatoren, mit 220nF sind diejenigen, wel-che zum RC-Tiefpass gehren.

    Die folgenden Abbildungen zeigen die Vernderung des Platinenlayouts.Abbildung 2.6 zeigt das Original-Layout von der Oberseite. Entsprechendist in Abbildung 2.7 das neue Layout zu sehen.

    Die selbe Reihenfolge fr die Unterseite, erst das Original in Abbildung2.8, dann das neue Layout in Abbildung 2.9.

    37

  • Kapitel 2. Hauptteil

    Abbildung 2.2.: Original-Schaltplan der Digital-Platine des Modular-EEG(Quelle: [Pro])

    38

  • Kapitel 2. Hauptteil

    Abbildung 2.3.: Schaltplan mit ATmega1280

    39

  • Kapitel 2. Hauptteil

    Abbildung 2.4.: Pin-Konfigurartion des ATmega8 (Quelle: [Atm07b])

    2.5. Bauteile

    Da der ATmega1280 mit einem Abstand von 5 mil zwischen den Pins sehrfiligran ist, hat sich bei der Bestellung der Platine herausgestellt, das nicht je-de Firma eine solche Platine fertigen kann. Die meisten Firmen geben einenMindestabstand von 6 mil fr die Fertigung an. Ein mil entspricht einem tau-sendstel inch, also 0,0254 mm.

    Die leere Platine ist in den Abbildungen 2.10 und 2.11 zu sehen.Im Internet 47 kann ein Archiv heruntergeladen werden, in dem neben den

    Schaltplnen auch Bauteilelisten enthalten sind. In den Listen sind auch dieBestellnummern von mehreren Lieferanten hinterlegt.

    Die Bauteile, die nicht in den Listen aus dem Projekt stehen sind dieSMD-Bauteile. Nach Rcksprache mit Joerg Hansmann48 werden fr dieSMD-Widerstnde 0,125 Watt-Typen in der Bauform 0805 verwendet. Die

    47http://sourceforge.net/project/showfiles.php?group_id=3581748einem der Entwickler des Modular-EEG

    40

  • Kapitel 2. Hauptteil

    Abbildung 2.5.: Pin-Konfigurartion des ATmega1280 (Quelle: [Atm07a])

    41

  • Kapitel 2. Hauptteil

    Abbildung 2.6.: Oberseite des Original-Layout (Quelle: [Pro])

    Abbildung 2.7.: Oberseite des Layout fr ATmega1280

    42

  • Kapitel 2. Hauptteil

    Abbildung 2.8.: Unterseite des Original-Layout (Quelle: [Pro])

    Abbildung 2.9.: Unterseite des Layout fr ATmega1280

    43

  • Kapitel 2. Hauptteil

    Kondensatoren sind in der Bauform 1206. Fr den Mikrocontroller kann einATmega1280, ein ATmega640 oder ein ATmega2560 verwendet werden.

    Die Abbildungen 2.12 und 2.13 zeigen die bestckte Platine.

    Abbildung 2.10.: Oberseite der leeren Platine

    44

  • Kapitel 2. Hauptteil

    Abbildung 2.11.: Unterseite der leeren Platine

    2.6. Firmware

    Zunchst wird die Firmware fr das 6-Kanal-EEG fr den ATmega1280 ge-ndert. Dies hat den Vorteil, dass die Platine mit der bisherigen Software ausdem OpenEEG-Projekt getestet werden kann. Anschlieend wird die Firm-ware fr 16-Kanal Betrieb angepasst.

    2.6.1. Firmware fr 6-Kanal-EEG mit ATmega1280

    Die nderung der Firmware erfolgt in mehreren Schritten. Im ersten Schrittwerden alle Bezeichner an den ATmega1280 angepasst. Dazu gehren zumBeispiel die Bezeichnungen der Register, der Bits in den Registern und derInterrupts. Der zweite Schritt wird dadurch notwendig, dass der aktuelleAVR-Compiler AVR-GCC v4.2.2 eine Vielzahl von Fehlern anzeigt. EinBeispiel fr einen solchen Fehler sieht so aus: undefined reference to outb.Diese Fehler kommen durch Anweisungen zustande, die in Programmen

    45

  • Kapitel 2. Hauptteil

    Abbildung 2.12.: Oberseite der bestckten Platine

    Abbildung 2.13.: Unterseite der bestckten Platine

    46

  • Kapitel 2. Hauptteil

    nicht mehr verwendet werden sollen.Die Anweisungen, die der Compiler bemngelt, sind:

    s b i ( R e g i s t e r , B i t ) ;c b i ( R e g i s t e r , B i t ) ;i n p ( R e g i s t e r ) ;ou tb ( Z i e l , Wert ) ;

    Um die nderungen am Code deutlich sichtbar zu machen, wird pro n-derung zuerst der Code aus der Original Firmware fr den ATmega8 unddarunter der Code fr die Firmware fr den ATmega1280 abgebildet. Frden ATmega1280 sind jeweils zwei Zeilen Code angegeben, wobei die obe-re, auskommentierte Zeile, aus der nderung im ersten Schritt stammt unddie zweite Zeile den endgltigen Code beinhaltet. Die Reihenfolge der n-derungen entspricht, wie bei der Analyse der Firmware, der Reihenfolge desProgrammablaufs. Eine detaillierte Beschreibung der Firmware befindet sichim Abschnitt Analyse der Firmware. Die komplette 6-Kanal-EEG-Firmwarefr den ATmega1280 befindet sich im Anhang. Die Zeilen fr die Kompati-bilitt mit dem AT90S4434 werden hier nicht bercksichtigt.

    Definitionen

    Die Headerdatei avr/signal.h soll laut Compiler nicht mehr verwendet wer-den. Statt dessen soll avr/interrupt.h eingebunden werden. Da diese schoneingebunden ist, reicht es, die Anweisung

    # i n c l u d e < a v r / s i g n a l . h>

    auszukommentieren.

    / / # i n c l u d e < av r / s i g n a l . h>

    Die Berechnung der Konstanten TIMER0VAL beinhaltet die Taktfrequenzdes Mikrocontrollers. Da der ATmega1280 hier mit 11,0592 MHz und nicht

    47

  • Kapitel 2. Hauptteil

    wie der ATmega8 mit 7,372800 MHz getaktet wird, muss der Wert 7372800in

    # d e f i n e TIMER0VAL 256 ( (7372800 / 256) / SAMPFREQ)

    auf 11059200 gendert werden. TIMER0VAL ist der Wert, der fr den Timer0 eingestellt wird, um eine Abtastrate von 256 Hz zu generieren.

    # d e f i n e TIMER0VAL 256 ( (11059200 / 256) / SAMPFREQ)

    Die Reihenfolge der Kanle wird dahingehend angepasst, dass nun dieA/D-Kanle 1015 an J102 angeschlossen sind und nicht mehr die Kanle05. Diese nderung hat sich durch das Platinenlayout ergeben.Alt:

    c h a r c o n s t c h a n n e l _ o r d e r [ ] = { 0 , 3 , 1 , 4 , 2 , 5 } ;

    Neu:

    c h a r c o n s t c h a n n e l _ o r d e r [ ] = { 10 , 13 , 11 , 14 , 12 , 15 } ;

    Die Kanalreihenfolge entspricht der Kanalzuordnung auf den Analog-Platinen.Kanal 10 und Kanal 13 entsprechen zwei Kanlen auf der selben Analog-Platine.

    Main-Funktion

    Da der ATmega8 nur drei Ports und der ATmega1280 elf Ports hat, muss dieKonfiguration der Ports in der Firmware erweitert werden. Die Ports habenbei den beiden Mikrocontrollern nicht die gleichen Funktionen, so dass beider Konfiguration auf den jeweiligen Schaltplan zurckzugreifen ist.

    Atmel empfiehlt fr nicht angeschlossene Pins den internen Pull-up-Wider-stand zu aktivieren, damit der Pin einen definierten Zustand erhlt. Durchdas Setzen aller Bits auf 1 im Port Register des Ports wird fr alle Pins,die durch das Data Direction Register als Eingang gekennzeichnet sind, der

    48

  • Kapitel 2. Hauptteil

    interne Pull-up-Widerstand aktiviert.49

    Port A existiert beim ATmega8 nicht und hat hier die Funktion fr dievier digitalen Eingnge von J102. Es knnen somit alle Pins von Port Aals Eingang konfiguriert werden. Die Data Direction Register werden mit 0initialisiert. Aus Grnden der bersicht erfolgt hier dennoch die expliziteAnweisung, das Data Direction Register auf 0 zu setzen.

    / / ou tb (DDRA, 0x00 ) ;DDRA = 0x00 ;

    An Port B werden PB5 und PB6 als Ausgnge verwendet. PB5 dient hier-bei als Ausgang fr das PWM-Kalibrierungssignal. Weiterhin sind die Si-gnale fr die Programmierung (SCK, MOSI, MISO) an Port B Pins 13 an-geschlossen. Diese werden hier, analog zu der Firmware des ATmega8, alsEingang konfiguriert.

    / / ou tb (DDRB, 0x60 ) ;DDRB = 0x60 ;

    Die Ports C, G, H, J und L sind gar nicht mit der Schaltung verbundenund sollten als Eingnge konfiguriert werden, damit die Pull-up-Widerstndeaktivierbar sind.

    / / ou tb (DDRC, 0x00 ) ;DDRC = 0x00 ;/ / ou tb (DDRG, 0x00 ) ;

    DDRG = 0x00 ;/ / ou tb (DDRH, 0x00 ) ;

    DDRH = 0x00 ;/ / ou tb (DDRJ , 0x00 ) ;DDRJ = 0x00 ;/ / ou tb (DDRL, 0x00 ) ;

    DDRL = 0 x00 ;

    49vgl. [Atm07a]

    49

  • Kapitel 2. Hauptteil

    Die Pins PD4 bis PD6 sind als weitere digitale Ausgnge vorgesehen. Dieanderen Pins von Port D sind nicht angeschlossen.

    / / ou tb (DDRD, 0x70 ) ;DDRD = 0x70 ;

    Port E wird nur fr die serielle Datenbertragung verwendet. Pin 0 ist frRxD und als Eingang zu konfigurieren. Pin 1 ist fr TxD vorgesehen undsomit Ausgang. Andere Pins sind nicht angeschlossen.

    / / ou tb (DDRE, 0x02 ) ;DDRE = 0 x02 ;

    Die Ports F und K dienen als analoge Eingnge fr den A/D-Wandler.Beim ATmega8 ist das der Port C, der nicht explizit konfiguriert wird. Andieser Stelle wird ebenfalls darauf verzichtet.

    Nun folgen die Anweisungen fr die Aktivierung der Pull-up-Widerstndebei den Pins, die als Eingang konfiguriert sind.

    / / ou tb (PORTA, 0 x f f ) ;PORTA = 0 x f f ;/ / ou tb (PORTB, 0 x f f ) ;

    PORTB = 0 x f f ;/ / ou tb (PORTC, 0 x f f ) ;

    PORTC = 0 x f f ;/ / ou tb (PORTD, 0 x f f ) ;

    PORTD = 0 x f f ;/ / ou tb (PORTE, 0 x f f ) ;PORTE = 0 x f f ;/ / ou tb (PORTG, 0 x f f ) ;

    PORTG = 0 x f f ;/ / ou tb (PORTH, 0 x f f ) ;

    PORTH = 0 x f f ;

    50

  • Kapitel 2. Hauptteil

    / / ou tb ( PORTJ , 0 x f f ) ;PORTJ = 0 x f f ;/ / ou tb (PORTL, 0 x f f ) ;PORTL = 0 x f f ;

    Die Auswahl und die Aktivierung der Sleep-Modi erfolgt beim ATme-ga1280 ber das Sleep Mode Control Register (SMCR) und nicht ber dasMCU Control Register (MCUCR). Die Anweisung

    ou tb (MCUCR, ( i n p (MCUCR) | BV( SE ) ) &(~BV(SM0) | ~BV(SM1) | ~BV(SM2 ) ) ) ;

    muss abgewandelt werden in

    / / ou tb (SMCR, ( i np (SMCR) | BV(SE ) ) &/ / (~BV(SM0) | ~BV(SM1) | ~BV(SM2 ) ) ) ;

    SMCR | = (1

  • Kapitel 2. Hauptteil

    ADCSRB | = (1

  • Kapitel 2. Hauptteil

    UBRR0L = 0 x0b ;

    In den USART Control and Status Registern AC (UCSRA bis UCSRC)sind auch die Bezeichnungen der Bits mit der Nummer des USART zu ergn-zen. Das USART Register Select Bit (URSEL) entfllt beim ATmega1280,da hier die USART-Register jeweils eine eigene Adresse haben. Beim ATme-ga8 haben sich das UCSRC Register und das UBRRH Register eine Adressegeteilt. Die Auswahl, welches Register gerade bearbeitet wird, erfolgt dabeiber das URSEL Bit.

    ou tb (UCSRA, 0 ) ;ou tb (UCSRC, BV(URSEL) | BV(UCSZ1) | BV(UCSZ0 ) ) ;ou tb (UCSRB, BV(TXEN ) ) ;

    wird gendert in:

    / / ou tb (UCSR0A, 0 ) ;UCSR0A = 0 x00 ;/ / ou tb (UCSR0C , BV(UCSZ01 ) | BV(UCSZ00 ) ) ;UCSR0C | = (1

  • Kapitel 2. Hauptteil

    / / ou tb (TCCR0B, 4 ) ; / / S t a r t i t . F requency = c l k / 256TCCR0B = (1

  • Kapitel 2. Hauptteil

    Interruptroutine fr die Abtastrate

    Die Funktion SIGNAL(SIG_OVERFLOW0) muss aufgrund der nderungder Interruptnamen umbenannt werden.

    SIGNAL(SIG_OVERFLOW0)

    / / SIGNAL(SIG_OVERFLOW0)ISR ( TIMER0_OVF_vect )

    Diese Funktion wird durch den Timer 0 ausgelst, der fr die Abtastrate von256 Hz zustndig ist.

    Hier wieder eine veraltete Anweisung:

    / / Re se t t im e r t o g e t c o r r e c t s amp l ing f r e qu en cy ./ / ou tb (TCNT0 , TIMER0VAL ) ;/ / Re se t t im e r t o g e t c o r r e c t s amp l ing f r e qu en cy .TCNT0 = TIMER0VAL ;

    Die Auswahl des aktuellen Kanals wird wieder auf den ersten Kanal zu-rckgesetzt. Die Zeile

    Curren tCh = 0 ;

    muss nicht gendert werden, da CurrentCh zur Indizierung der Kanalnum-mer in channel_order[] verwendet wird.

    Die vier digitalen Eingnge, deren Zustand mit zum PC bertragen wird,befinden sich nicht mehr an Port D 25, sondern an Port A 36. Die Ver-schiebung der Bits muss auch angepasst werden, um die Werte ganz nachrechts zu verschieben und korrekt zu maskieren.

    / / Get s t a t e o f sw i t c h e s on PD2 . . 5 ,/ / i f any ( l a s t by t e i n p a ck e t ) .TXBuf [2 * NUMCHANNELS + HEADERLEN] = ( i n p ( PIND ) >> 2) &0x0F ;

    55

  • Kapitel 2. Hauptteil

    / / Get s t a t e o f sw i t c h e s on PA3 . . 6 ,/ / i f any ( l a s t by t e i n p a ck e t ) ./ / TXBuf [2 * NUMCHANNELS + HEADERLEN] = ( i np ( PINA ) >> 3) &0x0F ;TXBuf [2 * NUMCHANNELS + HEADERLEN] = ( PINA >> 3) &0x0F ;

    Die Adresse des USART-Interrupts ist nun in Register UCSR0B und heitUDRIE0.

    c b i (UCSRB, UDRIE ) ; / / Ensure UART IRQ s a r e d i s a b l e d .

    / / c b i (UCSR0B , UDRIE0 ) ; / / Ensure UART IRQ s a r e d i s a b l e d .UCSR0B &= ~(1

  • Kapitel 2. Hauptteil

    / / TXBuf [ i +1] = inp (ADCL) ;TXBuf [ i +1] = ADCL;/ / TXBuf [ i ] = i np (ADCH) ;TXBuf [ i ] = ADCH;

    Wie oben erwhnt, werden fr die Adressierung der A/D-Kanle beimATmega1280 fnf Bits verwendet. Die Tabelle 2.2 ist aus der Tabelle 26-4aus [Atm07a] abgeleitet. Sie stellt fr jeden Kanal das Bitmuster dar, welchesin den Bits MUX0 bis MUX5 eingetragen werden muss. Die letzte Spaltebeinhaltet den dezimalen Wert, der direkt in ADMUX geschrieben werdenkann, um die Bits MUX0 bis MUX4 richtig einzustellen. Wie in der Tabellezu sehen ist, muss das Bit MUX5 fr die Kanle 07 auf 0 und fr die Kanle815 auf 1 gesetzt werden. Die drei Bits MUX0, MUX1 und MUX2 werdenbinr bis sieben hochgezhlt und starten dann wieder von 0.

    In dieser 6-Kanal Version werden die Kanle 1015 verwendet. Der Wertin ADMUX fr den Kanal 10 muss aber 2 betragen und nicht 10. Daher kanndie folgende Anweisung nicht mehr verwendet werden.

    / / S e l e c t t h e nex t ch anne l ./ / ou tb (ADMUX, c h a n n e l _ o r d e r [ Cur ren tCh ] ) ;/ / S e l e c t t h e nex t ch anne l .

    ADMUX = c h a n n e l _ o r d e r [ Cur ren tCh ] ;

    Das Bit MUX5 im Register ADCSRB wird in der Main-Funktion auf 1 ge-setzt und braucht hier nicht gendert zu werden. Fr eine korrekte Auswahlder Kanle wird von der Kanalnummer, die in channel_order[] steht, achtsubtrahiert.

    / / S e l e c t t h e nex t ch anne l ./ / The r i g h t v a l u e f o r ADMUX e . g . f o r Channel 10 i s 2/ / and no t 10 , so 8 need t o be s u t r a c t e d

    ADMUX = ( c h a n n e l _ o r d e r [ Cur ren tCh ] 8 ) ;

    Das Gleiche gilt auch fr die folgenden Anweisung.

    57

  • Kapitel 2. Hauptteil

    Tabe

    lle2.

    2.:B

    itmus

    terf

    rdi

    eA

    /D-W

    andl

    erK

    anal

    ausw

    ahlm

    itde

    nB

    itsM

    UX

    0-M

    UX

    5[A

    tm07

    a]

    Kan

    alM

    UX

    5M

    UX

    4M

    UX

    3M

    UX

    2M

    UX

    1M

    UX

    0A

    DM

    UX

    Dez

    imal

    00

    00

    00

    00

    10

    00

    00

    11

    20

    00

    01

    02

    30

    00

    01

    13

    40

    00

    10

    04

    50

    00

    10

    15

    60

    00

    11

    06

    70

    00

    11

    17

    81

    00

    00

    00

    91

    00

    00

    11

    101

    00

    01

    02

    111

    00

    01

    13

    121

    00

    10

    04

    131

    00

    10

    15

    141

    00

    11

    06

    151

    00

    11

    17

    58

  • Kapitel 2. Hauptteil

    / / P r e p a r e n ex t conve r s i on , on channe l 0 ./ / ou tb (ADMUX, c h a n n e l _ o r d e r [ 0 ] ) ;

    Da hier wie in der Main-Funktion der Kanal 10 ausgewhlt wird, kann dieAnweisung aus der Main-Funktion verwendet werden.

    / / P r e p a r e n ex t conve r s i on , on channe l 10 .ADMUX | = (1

  • Kapitel 2. Hauptteil

    SIGNAL(SIG_UART_DATA)

    / / SIGNAL(SIG_UART_DATA)ISR ( USART0_UDRE_vect )

    Hier sind die Adressen der USART Register und Bits anzupassen sowiedie Anweisungen zu ersetzen.Alt:

    ou tb (UDR, TXBuf [ TXIndex ] ) ; / / Send nex t by t e/ / D i s a b l e SIG_UART_DATA i n t e r r u p t s .c b i (UCSRB, UDRIE ) ;

    Neu:

    / / ou tb (UDR0, TXBuf [ TXIndex ] ) ; / / Send nex t by t eUDR0 = TXBuf [ TXIndex ] ; / / Send nex t by t e/ / D i s a b l e SIG_UART_DATA i n t e r r u p t s ./ / c b i (UCSR0B , UDRIE0 ) ;/ / D i s a b l e SIG_UART_DATA i n t e r r u p t s .UCSR0B &= ~(1

  • Kapitel 2. Hauptteil

    # d e f i n e NUMCHANNELS 6# d e f i n e HEADERLEN 4# d e f i n e PACKETLEN (NUMCHANNELS * 2 + HEADERLEN + 1)c h a r c o n s t c h a n n e l _ o r d e r [ ] = { 10 , 13 , 11 , 14 , 12 , 15 } ;

    Die Anzahl der zu verarbeitenden Kanle wird der Konstanten NUMCHAN-NELS zugewiesen. Die sechs muss also durch eine 16 ersetzt werden.

    Die Lnge des Paketheaders HEADERLEN krzt sich durch das Weglas-sen der Angabe der Paketversion um ein Byte von vier auf drei.

    Die Paketlnge PACKETLEN hat sich durch die Komprimierung der Da-ten verkrzt. In der Original-Firmware werden pro Kanal zwei Byte bertra-gen.50 Das entsprche bei 16 Kanlen mit Header und Footer einer Paketln-ge von 36 Byte. In dieser Version teilen sich zwei Kanle drei Byte. Dadurchwird die Paketlnge auf 28 Byte gekrzt.

    Die Liste mit der Kanalreihenfolge channel_order[] muss um weitereKanle ergnzt werden. Die Reihenfolge entspricht diesmal nicht der Zu-ordnung zu den Analog-Platinen, da in der Testphase so die Kanle besseridentifiziert werden knnen.

    # d e f i n e NUMCHANNELS 16# d e f i n e HEADERLEN 3# d e f i n e PACKETLEN ( ( (NUMCHANNELS/ 2 ) * 3 ) + HEADERLEN + 1)c h a r c o n s t c h a n n e l _ o r d e r [ ] =

    { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 } ;

    Main-Funktion

    Die Anweisung, der die Paketversion oder Protokollnummer in den Text-puffer schreibt, wird gelscht. Um Zeit bei der Datenbertragung zu sparen,wird dieses Byte nicht mehr verwendet. Dadurch verschiebt sich der Inhalt

    50vgl. [HPR03]

    61

  • Kapitel 2. Hauptteil

    des Textpuffers um ein Byte nach vorne. Entsprechend mssen die Anwei-sungen, die TXBuf[] verwenden, angepasst werden.6-Kanal:

    TXBuf [ 2 ] = 2 ; / / P r o t o c o l v e r s i o nTXBuf [ 3 ] = 0 ; / / P a cke t c o u n t e r

    16-Kanal:

    TXBuf [ 2 ] = 0x00 ; / / P a cke t c o u n t e r

    In der Main-Funktion muss als erster Kanal fr den A/D-Wandler der Ka-nal 0 ausgewhlt werden.6-Kanal:

    / / S e l e c t c h anne l 10ADMUX | = (1

  • Kapitel 2. Hauptteil

    UBRR0L = 0 x05 ;

    Interruptroutine fr die Abtastrate

    In SIGNAL(TIMER0_OVF_vect) mssen folgende Anweisungen fr die An-passung an das neue Paketformat gendert werden.6-Kanal:

    / / I n c r e a s e p a ck e t c o u n t e r ( f o u r t h by t e i n heade r )TXBuf [ 3 ] + + ;/ / Get s t a t e o f sw i t c h e s on PA3 . . 6 ,/ / i f any ( l a s t by t e i n p a ck e t ) .TXBuf [2 * NUMCHANNELS + HEADERLEN] = ( PINA >> 3) &0x0F ;

    16-Kanal:

    / / I n c r e a s e p a ck e t c o u n t e r ( t h i r d by t e i n heade r )TXBuf [ 2 ] + + ;/ / Get s t a t e o f sw i t c h e s on PA3 . . 6 ,/ / i f any ( l a s t by t e i n p a ck e t ) .TXBuf [ ( (NUMCHANNELS/ 2 ) * 3 ) + HEADERLEN] = ( PINA >> 3) &0x0F ;

    Interruptroutine fr die A/D-Wandlung

    Die Anweisungen fr das Fllen des Textpuffers aus dem Speicher des A/D-Wandlers mssen fr die Komprimierung gendert werden. Die Tabelle 2.3zeigt den Inhalt des Textpuffers ohne Komprimierung. Dort ist deutlich zusehen, dass pro Kanal sechs Bit frei bleiben. In Tabelle 2.4 ist der Inhaltdes Textpuffers mit Komprimierung dargestellt. Die niedrigsten acht Bit desersten Kanals, hier Kanal 0, werden in das vierte Byte des Textpuffers ge-speichert. Danach werden die Bits acht und neun des ersten Kanals in Bytefnf gespeichert. Fr den zweiten Kanal, hier Kanal 3, werden zuerst dieniedrigsten acht Bit in das sechste Byte des Puffers geschrieben. Die Bits

    63

  • Kapitel 2. Hauptteil

    acht und neun des zweiten Kanals werden um sechs Stellen nach links ver-schoben, mit dem Inhalt des fnften Byte Oder-Verknpft und in das fnfteByte des Puffers gespeichert. Die Kanalnummer ergibt sich aus der Kanal-reihenfolge channel_order[] (siehe oben auf Seite 61).

    6-Kanal ohne Komprimierung:

    i = 2 * Cur ren tCh + HEADERLEN;TXBuf [ i +1] = ADCL;TXBuf [ i ] = ADCH;

    16-Kanal mit Komprimierung:

    i = 2 * Cur ren tCh + HEADERLEN;TXBuf [ i ] = ADCL;

    i f ( ( Cur ren tCh % 2) == 0){

    TXBuf [ i 1] = ADCL;TXBuf [ i ] = ADCH;

    }e l s e{

    TXBuf [ i +1] = ADCL;TXBuf [ i ] | = (ADCH

  • Kapitel 2. Hauptteil

    Tabe

    lle2.

    3.:A

    nord

    nung

    derD

    aten

    imTe

    xtpu

    ffer

    ohne

    Kom

    prim

    ieru

    ng

    Byt

    eB

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    0Sy

    nchr

    onis

    atio

    n(0

    xa5)

    1Sy

    nchr

    onis

    atio

    n(0

    x5a)

    2Pa

    ketz

    hle

    r

    3-

    --

    --

    -K

    anal

    0K

    anal

    0B

    it9

    Bit

    8

    4K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    5-

    --

    --

    -K

    anal

    3K

    anal

    3B

    it9

    Bit

    8

    6K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    7-

    --

    --

    -K

    anal

    1K

    anal

    1B

    it9

    Bit

    8

    8K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    9-

    --

    --

    -K

    anal

    4K

    anal

    4B

    it9

    Bit

    8. . .

    . . .. . .

    . . .. . .

    . . .. . .

    . . .. . .

    65

  • Kapitel 2. Hauptteil

    Tabe

    lle2.

    4.:A

    nord

    nung

    derD

    aten

    imTe

    xtpu

    ffer

    mit

    Kom

    prim

    ieru

    ng

    Byt

    eB

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    0Sy

    nchr

    onis

    atio

    n(0

    xa5)

    1Sy

    nchr

    onis

    atio

    n(0

    x5a)

    2Pa

    ketz

    hle

    r

    3K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0K

    anal

    0B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    4K

    anal

    3K

    anal

    3-

    --

    -K

    anal

    0K

    anal

    0B

    it9

    Bit

    8B

    it9

    Bit

    8

    5K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3K

    anal

    3B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    6K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1K

    anal

    1B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    7K

    anal

    4K

    anal

    4-

    --

    -K

    anal

    1K

    anal

    1B

    it9

    Bit

    8B

    it9

    Bit

    8

    8K

    anal

    4K

    anal

    4K

    anal

    4K

    anal

    4K

    anal

    4K

    anal

    4K

    anal

    4K

    anal

    4B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0

    9K

    anal

    2K

    anal

    2K

    anal

    2K

    anal

    2K

    anal

    2K

    anal

    2K

    anal

    2K

    anal

    2B

    it7

    Bit

    6B

    it5

    Bit

    4B

    it3

    Bit

    2B

    it1

    Bit

    0. . .

    . . .. . .

    . . .. . .

    . . .. . .

    . . .. . .

    66

  • Kapitel 2. Hauptteil

    Es muss eine Unterscheidung zwischen den Kanlen 07 und 815 erfolgen.Wenn die Kanalnummer aus channel_order[] an der Stelle CurrentCh klei-ner als acht ist, dann muss das MUX5 Bit in ADCSRB auf 0 gesetzt werden.Die anderen Bits, die in ADMUX stehen, knnen dann mit der Kanalnum-mer belegt werden. Ist das nicht der Fall, dann ist die Kanalnummer grerals sieben und das MUX5 Bit muss auf 1 gesetzt werden. Die Bits MUX0-MUX2 erhalten dann die Kanalnummer abzglich acht. Das Bitmuster frdie Kanaladressierung ist in Tabelle 2.2 auf Seite 58 dargestellt.16-Kanal:

    / / S e l e c t t h e nex t ch anne l .i f ( c h a n n e l _ o r d e r [ Cur ren tCh ] < 8){

    ADCSRB &= ~(1

  • Kapitel 2. Hauptteil

    ADMUX &= ~ ( ( 1

  • Kapitel 2. Hauptteil

    c a s e 2 : PACKET . r e a d s t a t e ++;b r e a k ;

    c a s e 3 : PACKET . number = a c t b y t e ;/ / i f (++PACKET . old_number != a c t b y t e )/ / GLOBAL. temp ++;/ / PACKET . old_number= a c t b y t e ;

    PACKET . e x t r a c t _ p o s =0;PACKET . r e a d s t a t e ++;b r e a k ;

    c a s e 4 : i f (PACKET . e x t r a c t _ p o s < 12){ i f ( ( PACKET . e x t r a c t _ p o s & 1) == 0)

    PACKET . b u f f e r [PACKET . e x t r a c t _ p o s > >1]= a c t b y t e *256 ;

    e l s ePACKET . b u f f e r [PACKET . e x t r a c t _ p o s > >1]

    += a c t b y t e ;PACKET . e x t r a c t _ p o s ++;

    }e l s e{ PACKET . s w i t c h e s = a c t b y t e ;

    PACKET . r e a d s t a t e =0;p r o c e s s _ p a c k e t s ( ) ;

    }b r e a k ;

    d e f a u l t : PACKET . r e a d s t a t e =0;}

    }

    16-Kanal Version mit Datenkomprimierung:

    vo id p a r s e _ b y t e _ 1 6 ( u n s i g n e d c h a r a c t b y t e ){

    i n t i , j ;s w i t c h (PACKET . r e a d s t a t e ){

    c a s e 0 : i f ( a c t b y t e ==165) PACKET . r e a d s t a t e ++;b r e a k ;

    69

  • Kapitel 2. Hauptteil

    c a s e 1 : i f ( a c t b y t e ==90) PACKET . r e a d s t a t e ++;e l s e PACKET . r e a d s t a t e =0;b r e a k ;

    c a s e 2 : PACKET . number = a c t b y t e ;/ / i f (++PACKET . old_number != a c t b y t e )/ /GLOBAL. temp ++;/ / PACKET . old_number= a c t b y t e ;

    PACKET . e x t r a c t _ p o s =0;PACKET . r e a d s t a t e ++;b r e a k ;

    c a s e 3 : t m p _ b u f f e r [PACKET . e x t r a c t _ p o s ]= a c t b y t e ;PACKET . e x t r a c t _ p o s ++;i f (PACKET . e x t r a c t _ p o s ==25){

    f o r ( i =0 , j =0 ; j

  • Kapitel 2. Hauptteil

    geprft. Benachbarte Pins wurden auf Kurzschlsse getestet.Zum Testen der Funktionstchtigkeit der Platine wurden diese Tests durch-

    gefhrt. In Brainbay wurden die Signale der Kanle auf einem Oszilloskopausgegeben. Als Quelle der Signale wurde der PWM-Ausgang mit jeweilseinem Kanal verbunden und der Signalverlauf beobachtet.

    Test 1: 6-Kanal-Firmware mit Original Brainbay Kanle 1015Ergebnis: Normale Funktion

    Test 2: 6-Kanal-Firmware mit gendertem Brainbay Kanle 1015Ergebnis: Normale Funktion

    Test 3: 6-Kanal-Firmware mit gendertem Brainbay Kanle 05Ergebnis: Fehler

    Test 4: 6-Kanal-Firmware mit Original Brainbay Kanle 05Ergebnis: Gleiche FehlerKanal 0 normale FunktionKanal 1 normale FunktionEin Signal auf Kanal 2 wird in der Software auch auf Kanal 3 angezeigt.Wird das Signal auf Kanal 3 angeschlossen, ist in der Software nichts zu se-hen.Kanal 4 verringerte AmplitudeKanal 5 verringerte Amplitude

    Test 5: 6-Kanal-Firmware mit Original Brainbay Kanle 0, 6, 7, 3, 4, 5 Er-gebnis: FehlerKanal 6 verringerte AmplitudeKanal 7 verringerte Amplitude und Signal auch auf Kanal 3.

    71

  • Kapitel 2. Hauptteil

    Test 6: 6-Kanal-Firmware mit Original Brainbay Kanle 8-13Ergebnis: Normale Funktion

    Vermutlich liegt ein Problem mit den Kondensatoren im Tiefpass der A/D-Eingnge vor.

    Test 7: 16-Kanal-Firmware mit gendertem Brainbay Kanle 016Ergebnis: Gleiche Fehler bei den Kanlen wie bei den 6-Kanal Tests.

    Test 8: 16-Kanal-Firmware mit gendertem Brainbay Kanle 016, alleKanle angeschlossenErgebnis: Der Signalverlauf ist bei 16-Kanlen gleichmig.

    Abbildung 2.14 zeigt einen Screenshot aus dem Brainbay-Programm beigleichzeitiger Verwendung von 16 Kanlen.

    72

  • Kapitel 2. Hauptteil

    Abbildung 2.14.: Screenshot aus Brainbay mit 16 Kanlen

    73

  • Kapitel 3.

    Abschluss

    3.1. Fazit

    In dieser Diplomarbeit ist eine Platine entstanden, mit der sich zeigen lsst,dass die Zielsetzung und die theoretischen berlegungen umsetzbar sind.Die Platine enthlt noch kleine Fehler, fr deren Beseitigung die Zeit nichtmehr ausgereicht hat.

    3.2. Ausblick

    Es gibt noch einige interessante Aufgaben, die sich an diese Arbeit anschlie-en lassen. So knnten weitere EEG-Programme fr die Verwendung von16-Kanlen erweitert werden. Im OpenEEG-Projekt wurde auf die Verwen-dung eines Programmierprogrammes zum Einspielen der Firmware auf denMikrocontroller hingewiesen. Dieses Programm heit SP12 und hat keineKonfiguration um damit einen ATmega1280 zu programmieren. Der Vorteilvon so einem Programm ist, dass mit ein paar Bauteilen ein eigenes Pro-grammierkabel hergestellt werden kann. Eine Konfiguration fr SP12 frden ATmega1280 herzustellen wrde die Verwendbarkeit dieser Arbeit imOpenEEG-Projekt vergrern.

    74

  • Eidesstattliche Erklrung

    Ich versichere an Eides statt, dass ich die vorliegende Arbeit selbstndig an-gefertigt und mich keiner fremden Hilfe bedient sowie keine anderen als dieangegebenen Quellen und Hilfsmittel benutzt habe. Alle Stellen, die wrtlichoder sinngem verffentlichten oder nicht verffentlichten Schriften undanderen Quellen entnommen sind, habe ich als solche kenntlich gemacht.Diese Arbeit hat in gleicher oder hnlicher Form noch keiner Prfungsbe-hrde vorgelegen.

    Dortmund, den 27.03.2008

    Erklrung

    Mir ist bekannt, dass nach 156 StGB bzw. 163 StGB eine falsche Versi-cherung an Eides Statt bzw. eine fahrlssige falsche Versicherung an EidesStatt mit Freiheitsstrafe bis zu drei Jahren bzw. bis zu einem Jahr oder mitGeldstrafe bestraft werden kann.

    Dortmund, den 27.03.2008

    75

  • Literaturverzeichnis

    [Atm05] Atmel Corporation: AVR Instruction Set, November 2005.http://www.atmel.com/dyn/resources/prod_

    documents/doc0856.pdf, besucht: 25.03.2008.

    [Atm07a] Atmel Corporation: ATmega640/1280/1281/2560/2561, l Auf-lage, August 2007. http://www.atmel.com/dyn/resources/prod_documents/doc2549.pdf, besucht:10.03.2008.

    [Atm07b] Atmel Corporation: ATmega8, s Auflage, August 2007.http://www.atmel.com/dyn/resources/prod_

    documents/doc2486.pdf, besucht: 25.02.2008.

    [AVR07] AVR Libc, 1.6.1 Auflage, Dezember 2007. http://www.nongnu.org/avr-libc/user-manual/index.html,besucht: 21.03.2008.

    [Bro07a] Der Brockhaus multimedial 2007 premium, 2007, ISBN 3-411-06548-6. Artikel: Elektroenzephalogramm.

    [Bro07b] Der Brockhaus multimedial 2007 premium, 2007, ISBN 3-411-06548-6. Artikel: C, Programmierung.

    [Cre] Namensnennung-Weitergabe unter gleichen Bedingungen 2.0.http://creativecommons.org/licenses/by-sa/

    2.0/deed.de, besucht: 26.03.2008.

    76

  • Literaturverzeichnis

    [Dem05] John N. Demos: Getting Started with Neurofeedback. W. W.Norton & Company, 2005, ISBN 0-393-70450-5.

    [Fli01] Thomas Flik: Mikroprozessortechnik. Springer-Verlag BerlinHeidelberg New York, 6. Auflage, 2001, ISBN 3-540-42042-8.

    [GNP+03] Dan Griffiths, Nelo, Jim Peters, Andreas Robinson, JackSpaar und Yaniv Vilnai: The ModularEEG Design, 2002,2003.http://openeeg.sourceforge.net/doc/modeeg/

    modeeg_design.html, besucht: 26.03.2008.

    [Hol07] Bastian Holtermann: Modular-EEG und aktive Elektroden ausdem OpenEEG-Projekt. Projektarbeit, Fachhochschule Dort-mund, Fachbereich Informatik, August 2007.

    [HPR03] Joerg Hansmann, Jim Peters und Andreas Robinson: Modula-rEEG firmware for one-way transmission, v0.5.4-p2, 2002,2003.http://downloads.sourceforge.net/openeeg/

    ModularEEG-firmware-v1.0.0.zip?modtime=

    1061769600&big_mirror=0, besucht: 10.03.2008.

    [Lic] Default site-wide license. http://openeeg.sourceforge.net/doc/license.html, besucht:26.03.2008.

    [Mic02] Marek Michalkiewicz: avr/iom8.h, 2002. Datei aus WinAVR20071221.

    [MWW07] Marek Michalkiewicz, Joerg Wunsch und Eric Weddington:avr/io.h, 2007. Datei aus WinAVR 20071221.

    [Pro] Welcome to the OpenEEG project. http://openeeg.sourceforge.net/doc/, besucht: 26.03.2008.

    77

  • Literaturverzeichnis

    [Stu04] Peter Stuhlmller: A/D-Wandler in Embedded Systemen. FranzisVerlag GmbH, 2004, ISBN 3-7723-5300-2.

    [Wol06] Jrgen Wolf: C von A bis Z. Galileo Press GmbH,2. Auflage, 2006, ISBN 3-89842-643-2. http://www.galileocomputing.de/openbook/c_von_

    a_bis_z/, besucht: 21.03.2008.

    78

  • Anhang A.

    Original Firmware fr ATmega8

    Hier folgt die Firmware Version 0.5.4-p2 aus de