Versuchsanleitung MCAP 23022011 - acmc-ls.de® mit ATmega128 Modul MCAP ...

34
MCLS-modular ® mit ATmega128 Modul MCAP Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 1 Praktikumsanleitung zum Modul Mikrocontroller-Applikation Versuchsschwerpunkte Programmierung von Mikrocontrolleranwendungen in Assembler und C Funktion ausgewählter Assemblerbefehle Vertiefung der Kenntnisse zum Speichermodell und zu den Adressierungsarten Funktion und Anwendung von Ports und externen Interrupts Nutzung der TWI-Funktionalität für LCD-Anzeige und Temperatursensor Anwendung von Timerfunktionalitäten für die Realisierung einer Frequenzmessung Realisierung einer Temperaturregelung unter Nutzung von ADU- und Timerfunktionen

Transcript of Versuchsanleitung MCAP 23022011 - acmc-ls.de® mit ATmega128 Modul MCAP ...

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 1

Praktikumsanleitung zum Modul

Mikrocontroller-Applikation

Versuchsschwerpunkte

Programmierung von Mikrocontrolleranwendungen in Assembler und C Funktion ausgewählter Assemblerbefehle Vertiefung der Kenntnisse zum Speichermodell und zu den Adressierungsarten Funktion und Anwendung von Ports und externen Interrupts Nutzung der TWI-Funktionalität für LCD-Anzeige und Temperatursensor Anwendung von Timerfunktionalitäten für die Realisierung einer Frequenzmessung Realisierung einer Temperaturregelung unter Nutzung von ADU- und Timerfunktionen

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 2

Inhaltsverzeichnis Aufgabenteil Seite 0. Einführung und Randbedingungen 3 1. Versuchskomplex VK1 (Assembler-Programmierung) 4 2. Versuchskomplex VK2 (Assembler- und C-Programmierung) 6 3. Versuchskomplex VK3 (C-Programmierung) 9 4. Versuchskomplex VK4 (C-Programmierung) 12 5. Versuchskomplex VK5 (C-Programmierung) 14 Anlagenteil A1. Ausgewählte Hinweise zur C-Programmierung 16 A2. Assemblerbibliothek binbcd.inc 17 A3. Assemblerbibliothek 7seg.inc für die Display-Unit1 18 A4. Funktionsbibliothek 7seg.h für die Display-Unit1 19 A5. Funktionsbibliothek bcd.h 20 A6. Funktionsbibliothek iic.h für das TWI 21 A7. Funktionsbibliothek lcd.h für die LCD-Anzeige 23 A8. Funktionsbibliothek lm75.h für den Temperatursensor 24 A9. Funktionsbibliothek rtc.h für die RTC 25 A10. Funktionsbibliothek delay_ms.h für Zeitverzögerungen 27 A11. Hinweise zur Ansteuerung der I2C-LCD-UNIT 28 A12. Hinweise zum Einsatz des ADC 31 Hinweis: Die erzielten Ergebnisse des jeweiligen Versuchskomplexes werden im Rahmen eines kompakten Kolloquiums durch das betreuende Lehrpersonal innerhalb der Praktikumszeit überprüft! Eine positive Bewertung wird auf der Testatkarte vermerkt. Die Testatkarte ist zur Abschlussklausur mit abzugeben! Beachten Sie den Supportbereich für das Modul Mikrocontroller-Applikation:

https://download.hs-mittweida.de/intranet/lehre/EIT/Hagenbruch/ Modul MCAP (…) oder \\Itc\prog\LEHRVER\EIT\Hagenbruch\Modul MCAP (Mikrocontroller-Applikation)

Literaturhinweise:

Schmitt, G.: Mikrocomputertechnik mit Controllern der ATMEL AVR-RISC-Familie, Oldenbourg Wissenschaftsverlag, 3. Auflage 2007

Wiegelmann, J.: Softwareentwicklung in C für Mikroprozessoren und Mikrocontroller, Hüthig Verlag Heidelberg, 2. Auflage 2003

Beierlein, T.; Hagenbruch, O.: Taschenbuch Mikroprozessortechnik, Fachbuchverlag Technik Leipzig im Carl Hanser Verlag München, 4. Auflage 2011

Mittermayr, R.: AVR-RISC, Embedded Software selbst entwickeln, Franzis Verlag 2008

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 3

0. Einführung und Randbedingungen Eine effiziente und erfolgreiche Entwicklung von Software für Embedded Systems setzt u.a. Kenntnisse zum Programmiermodell des jeweiligen Zielcontrollers voraus. Deshalb sind in den Versuchskomplexen 1 und 2 einfache Aufgaben in Assemblerprogrammierung enthalten. Der Übergang zur C-Programmierung erfolgt noch im Versuchskomplex 2, indem eine zuerst in Assembler zu realisierende Applikation anschließend in C programmiert werden soll. Komplexere MC-Applikationen in den Versuchskomplexen VK3 bis VK5 sind vollständig in C zu programmieren. Was wird für das Durcharbeiten der Versuchskomplexe benötigt? 1. Die Hardware des MCLS-modular® (modular und konfigurierbar)

Als Zielcontroller kommt für alle Versuchskomplexe ein ATmega128 zum Einsatz (ATmega-Core-Modul mit ATmega-Adapter-Unit, USB-Kopplung zum Debugging an den PC).

Der Versuchaufbau auf der Plattform des MCLS-modular® variiert je nach Versuchskomplex und muss selbst mit entsprechender Sorgfalt vorgenommen werden.

Die Interfaceelektronik auf der ATmega-Adapter-Unit unterstützt echtes Hardware-Debugging.

Beachten Sie die technischen Beschreibungen (*.pdf-Dateien) zu den benötigten Experimentiermodulen im Supportbereich des Moduls MCAP!

2. Die Software für die Versuche mit Assemblerprogrammierung in den Versuchskomplexen VK1 und VK2

Die Projektdatei Test_asm.aps und verschiedene weitere Projekdateien. Für die Durchführung der Übungen kommen u. a. der AVR-Assembler und das

AVR-Studio von ATMEL zum Einsatz. 3. Die Software für die Versuche mit C-Programmierung in den Versuchskomplexen VK2 bis VK5

Die Projektdatei Test_c.aps und verschiedene weitere Projektdateien. Für die Durchführung der Übungen kommen u. a. der General Public License C-

Compiler AVRGCC und das AVR-Studio zum Einsatz. Informationen zum AVRGCC sind u. a. über http://winavr.sourceforge.net/

verfügbar. Der ATmega128 wird auf dem Core Modul mit 14,7457 MHz getaktet!

Dies entspricht einer Taktzeit von 67,8168 ns!

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 4

1. Versuchskomplex VK1 (Assembler-Programmierung) Randbedingungen:

Nutzen Sie und die Projektdatei Test_asm.aps mit den eingebundenen Dateien für die Assemblerprogrammierung.

Skizzieren Sie zu den Teilaufgaben c) und d) einen Programmablaufplan und schreiben Sie anschließend jeweils das kommentierte Assemblerlisting!

Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehlersuche.

Versuchsschwerpunkte:

Kennenlernen des MCLS-modular® und Test der Versuchsanordnung mit einem vorbereiteten Testprogramm

Kennenlernen und Test ausgewählter Befehle mittels vorgegebener Befehlsfolge Test von Adressierungsarten Ansteuerung einer LED-Reihe

Aufgaben zu Versuchskomplex 1: a) Test der Versuchsanordnung

Positionieren Sie die ATmega-Adpater-Unit mit dem ATmega-Core-Modul auf der Experimentier-Plattform.

