Versuchsanleitung MCAP 23022011 - acmc-ls.de® mit ATmega128 Modul MCAP ...
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!