Stecken Sie die LED-UNIT auf die Plattform und verbinden Sie eine der 8 LED’s mit dem Portpin (PA0).

Koppeln Sie die vorbereitete Plattform über eine USB-Verbindung an Ihren Arbeitsplatzrechner und schließen Sie das Steckernetzteil an.

Starten Sie Das AVR-Studio und öffnen Sie das Projekt Test_asm. Studieren Sie den darin enthaltenen Quelltext blink.asm . Kontrollieren Sie, ob das korrekte Portpin über das Programm angesprochen werden kann.

Übersetzen Sie den Quelltext. Laden Sie den generierten Maschinencode in das Zielsystem (AVR-Studio wird dabei

im Debugmodus geöffnet!). Debuggen Sie die Testapplikation mit den Kommandos Einzelschritt (F11),

Prozedurschritt (F10) bzw. F5 (Echtzeitlauf). Machen Sie sich mit den Möglichkeiten der Visualisierung der Ressourcen des

Zielsystems und des Debuggings vertraut! Hinweis: Konsultieren Sie bei Problemen mit der USB-Kommunikation das im Praktikum anwesende Lehrpersonal!

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 5

b) Öffnen Sie die Quelletextdatei VK1_b im Projekt Test_asm. Machen Sie sich mit der Funktion der hier notierten Befehle unter Nutzung der Debug-Möglichkeiten vertraut. c) Schreiben Sie ein Assemblerprogramm, welches 100 Bytes im RAM (ab 0x100 lokalisiert) in den RAM ab Adresse 0x400 kopiert.

Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung!! Wenden Sie dabei die indirekte Adressierung an! Belegen Sie per Programm den Quellbereich im RAM ab Adresse 0x100 mit einer

definierten Bytefolge (RAM-Initialisierung) Testen Sie Ihre Programmlösung mit den Möglichkeiten des Debuggers!

d) Schreiben Sie ein Assemblerprogramm, welches eine Variable im RAM (kein Register!) fortlaufend binär inkrementiert und deren Inhalt auf die LED-UNIT ausgibt.

Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung!! Stecken Sie die LED-UNIT auf die Plattform und verbinden Sie deren LED’s mit den

Anschlüssen von Port A (PORTA). Dimensionieren Sie die Software-Zeitverzögerung zwischen den Inkrementierungen auf

möglichst genau 50 ms. Überprüfen Sie die Zeitverzögerung mit Hilfe der STOP- WATCH- Funktion in der Simulatorbetriebsart des AVR-Studio.

Kontrollfragen zur Vorbereitung des Versuchskomplexes 1 (ATmega128!):

a) Über welche Adressierungsarten kann der Zugriff auf den On-Chip-RAM erfolgen? b) Wie können Konstanten im Codespeicherbereich gelesen werden? c) Was ist vor einer ersten Stacknutzung zu beachten? d) Welche Wesensmerkmale kennzeichnen die Stackfunktionalität? e) Wozu dienen die s. g. Fuse-Bits bzw. Fuse-Bytes? f) Welche Register sind als Zeigerregister einsetzbar? g) Welches Arbeitsregister verbirgt sich unter der Bezeichnung YH? h) In welcher Größe sind die Befehle codiert? i) Ist der Befehl ldi r12,0xc3 möglich? j) Worin besteht der Ergebnisunterschied im Vergleich der Befehle dec r17 und

subi r17,0x01 ? k) Wozu dient das Transfer Register Bit T im Status-Register SREG? l) Wozu dient die .org – Direktive des Assemblers? m) Mit welchem Testbefehl kann direkt der Pegel am Portpin PB5 überprüft werden? n) Auf welche Information wird über das Spezialfunktionsregister PINC zugegriffen? o) Wie kann eine Softwarezeitverzögerung von 1 ms für die vorliegende Taktung des

ATmega128 realisiert werden? p) Wie können Variablen im On-Chip-RAM durch Assemblerdirektiven lokalisiert

vereinbart werden? 2. Versuchskomplex VK2 (Assembler- und C-Programmierung)

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 6

Zählen und Anzeigen von Tastenbetätigungen Randbedingungen:

Nutzen Sie für die C-Programmierung die vorbereitete Projektdatei Test_c.aps! Skizzieren Sie einen Programmablaufplan und schreiben Sie anschließend die

Quelltexte! Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur

Fehlersuche. Versuchsschwerpunkte:

Realisierung einer identischen Applikation zuerst in Assembler und anschließend in C! Nutzung des externen Interrupt 4 (INT4). Ansteuerung der 7-Segment-Anzeige. Einsatz von Funktionsbibliotheken.

Aufgaben zu Versuchskomplex 2: a) Schreiben Sie ein Assemblerprogramm, welches Tastenbetätigungen per externem Interrupt 4 erfasst, abzählt und 4-stellig dezimal auf der 7-Segment-Anzeige darstellt! Als zusätzliche Experimentiermodule kommen die KEY-UNIT und die DISPLAY-UNIT 1 (7-Segment- Anzeige) zum Einsatz. Zur Unterstützung der Anzeigeansteuerung für die 7-Segment-Anzeige werden die Include- Dateien bcd.inc und 7segm.inc bereitgestellt. Die Generierung des INT4 soll über die KEY-UNIT (Ausgang INT) erfolgen.

Ergänzen Sie Ihren Programmentwurf durch das quasi gleichzeitige binäre Hochzählen und Anzeigen einer 8-Bit Variablen in der Hauptprogrammschleife. Geben Sie den Variablen-inhalt über Port A binär an die LED-UNIT aus und sehen Sie eine entsprechende Software-zeitverzögerung zwischen den Binärausgaben vor. Beachten Sie, dass das Weiterzählen beim Drücken der Taste erfolgen soll und dass die Tasten auch beim Loslassen ca. 50 bis 80 ms prellen

Gehen Sie wie folgt vor:

Ermitteln Sie aus der Kommentierung der Include-Datei 7segm.inc die vorzunehmende Hardwareankopplung der DISPLAY-UNIT 1 an die ATmega-Adpater-Unit und führen Sie diese entsprechend aus!

Schließen Sie die KEY-UNIT an den entsprechenden Interrupteingang an. Skizzieren Sie einen kompakten Programmablaufplan vor der Quelltexterstellung! Schreiben Sie den kommentierten Quelltext unter Nutzung des vorgegebenen

Quelltextrahmens und nehmen Sie das Programm mit Hilfe des Debuggers in Betrieb! Ergänzen Sie das Programm durch das Hochzählen und Anzeigen der 8-Bit Variablen.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 7

b) Schreiben Sie ein C-Programm, welches Tastenbetätigungen per externem Interrupt 4 erfasst, abzählt und 4-stellig dezimal auf der 7-Segment-Anzeige darstellt! Als zusätzliche Experimentiermodule kommen die KEY-UNIT und die DISPLAY-UNIT 1 (7-Segment- Anzeige) zum Einsatz. Die Generierung des INT4 soll über die KEY-UNIT (Ausgang INT) erfolgen. Zur Unterstützung der Anzeigeansteuerung werden die Header-Dateien 7seg.h, delay_ms.h und bcd.h bereitgestellt. Diese enthalten vorbereitete Funktionen, welche die Programm- realisierung unterstützen.

Ergänzen Sie Ihren Programmentwurf durch das quasi gleichzeitige binäre Hochzählen und Anzeigen einer 8-Bit Variablen in der Hauptprogrammschleife. Geben Sie den Variablen-inhalt über Port A binär an die LED-UNIT aus und sehen Sie eine entsprechende Software-zeitverzögerung zwischen den Binärausgaben vor.

Gehen Sie wie folgt vor:

Ermitteln Sie aus den Kommentierungen der Header-Datei 7seg.h die vorzunehmende Hardwareankopplung der DISPLAY-UNIT 1 an die ATmega-Adpater-Unit und führen Sie diese entsprechend aus!

Schließen Sie die KEY-UNIT an den entsprechenden Interrupteingang an. Skizzieren Sie einen kompakten Programmablaufplan vor der Quelltexterstellung! Schreiben Sie den kommentierten Quelltext unter Nutzung des vorgegebenen

Quelltextrahmens und nehmen Sie das Programm mit Hilfe des Debuggers in Betrieb! Ergänzen Sie das Programm durch das Hochzählen und Anzeigen der 8-Bit Variablen.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 8

Kontrollfragen zur Vorbereitung des Versuchskomplexes 2 (ATmega128!):

a) Ab welcher Adresse ist die Interruptvektortabelle im Codespeicher lokalisiert? b) Auf welche Codespeicheradresse ist der Interruptvektor für den externen Interrupt 4

einzutragen? c) Was versteht man unter einem Interruptrequestbit? d) Wie ist ein Interruptvektor codiert? e) Welche Spezialfunktionsregister sind für die Initialisierung eines externen Interrupt

beteiligt? f) Welche Aufgabe hat das Bit I im Spezialfunktionsregister SREG und wie kann es

beeinflusst werden? g) Wie kann bei Auslösung eines externen Interrupt über Flankentriggerung das Problem

des Tastenprellens gelöst werden? h) Wie kann das programmtechnische Rücksetzen eines Interruptrequestbit erfolgen? i) Erläutern Sie, wie das Retten des Statusregisters SREG bei Eintritt in ein

Unterprogramm realisiert werden kann! j) Welche Aufgabe hat die main-Funktion innerhalb eines C-Programms? k) Welche Aufgabe hat die Präprozessoranweisung #include ? l) Wie lassen sich Endlosschleifen in C-Syntax erzeugen? m) Wozu dient im C-Compiler AVR-GCC die Datei avr/io.h? n) Wie kann in C-Syntax eine Portbelegung eingelesen und ausgewertet werden? o) Wie setzt man in C-Syntax einen Portpin auf 1- bzw. 0-Pegel? p) Wie wird in C-Syntax eine 16-Bit Integer-Variable ohne Vorzeichen vereinbart? q) Welche Funktionen stellt der C-Compiler AVR-GCC die Headerdatei avr/interrupt.h

zur Verfügung? r) Welche Möglichkeiten bietet der C-Compiler AVR-GCC, Interruptserviceroutinen zu

deklarieren?

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 9

3. Versuchskomplex VK3 (C-Programmierung) Anzeige von Texten und Messung der Umgebungstemperatur Randbedingungen:

Skizzieren Sie einen Programmablaufplan und schreiben Sie anschließend die Quelltexte!

Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehlersuche.

Versuchsschwerpunkte:

Kennenlernen und Nutzung des TWI (I2C) Einsatz des LCD-Displays mit I2C (Modul I2C LCD-UNIT) Einsatz des Temperatursensors LM75 mit TWI (Modul I2C RTC-Temp.-Unit)

Aufgaben zu Versuchskomplex 3: a) Schreiben Sie ein C-Programm zur LCD-Ausgabe von 3 kurzen Texten, die im Codespeicher definiert sind. Die Textauswahl (1 aus 3) soll über 3 zugeordnete Tasten erfolgen, wobei ein kurzer Tastendruck zur Bedienung genügen soll. Die Anzeigeposition soll Zeile 1 und Spalte 2 sein Hinweise zu a):

Benutzen Sie den externen Interrupt 4 zur Realisierung der Tastenfunktionen! Treffen Sie Maßnahmen zur Entprellung! Verwenden Sie Funktionen der Header-Datei lcd.h. Machen Sie sich deshalb mit dem

Quelltext vertraut. Beachten Sie, dass lcd.h weitere Header-Dateien benötigt. Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung! Beachten Sie auch die Hinweise im Anlagenteil!

b) Schreiben Sie ein C-Programm zum Messen und Anzeigen der Umgebungstemperatur. Bedienungen sind nicht vorgesehen. Die Temperatur soll mit Maßeinheit °C auf dem I2C-LCD-Display angezeigt werden. Hinweise zu b):

Verwenden Sie Funktionalitäten der Header-Datei lm75.h und lcd.h. Machen Sie sich deshalb mit den Quelltexten vertraut.

Beachten Sie das lcd.h und lm75.h weitere Header-Dateien benötigen. Beachten Sie auch die Hinweise im Anlagenteil! Bei zu schnellem Auslesen des Temperatursensors kann es zu Fehlfunktionen kommen.

Sehen Sie deshalb in der Hauptprogrammschleife eine Zeitverzögerung von ca. 100 ms vor.

Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung!

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 10

c) Über das Einschalten einer LED soll die Überschreitung einer zu überwachenden Temperaturgrenze von +30 Grad signalisiert werden! Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung!! Kontrollfragen zur Vorbereitung des Versuchskomplexes VK3:

a) Welche I2C-Adressen haben die LCD-Anzeige und der Temperatursensor? b) Welche Portpins des ATmega128 stellen das SDA- und SCL-Signal zur Verfügung? c) Nennen Sie Wesenseigenschaften des I2C-Busses! d) Welche TWI-Komponente liefert das SCL-Signal? e) Welche Funktion hat das ACK-Bit bei der TWI-Kommunikation? f) Wie erfolgt beim TWI die Synchronisation auf einen beginnenden Datenstrom? g) Wie erfolgt beim TWI die selektive Kommunikation mit einem bestimmten Slave? h) Erläutern sie den TWI-Kommunikationsablauf beim Senden und Empfangen von

Daten! i) Welcher Programmablauf ist prinzipiell notwendig, damit ein Zeichens auf der I2C-

LCD-UNIT erscheint? j) Warum muss das MSB für jedes ASCII-Zeichen für die verwendetet LCD-Anzeige

gesetzt werden? k) Welche Funktionen werden durch die Datei lcd.h bereitgestellt? l) Wie kann die Positionierung von ASCII-Zeichen auf der LCD-Anzeige erfolgen? m) Erläutern Sie das Datenformat, wie der LM75-Sensor Temperaturmesswerte zur

Verfügung stellt! n) Welche Funktion ist in der Datei lm75.h enthalten? Erläutern Sie diese?

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 11

4. Versuchskomplex VK4 (C-Programmierung) Realisierung einer Frequenzmessung Randbedingungen:

Skizzieren Sie einen Programmablaufplan und schreiben Sie anschließend die Quelltexte!

Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehlersuche.

Versuchsschwerpunkte:

Anwendung von Timern Nutzung der Zeitgeber- und Zählerfunktion von Timern des ATmega128 Anzeige des gemessenen Frequenz auf dem LCD-Displays mit I2C (Modul I2C LCD-

UNIT) Realisierung einer einfachen Ablaufsteuerung für eine messtechnische Aufgabe

Aufgabe zum Versuchskomplex 4: Entwickeln Sie ein C-Programm, dass die Funktionalität einer Frequenzmessung realisiert. Treffen Sie sinnvolle Entscheidungen, welche Timer des ATmega128 welche Aufgaben dabei übernehmen. Das Messergebnis soll mit Maßeinheit (Hz) auf der I2C-LCD-Anzeige dargestellt werden. Bedienfunktionen sind nicht erforderlich. Das Zeitmessfenster für die Frequenzmessung soll genau 1s betragen! Mit Hilfe des Experimentiermoduls GENERATOR-UNIT wird für den Versuch die zu messende Frequenz bereitgestellt. Beachten Sie, dass dieses Modul weitere Betriebs-spannungen benötigt und deshalb zusätzlich das Modul Voltage-UNIT erforderlich ist! Die Modulbeschreibungen finden Sie auf der Webseite des MCLS-modular. Gehen Sie wie folgt vor:

Entwickeln Sie den Programmablauf für die notwendige Ablaufsteuerung der Frequenzmessung.

Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung! Machen Sie sich mit den Modulbeschreibungen vertraut! Führen Sie den Versuchsaufbau sorgfältig im spannungslosen Zustand aus! Schreiben Sie in Schritten den kommentierten Quelltext unter Nutzung des

vorgegebenen Quelltextrahmens und nehmen Sie das Programm mit Hilfe des Debuggers schrittweise in Betrieb!

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 12

Kontrollfragen zur Vorbereitung des Versuchskomplexes VK4:

a) Aus welchen Hauptkomponenten besteht ein Timer? b) Erläutern Sie die Basisfunktionen Zeitgeber und Zähler eines Timers! c) Über welche Timer verfügt ein ATmega128? d) Welche Haupteigenschaften haben diese? e) Was versteht man unter einem Autoreload-Modus? f) Wodurch ist ein Compare-Modus gekennzeichnet? g) Was versteht man unter einem Capture-Modus? h) Welches Problem kann auftreten, wenn ein Lese- oder Schreibzugriff auf ein 16-Bit

Zählregister eines Timers erfolgt? i) Wie wird für ein PWM-Signal, welches über einen Compare-Kanal ausgegeben werden

soll, Frequenz und Tastverhältnis eingestellt? j) Welche maximale Zählfrequenz ist für die Timer des im Praktikum eingesetzten

ATmega128 erreichbar? (ATmega-Core-Unit)

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 13

5. Versuchskomplex VK5 (C-Programmierung) Realisierung einer Temperaturregelung Randbedingungen:

Skizzieren Sie einen Programmablaufplan und schreiben Sie anschließend die Quelltexte!

Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehlersuche.

Versuchsschwerpunkte:

Anwendung des On-Chip-ADC für die Messung von Gleichspannungen Vergleich von Ist- und Sollwert und entsprechende Ansteuerung der Heizung auf der

TEMPERATURE-CONTROL-UNIT Einsatz eines Timers als Zeitgeber für die Ablaufsteuerung

Aufgaben zum Versuchskomplex 5: Entwickeln Sie ein C-Programm, dass die Funktionalität einer Temperaturregelung wie folgt realisiert:

Der ADC des ATmega128 soll in der Betriebsart einmalige Wandlung mit 10-Bit Auflösung und Interruptauslösung bei Wandlungsende zur Messwerterfassung betrieben werden. Als Eingänge für die zu messenden Spannungen von der TEMPERATURE-CONTROL-UNIT (Soll- und Istwert) sind die Analogeingänge AN0 und AN1 zu verwenden! Da in der Hardware-Konfiguration als externe Referenzspannung Vcc (5,0 V) am Pin AREF zur Verfügung steht, ist die Steuerbitauswahl im SFR ADMUX entsprechend zu wählen.

Im Zeitabstand von 200 ms sollen fortlaufend neue aktuelle Messwerte ausgewertet und in die Anzeige geschrieben werden. Wenn der Istwert kleiner als der Sollwert ist, so soll die Heizung der TEMPERATURE-CONTROL-UNIT eingeschaltet werden.

Die Zykluszeit von 200 ms ist mittels Zeitgeberinterrupt von Timer 0 zu realisieren. Beachten Sie die im Anlagenteil aufgeführten Hinweise zur Programmierung des ADC!

Gehen Sie wie folgt vor:

Entwickeln Sie den Programmablauf für die notwendige Ablaufsteuerung! Skizzieren Sie den Programmablaufplan vor der Quelltexterstellung! Machen Sie sich mit den Modulbeschreibungen vertraut! Führen Sie den Versuchsaufbau sorgfältig im spannungslosen Zustand aus! Schreiben Sie in Schritten den kommentierten Quelltext unter Nutzung des

vorgegebenen Quelltextrahmens.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 14

Kontrollfragen zur Vorbereitung des Versuchskomplexes VK5:

a) Mit welcher Auflösung arbeitet der ADU des ATmega128? b) Wie kann das Messergebnis in den 2 Ergebnisregistern abgelegt werden? c) Wie kann die Umrechnung des 10-bit ADU-Messwertes in einen Spannungswert über

C-Syntax erfolgen? d) Welche Betriebsarteneinstellungen des ADU sind möglich? e) Wovon hängt die Wandlungszeit des ADU ab? f) Welche Möglichkeiten gibt es für die Realisierung der Referenzspannung und zu

welchen Konsequenzen können diese Varianten führen? g) Was muss bedacht werden, wenn in unmittelbarer Folge Messungen an verschiedenen

Analogeingängen durchgeführt werden sollen?

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 15

Anlagenteil - Inhaltsübersicht Seite A1. Ausgewählte Assemblerdirektiven 16 A2. Ausgewählte Hinweise zur C-Programmierung 16 A3. Assemblerbibliothek binbcd.inc 17 A4. Assemblerbibliothek 7seg.inc für die Display-Unit 1 18 A5. Funktionsbibliothek 7seg.h für die Display-Unit 1 19 A6. Funktionsbibliothek bcd.h 20 A7. Funktionsbibliothek iic.h für das TWI 21 A8. Funktionsbibliothek lcd.h für die LCD-Anzeige 23 A9. Funktionsbibliothek lm75.h für den Temperatursensor 24 A10. Funktionsbibliothek rtc.h für die RTC 25 A11. Funktionsbibliothek delay_ms.h für Zeitverzögerungen 27 A12. Hinweise zur Ansteuerung der I2C-LCD-UNIT 28 A13. Hinweise zum Einsatz des ADC 31

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 16

A1. Ausgewählte Hinweise zu Assemblerdirektiven EQU – symbol equal to an expression allgemeine Syntax: .EQU label = expression Beispiel: .EQU RAMEND = 0x10FF DEF – symbolic name for a register allgemeine Syntax: .DEF Symbol = Register Beispiel: .DEF temp = r16 DB – Define constant byte(s) allgemeine Syntax: Label: .DB expressionlist Beispiel: const: .DB 0,255, 0b01010101 DW – Define constant word(s) allgemeine Syntax: Label: .DW expressionlist Beispiel: const: .DW 0xFFF, 45327, -32000 BYTE – Reserve bytes to a variable allgemeine Syntax: Label: .BYTE expression Beispiel: var1: .BYTE 1

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 17

CSEG – Code segment allgemeine Syntax: .CSEG Beispiel: .CSEG const: .DB 0x3F DSEG – Data segment allgemeine Syntax: .DSEG Beispiel: .DSEG var_K: .BYTE 1 ESEG – EEPROM segment allgemeine Syntax: .ESEG Beispiel: .ESEG eevar: .DB 0xBA ORG Set address counter allgemeine Syntax: .ORG expression Beispiel: .DSEG .org 0x0200 var6: .BYTE 1 INCLUDE – Include another file allgemeine Syntax: .INCLUDE „filename“ Beispiel: .INCLUDE „m128def.inc“

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 18

A2. Ausgewählte Hinweise zur C-Programmierung: a) Die Konfiguration eines einzelnen Portpin als Ausgang kann z. B. für Port B und Pin 0 über DDRB = (1<<PB0); erfolgen. b) Der Pegelwechsel an einem Portpin ist mit Hilfe der Standardbitmanipulation ^= realisierbar (z.B. PORTA ^= 0x01; für das Umschalten von Pin 0 an Port A). c) Zur Auswertung, ob eine einzelne Taste betätigt wurde (z. B. Taste an Portpin 0 von Port A, kann

if ((PINA & (1<<PINA0)) == 1) Aktion1; else Aktion2; eingesetzt werden. d) Für die Auswertung welche von mehreren Tasten betätigt wurde, bietet sich der Einsatz folgender switch-Kontrollstruktur an: switch(PINA) { case 0x01: break; // Test ob PA0 von PortA =1 und restliche Pins =0 …

}

e) In der Header-Datei lcd.h ist eine Funktion implementiert, welche die Ausgabe von nullterminierten Zeichenketten auf das LCD-Display ermöglicht. Dieser Funktion LCD_SEND_STRING (unsigned char *ptr_char); ist die Anfangsadresse eines nullterminierten Strings zu übergeben. Beispiel für die Deklarierung einer Zeichenkette im RAM-Speicher:

unsigned char String[] = {"Text"}; // Zeichenkette Beispiel für den Funktionsaufruf zur Ausgabe einer nullterminierten Zeichenkette: LCD_SEND_STRING (String); // Funktionsaufruf der Ausgabefunktion Alternativ: LCD_SEND_STRING(“Text“); Der Funktion LCD_SEND_STRING() muss zur Positionierung der nullterminierten Zeichenkette auf dem LCD ein Aufruf der Funktion LCD_gotoXY() vorausgehen.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 19

A3. Funktionsbibliothek binbcd.inc Die Funktionsbibliothek binbcd.inc beinhaltet ein Unterprogramm zur Wandlung einer 16 Bit Zahl in ein gepacktes BCD-Format für den Assembler-Versuchsteil. Unterpro-gramm

Beschreibung Datenübergabe

Datenrückgabe

BIN2BCD BCD-Wandlung eines 16 Bit Wertes

fbinL ;binärer Wert Low Byte fbinH ;binärer Wert High Byte

tBCD0 ;BCD Stelle 1 und 0 tBCD1 ;BCD Stelle 3uand 2 tBCD2 ;BCD Stelle 4

Tabelle 1: Funktion der binbcd.inc

Funktionsbeschreibung

Unterprogramm BIN2BCD: Mit Aufruf der Funktion BIN2BCD wird der Inhalt von fbinL und fbinH in ein gepacktes BCD-Format gewandelt. Beispiel für Funktionsaufruf: mov fbinL,ADCL ; ADC-Ergebnis low mov fbinH,ADCH ; ADC-Ergebnis high rcall BIN2BCD ; 16-bit BIN-BCD-Wandlung Die Rückgabewerte der Funktion sind in den Registern tBCD0, tBCD1 und tBCD2 nach folgendem Schema als gepackte BCD-Werte lokalisiert: tBCD2 : tBCD1 : tBCD0

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 20

A4. Funktionsbibliothek 7seg.inc für die DISPLAY-UNIT 1 Die Funktionsbibliothek 7seg.inc beinhaltet Unterprogramme zur Ansteuerung der Display-Unit1 für den Assembler-Versuchsteil. Unterprogramm Beschreibung Datenübergabe seg_init Initialisierung der DISPLAY-UNIT 1 ohne Parameter seg_out0 Ausgabe einer übergebenen Zahl an definierter

Displaystelle 0 seg ; Register r20

seg_out1 Ausgabe einer übergebenen Zahl an definierter Displaystelle 1

seg ; Register r20

seg_out2 Ausgabe einer übergebenen Zahl an definierter Displaystelle 2

seg ; Register r20

seg_out3 Ausgabe einer übergebenen Zahl an definierter Displaystelle 3

seg ; Register r20

Tabelle 2: Unterprogramme für DISPLAY-UNIT 1

Funktionsbeschreibung

Unterprogramm seg_init: Mit Aufruf der Funktion seg_init werden die vier Anzeigestellen der DISPLAY-UNIT 1 dunkel geschaltet. Beispiel für Funktionsaufruf: rcall seg_init // lösche alle 4 Displaystellen

Unterprogramme seg_out0, seg_out1, seg_out2, seg_out3 Über das Unterprogramm seg_outX kann eine Zahl im Bereich von 0 .. 9 an der entsprechenden 7-Segmentstelle 0 .. 3 auf der DISPLAY-UNIT 1 ausgegeben werden. Übergabeparameter ist das Register Register R20, dem das Symbol seg zugewiesen wurde. Dem Register seg können sinnvolle Werte zwischen dezimal 1 und 9 zugeordnet werden. Zusätzlich ist ein Löschen der übergebenen 7-Segmentstelle 0 .. 3 mit dem Übergabewert 0xff möglich. Beispiele für den Funktionsaufruf: ldi seg, 1 ; lade seg mit 1 (dezimal) rcall seg_out,0 ; Ausgabe der Zahl 1 auf Displaystelle 0 ldi r16,9 ; lade r16 mit 9 (dezimal mov seg,r16 ; kopiere r16 nach seg seg_out2 ; Ausgabe der Zahl 9 auf Displaystelle 2

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 21

A5. Funktionsbibliothek 7seg.h für die DISPLAY-UNIT 1 Die Funktionsbibliothek 7seg.h beinhaltet Funktionen zur Ansteuerung der Display-Unit1 im C-Versuchsteil. Funktion Beschreibung Datenübergabe seg_init Initialisierung der DISPLAY-UNIT 1 ohne Parameter seg_out Ausgabe einer übergebenen Zahl an definierter

Displaystelle 0 .. 3 unsigned char out unsigned char seg

Tabelle 3: Funktionen für DISPLAY-UNIT 1

Funktionsbeschreibung

Funktion void seg_init(void) Mit Aufruf der Funktion seg_init werden die vier Anzeigestellen der DISPLAY-UNIT 1 dunkel geschaltet. Beispiel für Funktionsaufruf: seg_init(); // lösche alle 4 Displaystellen

Funktion void seg_out(unsigned char out,unsigned char seg) Über die Funktion seg_out kann eine Zahl im Bereich von 0 .. 9 an der übergebenen 7-Segmentstelle 0 .. 3 auf der DISPLAY-UNIT 1 ausgegeben werden. Übergabeparameter sind die Variablen out und seg vom Typ unsigned char. Für die Variable seg sind folgende Werte einzusetzen: 0 Displaystelle 0 1 Displaystelle 1 2 Displaystelle 2 3 Displaystelle 3 Der Variable out können sinnvolle Werte zwischen dezimal 1 und 9 zugeordnet werden. Zusätzlich ist ein Löschen der übergebenen 7-Segmentstelle 0 .. 3 mit dem Übergabewert blank möglich. Beispiele für den Funktionsaufruf: seg_out(9,0); // gibt die Zahl 9 auf Displaystelle 0 aus seg_out(blank,3); // löscht Displaystelle 3 unsigned char x = 4; // Variable mit Wert 4 seg_out(x,2); // gibt die Variable x auf Displaystelle 2 aus

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 22

A6. Funktionsbibliothek bcd.h Die Funktionsbibliothek binbcd.inc beinhaltet eine Funktion zur Wandlung einer 16 Bit Zahl in ungepacktes BCD-Format für den C-Versuchsteil. Funktion Beschreibung Datenübergabe

Datenrückgabe

intbcd BCD-Wandlung eines 16 Bit Wertes

Unsigned int bcd einer // Stelle 0 zehner // Stelle 1 hundert // Stelle 2 tausend // Stelle 3 ztausend // Stelle 4

Tabelle 4: Funktion der binbcd.inc

Funktionsbeschreibung

Funktion intbcd: Mit Aufruf der Funktion intbcd wird der Inhalt der Übergabevariable bcd in ein ungepacktes BCD-Format gewandelt. Beispiel für Funktionsaufruf: intbcd(ADC); // 16-bit BIN-BCD-Wandlung des ADC-Ergebnisses Das Ergebnis der Funktion ist in den Variablen ztausend, tausend, hundert, zehner und einer enthalten.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 23

A7. Funktionsbibliothek iic.h für das TWI Die in der folgenden Tabelle dargestellten Funktionen bilden die Grundlage für weitere Bibliotheken zur Kommunikation der ATmega Unit mit I²C-Komponenten. Funktion Beschreibung Datenübergabe IIC_INIT Initialisierung des TWI mit 100kHz ohne Parameter IIC_START I²C-Start-Condition ohne Parameter IIC_STOP I²C-Stopp-Condition ohne Parameter IIC_SEND 1 Byte zum Slave senden unsigned char sendbyte IIC_REC_ACK 1 Byte mit/ohne Acknowledge empfangen unsigned char receive

Tabelle 5: Funktionen des TWI

Beschreibung der Einzelfunktionen:

Funktion void IIC_SEND(unsigned char sendbyte) Das zu sendende Byte wird der Funktion IIC_SEND() mit der Variable sendbyte vom Typ unsigned char übergeben. Beispiele für Funktionsaufrufe: #define adr_lcd 0x74 // Adr. LCD als Konstante im Flash

IIC_SEND(adr_lcd); // LCD adressieren IIC_SEND(0x40); // ein Datenbyte senden

Funktion void IIC_REC(unsigned char receive) In der Variable receive wird festgelegt, ob mit ACK oder NACK empfangen wird. ACK und NACK sind über eine #define Anweisung die Werte 0 und 1 zugeordnet. Das empfangene Byte ist nach Beendigung der Funktion in der globalen Variable receivebuffer abgelegt. Die Funktion hat folgende Struktur: Beispiele für Funktionsaufrufe:

Variable = IIC_REC(ACK); // ein Byte von einem adressierten Slave // mit Acknowledge empfangen Variable = IIC_REC(NACK); // ein Byte von einem adressierten Slave // ohne Acknowledge empfangen

Den Quelltext zu iic.h entnehmen Sie bitte dem Supportverzeichnis!

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 24

A8. Funktionsbibliothek lcd.h für die LCD-Anzeige Funktion Beschreibung Datenübergabe LCD_INIT Initialisierung der LCD-Anzeige ohne Parameter LCD_gotoXY LCD-Cursor Zeile und Spalte setzen unsigned char line/column LCD_SEND_STRING Zeichenkette auf LCD ausgeben unsigned char *ptr_char LCD_SEND_GRD °C auf LCD ausgeben ohne Parameter LCD_SEND_ASCII einzelnes ASCII auf LCD ausgeben unsigned char letter LCD_SEND_NUMBER einzelne BCD auf LCD ausgeben unsigned char number LCD_SEND_MARK Einzelnes Zeichen senden unsigned char mark

Tabelle 6: Funktionen der LCD-Anzeige

Beschreibung der Einzelfunktionen:

Funktion void LCD_INIT(void) Mit Aufruf der Funktion LCD_INIT wird die LCD-Anzeige ohne Cursor initialisiert und in den Grundzustand versetzt. Auf Adresse 0x00 des CG-RAM wird das Zeichen ° für die Temperaturausgabe abgelegt. Durch Änderungen innerhalb der Funktion können andere Einstellungen laut Datenblatt (LCD_s_7123.pdf) vorgenommen werden. Der Funktion brauchen keine Parameter übergeben werden. Sie liefert auch keinen Wert zurück.

Funktion void LCD_gotoXY(unsigned char line, unsigned char column) Über die Funktion LCD_gotoXY kann der Cursor an eine definierte Stelle auf der I²C-LCD-Anzeige gesetzt werden. Die Cursoradresse setzt sich zusammen aus der Anfangsadresse der LCD-Zeile und der Zeichennummer. Übergabeparameter sind folglich die Variablen line und column vom Typ unsigned char. Für die Variable line sind folgende Werte einzusetzen:

1 = LCD-Zeile 1 LCD-Adresse 0x00 2 = LCD-Zeile 2 LCD-Adresse 0x20 3 = LCD-Zeile 3 LCD-Adresse 0x40

Der Variable column können sinnvolle Werte zwischen dezimal 1 und 12 zugeordnet werden. Beispiel für einen Funktionsaufruf:

LCD_gotoXY(2,3); // setze Cursor auf Zeile 2 Zeichen 3

Funktion void LCD_SEND_STRING(unsigned char *ptr_char) Die Funktion LCD_SEND_STRING(unsigned char *ptr_char) kann zur Ausgabe von nullterminierten Zeichenketten auf der LCD-Anzeige eingesetzt werden. Ihr muss vor Aufruf der eigentlichen Ausgabefunktion die Anfangsadresse einer Zeichenkette übergeben werden. Beispiel für den Funktionsaufruf:

unsigned char text[]={"ACMC"}; // konstante Zeichenkette LCD_SEND_STRING(text); // Funktionsaufruf zur Ausgabe des // Inhaltes von „text“

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 25

Alternativ: LCD_SEND_STRING(“ACMC“); // direkte Ausgabe der Zeichenkette

Funktion void LCD_SENDGRD(void) Mit Aufruf der Funktion wird die Zeichenfolge °C an der aktuellen LCD-Cursorposition ausgegeben. Beispiel für Funktionsaufruf: LCD_SEND_GRD();

Funktion void LCD_SEND_ASCII(unsigned char letter) Mit Aufruf der Funktion wird ein übergebenes ASCII-Zeichen an der aktuellen LCD-Cursorposition ausgegeben. Beispiel für Funktionsaufruf: LCD_SEND_ASCII(’A’);

Funktion void LCD_SEND_NUMBER(unsigned char number) Mit Aufruf der Funktion wird eine übergebene ungepackte BCD-Zahl an der aktuellen LCD-Cursorposition ausgegeben. Beispiel für Funktionsaufruf: LCD_SEND_NUMBER(3);

Funktion void LCD_SEND_MARK(unsigned char mark) Mit Aufruf der Funktion wird ein übergebener Wert aus der Zeichetabelle des I²C-LCD an der aktuellen LCD-Cursorposition ausgegeben. Beispiel für Funktionsaufruf: LCD_SEND_MARK(0x1f);

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 26

A9. Funktionsbibliothek lm75.h für den Temperatursensor Funktion Beschreibung Parameter GET_TEMP_LM75 ( ) • Einlesen der Temperaturbytes des LM75

• Temperaturbyte in BCD Code wandeln • Wandlung und Bereitstellung der Ergebnisse im

Stringformat in s_lm75

keine

Tabelle 7: Funktion für den Temperatursensor LM75

Funktionsbeschreibung Funktion void GET_TEMP_LM75 ( ) Die Funktion liest über die I²C-Schnittstelle die zwei Bytes der aktuellen Temperatur vom LM75 aus.

Bild A1: Timing des LM75-Datentransfers Nachfolgend wird geprüft, ob die Temperatur im positiven (MSB Byte1 = 0) oder negativen (MSB Byte1 = 1) Bereich liegt und die Variable tempsign entsprechend auf ’+’ oder ’-’ gesetzt. Zusätzlich erfolgt bei negativer Temperatur die Konvertierung des Byte1 über das 2er-Komplement in einen Temperaturwert und die Speicherung in der Variable temperature. Anschließend wird das halbe Grad dedektiert, welches im MSB des Byte2 kodiert ist (MSB Byte2 = 0 ,0°C / MSB Byte2 = 1 ,5°C). Das Ergebnis wird in der Variable temphalf abgelegt. Abschließend wird ein nullterminierter String s_lm75 generiert, der die Ergebnisse enthält und mit der Funktion LCD_SEND_STRING auf dem I²C-LCD ausgegeben werden kann. Beispiel für Funktionsaufruf:

GET_TEMP_lm75 ( ); LCD_SEND_STRING (s_lm75);

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 27

A10. Funktionsbibliothek rtc.h für die RTC In dieser Bibliothek sind alle notwendigen Funktionen zum Initialisieren sowie zum Lesen der Register der RTC und zur Ausgabe der RTC-Daten auf die I2C LCD-UNIT implementiert. Folgende Tabelle enthält die Auflistung der bereitgestellten Funktionen:

Funktion Beschreibung Datenübergabe RTC_INIT

Initialisierung und Start der RTC Ohne Parameter

RTC_GET_INFO

Register von RTC lesen Informationen werden in der Struktur struct DS1307 abgelegt

RTC_OUT

Hilfsfunktion zur I²C-LCD-Ausgabe von RTC-Registerinhalten

unsigned char data_out

RTC_TIME_OUT

Ausgabe der Zeitinformationen unsigned char line, unsigned char column

RTC_DATE_OUT

Ausgabe der Datum Informationen unsigned char line, unsigned char column

RTC_DAY_OUT

Ausgabe des Wochentags unsigned char line, unsigned char column

Tabelle 8: Funktionen für die RTC DS1307

Funktionsbeschreibungen

Globale Variablen Die Struktur DS1307 dient dem Speichern der ausgelesenen Informationen der RTC. Mit der Strukturvariablen rtc_data ist der Zugriff auf die Objekte möglich. struct DS1307 { unsigned char sec; // Sekunden unsigned char min; // Minuten unsigned char hour; // Stunden unsigned char day; // Tag unsigned char date; // Datum unsigned char month; // Monat unsigned char year; // Jahr } rtc_data

Funktion void RTC_INIT(void) Die Initialisierung der RTC DS1307 ist nach einem Wechsel der Stützbatterie notwendig. Folgender Ablauf ist in der Funktion implementiert: IIC_SEND (0x00); // Sekunden = 00, Uhr an (RTC-Register 0x00) IIC_SEND (0x00); // Minuten = 00 (RTC-Register 0x01) IIC_SEND (0x00); // Stunden = 00, 24h-Modus (RTC-Register 0x02) IIC_SEND (0x02); // Wochentag = 2 (RTC-Register 0x03) IIC_SEND (0x01); // Tage = 01 (RTC-Register 0x04) IIC_SEND (0x01); // Monate = 01 (RTC-Register 0x05) IIC_SEND (0x02); // Jahre = 02 (RTC-Register 0x06) IIC_SEND (0x93); // Frequenzgang ein (RTC-Register 0x07)

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 28

Zusätzlich zur Initialisierung der RTC-Zeitregister werden die Speicherstellen des internen RAM mit 0x00 initialisiert.

Funktion void RTC_GET_INFO(void) Zum Lesen der Informationen der RTC-Register steht die Funktion RTC_IN() zur Verfügung, die die empfangenen Registerwerte in die Elemente der Struktur DS1307 einordnet. Beispiel für den Funktionsaufruf: RTC_GET_INFO();

Funktion void RTC_OUT(unsigned char data_out) Um die RTC-Informationen auf der LCD-Anzeige ausgeben zu können, müssen die Daten der RTC, die in einem gepackten BCD-Format vorliegen in das ungepackte BCD-Format überführt werden. Dazu ist die Hilfsfunktion RTC_OUT() implementiert. Als Übergabeparameter erwartet die Funktion einen RTC-Wert vom Typ unsigned char. Beispiel für den Funktionsaufruf: RTC_OUT(rtc_data.hour);

Funktion void RTC_TIME_OUT(unsigned char line unsigned char column) Mit dieser Funktion werden die Zeitinformationen der RTC auf dem I²C-LCD auf der angegebenen Zeile und Spalte ausgegeben. Das Ausgabeformat ist:

Std:Min:Sec Beispiel für den Funktionsaufruf: RTC_TIME_OUT(1);

Funktion void RTC_DATE_OUT(unsigned char line, unsigned char column) Diese Funktion ermöglicht die Ausgabe der Datumsinformationen an der gewünschten Zeile und Spalte des I²C-LCD im Format: date:month:year Beispiel für den Funktionsaufruf: RTC_DATE_OUT(1,3);

Funktion void RTC_DAY_OUT(unsigned char line, unsigned char column) Diese Funktion ermöglicht die Ausgabe der Wochentagsinformationen an der gewünschten Zeile und Spalte des I²C-LCD. Beispiel für den Funktionsaufruf:

RTC_DAY_OUT(2,2);

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 29

A11. Funktionsbibliothek delay_ms.h für Zeitverzögerungen Funktion Beschreibung Datenübergabe Void delayloop_1ms(unsigned int count) Generierung von 1ms Zeitverzögerung unsigned int count Void delay_ms(unsigned int dcount) Generierung von x ms Zeitverzögerung unsigned int dcount

Tabelle 9: Funktionen in delay_ms.h

Funktionsbeschreibungen

Funktion void delayloop_1ms(unsigned int count) Die Funktion void delayloop_1ms(unsigned int count) stellt eine Zeitverzögerungsschleife von genau 1ms bereit. Der Funktion ist die Übergabevariable count vom Datentyp unsigned integer zugeordnet, die in der Funktion als 16-bit Zählvariable und damit zur Generierung der Zeitverzögerung eingesetzt wird. Hinweise: Der Ablauf der Funktion wurde mit dem Inline-Assembler realisiert, da dadurch eine genauere Abschätzung der Softwarezeitverzögerung möglich ist. Die Übergabevariable wird vom Compiler einem Arbeitsregister zugeordnet. Somit ist die weitere Verwendung des übergebenen Wertes im Assemblerabschnitt der Funktion wie folgt möglich: asm volatile ( "cp %A0, __zero_reg__ \n\t" "cpc %B0, __zero_reg__ \n\t" "breq 2f \n\t" "1: \n\t" "sbiw %0,1 \n\t" "brne 1b \n\t" "2:" : "=w" (count) : "0" (count) );

Funktion void delay_ms(unsigned int dcount) Grundlage der Funktion ist die Funktion delayloop_1ms(), die über eine Zählschleife aufgerufen wird, bis der Übergabewert dcount = 0 ist. In folgender Tabelle sind ausgewählte Zeitverzögerungen angegeben:

Übergabewert asmvalue

resultierende Zeitverzögerung

1 1 ms 10 10 ms

100 100 ms 1000 1000 ms

10000 10000 ms

Tabelle 10: Ausgewählte Zeitverzögerungen

Beispiel für den Funktionsaufruf:

delay_ms(350);

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 30

A12. Hinweise zur Ansteuerung der I2C-LCD-UNIT Vor der ersten Verwendung muss das LCD in folgender Reihenfolge initialisiert werden:

Ablauf Displayfunktion mögliche Konfiguration 1. no operation 2. function set 4 Zeilen / 8 Bit Übertragungsmodus 3. display control Display ein und Cursor aus 4. entry mode set Display freeze / Cursor increment 5. clear display Cursor auf Adresse 0

Tabelle 11: Ablauf der LCD-Initialisierung

Instruction

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

Execute Time (max.)

NOP 0 0 0 0 0 0 0 0 No Operation 0 Clear Display 0 0 0 0 0 0 0 1 Clears entire display and sets DDRAM

address 0 in address counter 165ms

Return Home 0 0 0 0 0 0 1 0 Sets DDRAM address 0 in counter. Also returns shifted display to original position. DDRAM contents remain unchanged

165ms

Entry Mode Set 0 0 0 0 0 1 I/D S Sets cursor move direction and specifies shift of display. These operations are performed during data write and read.

40µs

Display Control 0 0 0 0 1 D C B Sets entire display on/off (D), cursor on/off (C) and blink of cursor position character (B)

40µs

Cursor display/shift 0 0 0 1 S/C R/L 0 0 Moves cursor and shifts display without changing DDRAM contents

40µs

Function set 0 0 1 DL N M G 0 Sets interface data length (DL), number of display lines (N,M), and voltage generator control (G)

40µs

Set CGRAM Address

0 1 address CGRAM Sets CGRAM address. 40µs

Set DDRAM Address

1 address DDRAM Sets DDRAM address. 40µs

Tabelle 12: Steuerbefehle für LCD-Display EA 7123-I²C

Bit 0 1 I/D Decrement increment S display freeze display shift D display off display on C cursor off cursor on B character at cursor position does not

blink character at cursor position blinks

S/C cursor move display shift R/L left shift right shift DL 4 bits 8 bits G voltage generator: VLCD = VO voltage generator: VLCD = VO – 0,8VDD N, (M=0) 1 line x 24 characters 2 lines x 24 characters N, (M=1) Reserved 4 lines x 12 characters

Tabelle ^3: Definition der Steuerbits

Dazu wird in der Header-Datei lcd.h die Funktion LCD_INIT(); bereitgestellt. Diese Funktion setzt auf die in Tabelle 19 angegebenen Steuerfunktionen für das LCD auf und muss nur einmalig im Gesamtprogramm aufgerufen werden. Der LCD-Cursor befindet sich nach Aufruf dieser Funktion auf Position Zeile 0, Zeichen 0 (linke obere Ecke des LCD).

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 31

Die LCD-Anzeige kann direkt ASCII-Code verarbeiten. Zusätzlich ist die Ausgabe von Sonderzeichen möglich, die ebenfalls in einer im LCD-Controller enthaltenen Zeichentabelle abgelegt sind.

Tabelle 14: Interne Zeichentabelle des I²C-LCD

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 32

Zur Ausgabe von ASCII- und Sonderzeichen ist folgende Reihenfolge der Aktionen einzuhalten:

I2C-Start LCD adressieren LCD für den Empfang von Zeichendaten vorbereiten (Steuersequenz 0x40 senden) Verarbeitungszeit der Steuersequenz einhalten ASCII-Zeichen mit Funktion IIC_SEND(...); senden ASCII-Zeichen mit Funktion IIC_SEND(...); senden ... I2C-Stopp

Hinweis: In der LCD-Zeichentabelle ist der ASCII-Code zum Einen in normaler Positionierung und zum Anderen um 180° gedrehter Position abgelegt, so dass die Anzeige in beiden Einbaurichtungen verwendet werden kann. Aus der realisierten Einbaurichtung des Displays auf der I2C LCD-Unit ergibt sich die Notwendigkeit einer programmtechnischen Anpassung des auszugebenden Zeichens. Jedes ASCII-Zeichen muss durch das Setzen des MSB (ODER-Verknüpfung mit 0x80) im zu sendenden Datenbyte auf die richtige Adresse in der Tabelle des LCD-Controllers gebracht werden. Programmbeispiel: IIC_SEND('A'|0x80); // Ausgabe ASCII-Zeichen A Da das Display über 3 Zeilen mit je 12 Zeichen (Spalten) verfügt, wird in der Header-Datei lcd.h die Funktion LCD_gotoXY(unsigned char line,unsigned char column); zum Setzen des Displaycursors bereitgestellt. Für jede Displayzeile ist eine Startadresse definiert.

Displayzeile Startadresse 1 0x00 2 0x20 3 0x40

Startadressen der Displayzeilen

Zu dieser Startadresse wird in der Funktion LCD_gotoXY(..); die übergebene Spaltennummer (Zeichenstelle) addiert und an das LCD gesendet.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 33

A13. Hinweise zum Einsatz des ADC Die Einstellung der ADC-Betriebsart erfolgt über die SFR ADMUX und ADCSRA.

ADMUX - ADC Multiplexer Selection Register Die Bits MUX4..MUX0 dienen der Auswahl des Eingangskanals für den ADC. Wenn diese Bits gleich 0 sind, ist der Analogeingang AN0 gesetzt. Mit MUX0 = 1 wird AN1 ausgwählt.

Über die Bits REFS1 und REFS0 wird festgelegt, welche Referenzspannungsquelle verwendet wird. Da in der Hardwarekonfiguration der ATmega-Unit am Pin AREF eine externe Referenzspannungsquelle angeschlossen ist, muss REFS0 = 1 gesetzt werden. Das Register ist für die einmalge Wandlung an AN0 bzw. AN1 wie folgt zu initialisieren: ADMUX = (1<<REFS0); // Init fuer AN0 ADMUX = (1<<REFS0)|(1<<MUX0); // Init fuer AN1

ADCSRA -ADC Control and Status Register A Die Bits ADPS2..ADPS0 bestimmen den Teilungsfaktor zwischen der Taktfrequenz und dem Eingangstakt des ADC, der bei 10-Bit Auflösung zwischen 50 und 200kHz liegen sollte.

Der Vorteiler ist wie folgt zu bestimmen:

74200

6,745.14

max

min ≈==kHz

kHzADCCPUVT

clk

clk und 29550

6,745.14

min

max ≈==kHz

kHzADCCPUVT

clk

clk

Laut ATmega128-Handbuch sind Vorteiler von 2, 4, 8, 16, 32, 64 und 128 möglich, so dass 128 einzusetzen ist ( ADPS2 = ADPS1 = ADPS0 = 1).

Der ADC arbeitet dann mit einer Frequenz von: kHzkHzVT

CPUADC clkclk 2,115

1286,745.14

===

Die Aufgabenstellung erfordert keinen Interruptbetrieb. Somit sind die Bits ADIE und ADIF = 0 zu setzen. Mit dem Löschen des Bits ADFR wird die Betriebsart Single-Shot-Mode für den ADC ausgewählt.

MCLS-modular® mit ATmega128 Modul MCAP

Praktikum MC-Applikation Stand 02/2011 HS Mittweida Fakultät EIT - Prof. Hagenbruch 34

Durch Setzen der Bits ADEN und ADSC wird der ADC eingeschaltet und die jeweilige Wandlung gestartet. Mit den getroffenen Festlegungen ist das SFR ADCSRA wie folgt zu initialisieren: ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); Nach dem Start einer AD-Wandlung am gewünschten Kanal kann das Wandlungsende über das Bit ADSC im SFR ADCSRA kontrolliert werden. While (!(ADCSRA&0x40)&0x40); Hinweis: Mit Hilfe der Syntax 1<<Bitbezeichner wird das angegebene Bit im betreffenden Spezialfunktionsregister gesetzt!