Versuchsprogramm zum Praktikum im Modul zum Modul MPCT Versuchsprogramm zum Praktikum im Modul MPCT ... (Assembler-Programmierung) 5

  • Published on
    05-May-2018

  • View
    212

  • Download
    0

Transcript

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT

    Versuchsprogramm zum Praktikum im Modul MPCT

    Inhaltsübersicht Einführung und Randbedingungen Versuchskomplexe VK1 bis VK4 Hinweise zur Assemblerprogrammierung Hinweise zur C-Programmierung Empfehlungen für das Debugging Funktionsbibliotheken

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 2

    Impressum Herausgeber: Application Center Microcontroller (ACMC) Hochschule Mittweida Redaktion: Prof. Dr.-Ing. O. Hagenbruch Dipl.-Ing. (FH) H. Polster Dipl.-Ing. (FH) M. Jahn Redaktionsstand: 01/2011 Urheberrecht:

    Der Inhalt dieses Dokuments ist urheberrechtlich geschützt. Alle Rechte, auch Über- setzungen, vorbehalten. Reproduktion, gleich welcher Art, ob Fotokopie, Mikrofilm oder Erfassung in Datenverarbeitungsanlagen nur mit schriftlicher Genehmigung des Herausgebers.

    Haftungsbeschränkung:

    Die Nutzung der in diesem Dokument zur Verfügung gestellten Inhalte erfolgt auf al- leinige Gefahr des Nutzers. Für mögliche Schäden (insbesondere entgangener Gewinn, Datenverlust bzw. Produktionsausfälle) übernimmt das ACMC, seine Lieferanten bzw. Dritte, die in dem Dokument erwähnt werden, keinerlei Haftung. Dies gilt nicht im Falle des Vorsatzes und für den Fall, dass eine Haftung gesetzlich zwingend vorge- schrieben ist. Falls die Nutzung des Dokuments bzw. der angebotenen Inhalte dazu führt, dass Sie Ihre Geräte oder Ihre Daten warten, reparieren, austauschen oder sonst wie korrigieren müssen, übernimmt das ACMC hierfür keinerlei Kosten.

    Anschrift des Herausgebers: Application Center Microcontroller Hochschule Mittweida Technikumplatz 17

    09648 Mittweida Telefon: +49-(0)3727-62 38 25 Fax: +49-(0)3727-62 38 25 Email: acmc@hs-mittwieda.de Web: www.acmc.hs-mittweida.de Anregungen, Wünsche und Hinweise zur Verbesserung des Handbuches sind jederzeit will- kommen. © 2010 Application Center Microcontroller

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 3

    Inhaltsverzeichnis

    Aufgabenteil Seite

    0 Einführung und Randbedingungen 4

    1 Versuchskomplex VK1 (Assembler-Programmierung) 5

    2 Versuchskomplex VK2 (Assembler- und C-Programmierung) 8

    3 Versuchskomplex VK3 (C-Programmierung) 13

    4 Versuchskomplex VK4 (C-Programmierung) 18

    5 Literaturhinweise 22

    Anlagenteil

    Übersicht zum Anlagenteil 23

    A1. Assembler-Funktionsbibliothek bcd.inc 24

    A2. Assembler-Funktionsbibliothek bin8tostring.inc.inc 26

    A3. Assembler-Funktionsbibliothek OLED_Funktionen.inc 27

    A4. C-Funktionsbibliothek bcd.c 31

    A5. C-Funktionsbibliothek clock.c 32

    A6. C-Funktionsbibliothek DS1339.c 34

    A7. C-Funktionsbibliothek MCP9801.c 36

    A8. C-Funktionsbibliothek oled.c 38

    A9. C-Funktionsbibliothek TWI.c 39

    A10. Hinweise zur Assemblerprogrammierung 40

    A11. Empfehlungen für das Debugging 45

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 4

    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. An Hand von praktischen Übungen sollen deshalb die theoretisch vermittelten Grundprinzipien und Basis- funktionen eines Mikrocontrollers trainiert und gefestigt werden. Als Basis für diese Übungen dient das Mikrocontroller-Trainingssystem hD2, in dem ein ATxmega128A1 als Mikrocon- troller zum Einsatz kommt. In den Versuchskomplexen 1 und 2 sind Aufgaben in Assemblerprogrammierung zu lösen. Der Übergang zur C-Programmierung erfolgt ab Versuchskomplex 2, indem eine zuerst in Assembler zu realisierende Applikation anschließend in C zu verwirklichen ist. Für die Durchführung der Versuche ist neben der Versuchshardware auch der Einsatz von Software-Entwicklungswerkzeugen notwendig. Zum Einsatz kommt das ATMEL AVR Stu- dio und WinAVR mit dem C-Compiler AVR-GCC. In diesen Werkzeugen sind alle notwen- digen Komponenten zur Programmentwicklung (u. a. Editor, Assembler, C-Compiler) zur Inbetriebnahme bzw. Fehlersuche (Debugging) und eine Hilfe integriert. Als Arbeitsmateria- lien während der unmittelbaren Versuchsdurchführung werden das „Das Programmiermodell der AVR ATXMEGA128A1“ (inklusive Befehlsliste), die „Kompaktinformation zur Pro- grammierung in Embedded C“ und vorliegendes Handbuch empfohlen. Für eine komfortable und auch maschinennahe Fehlersuche steht das Debug-Tool AVR JTAGICE mkII zur Verfü- gung. Die Ankopplung dieses Werkzeugs an die hD2 ist in der Bedienungsanleitung der hD2 dargestellt (Kapitel 4, Abschnitt „Programmierung mit externen Hardware-Tools“).

    0.1 Einstellung von Fuse-Bits Fuse-Bits dienen der Grundkonfiguration des ATXMEGA-Mikrocontrollers (s. Program- miermodell). Im Auslieferungszustand der hD2 sind die Fuse-Bits bereits programmiert und brauchen nicht verändert zu werden.

    !!! Wichtiger Hinweis !!!

    Falsche Einstellungen der Fuse-Bits können zu Fehlfunktionen führen!

    0.2 Einstellung des Systemtaktes Für ATXMEGA-Mikrocontroller sind vielfältige Einstellungen für die Auswahl einer Takt- quelle und die Einstellung der Taktfrequenz möglich. Im Rahmen des vorliegenden Ver- suchsprogramms soll der auf der hD2 bestückte 16 MHz Quarz eingesetzt werden. Für As- semblerprogramme muss deshalb zur Einstellung die Include-Datei Systemtakt.inc und für C- Programme die Datei clock.c in das jeweilige Projekt und die Header-Datei clock.h in den jeweiligen Quelltext aufgenommen werden. Damit steht in Assembler das aufrufbare Unter- programm CLOCK_INIT_16MHZ und für C die Funktion clock_init (16000000UL) zur Aus- wahl des 16 MHz Quarzes als Taktquelle zur Verfügung.

    0.3 Einsatz von Rahmenprojekten Setzen Sie vorgefertigte Rahmenprojekte ASMframe.aps und Cframe.aps für einen schnellen Einstieg in die Programmierung der hD2 ein.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 5

    1 Versuchskomplex VK1 (Assembler-Programmierung) Zugriff auf Daten und Programmspeicher, Zugriff auf Portpins

    1.1 Aufgaben zu Versuchskomplex VK1:

    c) Schreiben Sie ein Assemblerprogramm, welches 100 Bytes im RAM (ab 0x2000 loka- lisiert) in den RAM ab Adresse 0x3000 kopiert.

    Skizzieren Sie einen kompakten Programmablaufplan! Wenden Sie dabei die indirekte Adressierung an! Belegen Sie per Programm den Quellbereich im RAM ab Adresse 0x2000 mit ei-

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

    a) Test der Versuchsanordnung Verbinden Sie die hD2 mit dem AVR JTAGICE mkII (s. a. Bedienungsanleitung)! Verbinden Sie das JTAGICE per USB mit dem Host-PC! Schließen Sie an die hD2 das Steckernetzteil an! Starten Sie das AVR Studio! Öffnen Sie das Assembler-Projekt VK1.aps für das XMEGA-Target und studieren

    Sie den darin enthaltenen Befehlscode. Kontrollieren Sie an Hand des Stromlauf- planes, ob ein mögliches Portpin für eine LED-Ansteuerung über das Programm angesprochen werden kann.

    Übersetzen Sie den Quelltext und laden Sie den generierten Maschinencode in das Zielsystem.

    Debuggen Sie die Testapplikation mit den Kommandos Einzelschritt (F11), Pro- zedurschritt (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 anwe- sende Lehrpersonal!

    b) Editieren und kommentieren Sie folgende Befehlssequenz im AVR Studio: Test: ldi r16,0xA0

    T01: dec r16 cpi r16,0x00 brne T01 nop

    T02: rjmp T02 Ermitteln Sie die Programmlaufzeit der Befehlssequenz bis zum nop-Befehl!

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 6

    1.2 Randbedingungen: Realisierte Installation der Software-Werkzeuge (AVR Studio und WinAVR) auf Ih-

    rem Host-PC. Unterlagen und Dateien zum Versuchsprogramm vom Supportlaufwerk:

    „Itc\Prog“(R):\EIT\Hagenbruch\Modul MPCT

    oder auf Anfrage unter: acmc@hs-mittweida.de Skizzieren Sie zu den Teilaufgaben b) und c) einen Programmablaufplan und schrei-

    ben Sie anschließend jeweils das kommentierte Assemblerlisting! Verwenden Sie zur Erstellung eigener Programme das bereitgestellte Frame-Projekt! Nutzen Sie die Möglichkeiten des Debuggers zum Test und zur Fehlersuche.

    1.3 Versuchsschwerpunkte: Kennenlernen der hD2 und Test der Versuchsanordnung mit den Tools. Test ausgewählter Befehle und Adressierungsarten. Ansteuerung und Abfrage von Portpins.

    1.4 Allgemeine Informationen zur Adressierung von Spezialfunktionsregistern Jede On-Chip-Peripheriekomponente des ATXMEGA128A1 kann über I/O-Speicherbereiche im RAM, die Spezialfunktionsregister, adressiert werden. Der Zugriff erfolgt generell über die Assemblerbefehle LD/LDS/LDD zum Laden von Werten in die Arbeitsregister R0 .. R31 und ST/STS/STD zum Speichern von Werten in den Spezialfunktionsregistern. Im I/O-Adressbereich 0x00 - 0x3F können die Befehle IN und OUT zum direktem Zugriff verwendet werden. I/O-Register im Adressbereich 0x00 - 0x1F sind mit den Befehlen SBI und CBI direkt Bit-adressierbar. Der Zustand einzelner Bits in diesen Registern kann mit den Be- fehlen SBIS und SBIC ermittelt werden.

    1.5 Syntaxbeispiele für Portzugriffe in Assembler Jedem PORTx (x = A, B, C, D, E, F, H, J, K, Q oder R) ist ein Satz von Konfigurationsregis- tern zugeordnet. Die wichtigsten Register für den Portzugriff sind:

    PORTx_DIR - Data Direction Register PORTx_OUT - Data Output Value

    d) Schreiben Sie ein Programm, welches die Zeichen eines Strings im Programmspeicher (lokalisiert ab 0x1000) und in den RAM ab Adresse 0x2000 kopiert.

    Skizzieren Sie einen kompakten Programmablaufplan! Belegen Sie den Programmspeicher ab 0x1000 mit einem beliebigen String! Testen Sie Ihre Programmlösung mit den Möglichkeiten des Debuggers!

    e) Schreiben Sie ein Programm, welches den Zustand der Funktionstaste T2 pollt und bei gedrückter Taste einen 1Ton von 1 kHz über den Lautsprecher generiert!

    Nutzen Sie eine Zeitverzögerung per Software für die Tongenierung! Skizzieren Sie einen kompakten Programmablaufplan! Testen Sie Ihre Programmlösung mit den Möglichkeiten des Debuggers!

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 7

    PORTx_IN - Data Input Value Register Diese Register können direkt mit einer Bitmaske verknüpft werden. Beispiel Datenrichtung setzen: ldi r16,0b00001111 ; lade Register 16 mit Bitmaske sts PORTA_DIR,r16 ; Store Register 16 Direct to data space PORTA_DIR Beispiel Wert an PORTA ausgeben: ldi r16,0b00110011 ; lade Register 16 mit Bitmaske sts PORTA_OUT,r16 ; Store Register 16 Direct to data space PORTA_OUT Beispiel PORTA einlesen: lds r16,PORTA_IN ; Load Register 16 Direct from data space PORTA_IN Alternativ können zum Setzen, Löschen und Toggeln von einzelnen Portpins die Register PORTx_OUTSET, PORTx_OUTCLR und PORTx_OUTTGL verwendet werden. Mit dem Beschreiben der jeweiligen Bitposition erfolgt der direkte Zugriff auf das Portpin. Beispiele: Setzen, Löschen und Toggeln von Pin 0 an PORTA ldi r16,0b00000001 ; lade Register 16 mit Bitmaske (Pin 0 = 1) sts PORTA_OUTSET,r16 ; Pin 0 setzen sts PORTA_OUTCLR,r16 ; Pin 0 löschen sts PORTA_OUTTGL,r16 ; Pin 0 toggeln

    1.6 Kontrollfragen zur Vorbereitung des Versuchskomplexes 1 (ATxmega128A1):

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

    r17,0x01 ? j) Wozu dient das Transfer Register Bit T im Status-Register SREG? k) Wozu dient die .org – Direktive des Assemblers? l) Mit welchem Testbefehl kann direkt der Pegel am Portpin PB5 überprüft werden? m) Auf welche Hardwarekomponente eines Ports wird über das DATA Input Value Regis-

    ter zugegriffen? n) Wie kann eine Softwarezeitverzögerung von 1 ms für die vorliegende Taktung des

    ATxmega128A1 realisiert werden? o) Wie können Variablen im On-Chip-RAM durch Assemblerdirektiven lokalisiert ver-

    einbart werden?

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 8

    2 Versuchskomplex VK2 (Assembler- und C-Programmierung) Zählen, Bewerten und Anzeigen von Tastenbetätigungen

    2.1 Aufgaben zu Versuchskomplex 2:

    2.2 Randbedingungen: Skizzieren Sie jeweils einen Programmablaufplan und schreiben Sie anschließend die

    kommentierten Quelltexte! Verwenden Sie zur Erstellung eigener Programme die bereitgestellten Frame-Projekte! Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehler-

    suche.

    2.3 Versuchsschwerpunkte: Nutzung externer Interrupts. Verwendung der Grafikanzeige. Realisierung einer Applikation zuerst in Assembler und anschließend in C! Einsatz von Funktionsbibliotheken.

    2.4 Hinweise zur Nutzung der Funktionsbibliotheken

    2.4.1 Assemblerprogrammierung Für die Wandlung eines 8 Bit großen Zählwertes in einen String zur Ausgabe auf dem OLED wird die Funktion bin8tostring der Funktionsbibliothek bin8tostring.inc bereitgestellt. Diese Funktionsbibliothek benötigt zur Binär-BCD-Wandlung die Funktionsbibliothek bcd.inc. Die- se Bibliothek beinhaltet zusätzliche Routinen zur Wandlung von gepackten BCD-Werten in das ASCII-Format. Zur Ausgabe von ASCII-Zeichenketten auf dem OLED der hD2 wird die Funktion OLED_PUT_STRING_var der Funktionsbibliothek OLED_Funktionen.inc verwen- det. Beschreibungen zur Verwendung der benötigten Funktionen sind den jeweiligen Doku- menten zu den Bibliotheken zu entnehmen!

    2.4.2 C-Programmierung Für die Wandlung eines 8 Bit großen Zählwertes in einen String zur Ausgabe auf dem OLED wird die Funktion itoa der Standardlibrary stdlib.h verwendet. Zur Formatierung des Ausga- bestrings wird die Verwendung der Funktion strcat empfohlen, die über die Standardlibrary

    a) Schreiben Sie ein Assemblerprogramm, welches Anzahl der Betätigungen für die linke Funktionstaste (T1) per externem Interrupt bei steigender Flanke erfasst und in einer 8- Bit Zählvariablen kumuliert. Der Inhalt der Zählvariable (Anzahl erfolgter Tastenbetä- tigungen) soll im Grafikdisplay angezeigt werden!

    Ergänzen Sie das Programm durch eine Überwachung der Anzahl von Tastenbetäti-

    gungen. Bei mehr als 50 Tastenbetätigungen soll die rote LED blinken. Die Frequenz- generierung soll über eine Software-Zeitverzögerung erfolgen.

    b) Portieren Sie die Programmlösung von a) in eine C-Programmlösung mit identischer Zielfunktionalität!

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 9

    string.h verfügbar ist. Diese Standardbibliotheken des Compilers sind in die Hauptquelldatei zu inkludieren. Zur Ausgabe des gewandelten Zählwertes soll die in der Funktionsbibliothek oled.c enthaltenen Funktion oled_print verwendet werden. Mit der Inkludierung der Header- datei oled.h in die Hauptquelldatei und dem Einfügen der oled.c in das Projekt ist die Ver- wendung möglich. Beschreibungen zur Anwendung der benötigten Funktionen sind den je- weiligen Dokumenten zu den Bibliotheken zu entnehmen!

    2.4.3 Hinweise zur Nutzung von Interrupts a) Assemblerprogrammierung Auf einen internen oder externen Interrupt hin, wird der momentane Stand des Programm- counter (Rückkehradresse) auf dem Stack gerettet und der Befehlscode ab der Adresse, auf die eine vom Controllerhersteller spezifizierte 16-bit Adresse zeigt, ausgeführt (Interruptvek- tortabelle). Im Statusregister SREG wird mit Bit7 ( I ) die Interruptannahme durch den Core zugelassen („sei“) oder gesperrt („cli“).

    Abbildung 1: Statusregister SREG

    Beispiel zur Installation eines Interruptvektors in die Interruptvektortabelle: ; --------------------------------------------------------------------------------------------------------------- .cseg ; Codesegment im Flash .org 0x0000 ; Position des RESET-Vektors rjmp RESET ; Interruptvektor für RESET Sprung zu RESET ; --------------------------------------------------------------------------------------------------------------- .org PORTH_INT0_vect rjmp ISR_PORTH_INT0 ; Sprung zur ISR ; --------------------------------------------------------------------------------------------------------------- .cseg .org 0x0100 ; Adresse des Hauptprogramms im Codesegment RESET: ; Hauptprogramm ; Initialisierung eines PORT-Interrupt0 an PORTH ldi r16, 0x01 ; intlevel int0 = low sts PORTH_INTCTRL, r16 ldi r16, 0x01 ; low level interrupts enable sts PMIC_CTRL, r16 ldi r16, 0x01 ; PH0 als Interruptquelle (externer Interrupt) sts PORTH_INT0MASK, r16 ldi r16, 0x02 ; fallende Flanke sts PORTH_PIN0CTRL, r16 sei ; Zulassen der Interruptannahme durch den Core MAIN: rjmp MAIN ; --------------------------------------------------------------------------------------------------------------- ISR_PORTC_INT0: ; ISR für PORTC_INT0 … ; Interruptbehandlung reti ; Rückkehr aus Interrupt ; ---------------------------------------------------------------------------------------------------------------

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 10

    Das Register PORTH_INTCTRL beinhaltet die Konfiguration des Interruptlevels des externen Interrupts 0 an PORTH. Um die Low-Level-Interrupts einzuschalten, ist im Register PMIC_CTRL das Bit0 mit einer logischen 1 zu beschreiben (ATMEL: doc8077.pdf Seite 128). Im Register PORTH_INT0MASK wird festgelegt, welches Portpin als Interruptquelle fungiert. Im Register PORTH_PIN0CTRL wird festgelegt, auf welches Ereignis hin der Interrupt aus- gelöst wird. Möglich ist beispielsweise die Reaktion auf eine steigende oder fallende Flanke. Weitere Informationen sind dem Dokument doc8077.pdf von ATMEL zu entnehmen. b) C-Programmierung Funktionen zur Interrupt-Verarbeitung werden in der Includedatei interrupt.h der avr-libc zur Verfügung gestellt, die mit der #include-Anweisung in der C-Quelldatei einzubinden ist. Als Argument für eine Interruptserviceroutine (ISR) muss der Name des entsprechenden Inter- ruptvektors angegeben werden. Diese Vektoren sind in der Headerdatei iox128a1.h zu finden. Die Bezeichnung entspricht dem Namen aus dem Datenblatt, dem ein _vect angehängt ist.

    #define PORTH_INT0_vect_num 96 #define PORTH_INT0_vect _VECTOR(96) /* External Interrupt 0 */ #define PORTH_INT1_vect_num 97 #define PORTH_INT1_vect _VECTOR(97) /* External Interrupt 1 */

    Abbildung 2: Auszug aus der Datei iox128a1.h

    Grundsätzlich die Interruptserviceroutinen (ISR) wie folgt zu deklarieren: ISR(Vectorname_vect) Mit dem Makro wird eine ISR erstellt. Beispiel: Interruptserviceroutine für den externen Interrupt PORTH_INT0: ISR(PORTH_INT0_vect) { … // Nutzfunktionalität } Grundsätzlich werden durch den Compiler folgende Komponenten generiert:

    Einfügen des IV in die IVT (Sprung zur ISR) Retten und Wiederherstellen von R0, R1, R18 bis R31 und SREG Anfügen von reti an das Ende der ISR

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 11

    Wichtig ist, dass nach Abschluss der Initialisierung der verwendeten Interrupts die Interrupt- annahme durch die CPU mit dem Funktionsaufruf sei(); einzuschalten ist. Hinweise zur Kon- figuration der benötigten Interuptquellen sind dem Programmiermodell und dem Datenblatt des ATXMEGA128A1 zu entnehmen. Die Initialisierung des externen Interrupts 0 an PORTH ist wie folgt zu implementieren: // Initialisierung eines PORT-Interrupt0 an PORTH PORTH_INTCTRL = 0x01; // intlevel int0 = low PMIC_CTRL = 0x01; // low level interrupts enable PORTH_INT0MASK = 0x01; // PH0 als INT source PORTH_PIN0CTRL = 0x02; // fallende Flanke sei(); // globale Interruptannahme einschalten Das Register PORTH_INTCTRL beinhaltet die Konfiguration des Interruptlevels des exter- nen Interrupts 0 an PORTH. Um die Low-Level-Interrupts einzuschalten, ist im Register PMIC_CTRL das Bit0 mit einer logischen 1 zu beschreiben (ATMEL: doc8077.pdf Seite 128). Im Register PORTH_INT0MASK wird festgelegt, welches Portpin als Interruptquelle fungiert. Im Register PORTH_PIN0CTRL wird festgelegt, auf welches Ereignis hin der Interrupt aus- gelöst wird. Möglich ist beispielsweise die Reaktion auf eine steigende oder fallende Flanke. Weitere Informationen sind dem Dokument doc8077.pdf von ATMEL zu entnehmen.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 12

    2.5 Kontrollfragen zur Vorbereitung des Versuchskomplexes 2 (ATxmega128A1):

    a) Ab welcher Adresse ist die Interruptvektortabelle im Codespeicher lokalisiert? b) Auf welche Codespeicheradressen sind die Interruptvektoren für die externen Inter-

    rupts von PortA 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 be-

    einflusst 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 Unterpro-

    gramm 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? s) Welche Funktionen werden in der OLED-Funktionsbibliothek für die Assemblerpro-

    grammierung bereitgestellt?

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 13

    3 Versuchskomplex VK3 (C-Programmierung) Messen, Anzeigen und Bewerten der Temperatur (Sensor am TWI)

    3.1 Aufgaben zu Versuchskomplex 3:

    3.2 Randbedingungen: Skizzieren Sie jeweils einen Programmablaufplan und schreiben Sie anschließend die

    Quelltexte! Verwenden Sie zur Erstellung eigener Programme das bereitgestellte Frame-Projekt! Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehler-

    suche.

    3.3 Versuchsschwerpunkte: Einsatz des Temperatursensors MCP9801 am TWI (I2C) des ATXMEGA128A1. Nutzung von Zeitgeberinterrupts. Realisierung einer Applikation in C! Einsatz von C-Funktionsbibliotheken.

    3.4 Hinweise zu den Aufgaben

    3.4.1 Nutzung des Temperatursensors: Die hD2-Hardware ist mit einem Temperatursensor vom Typ MCP9801 der Firma Microchip ausgestattet. Er ist in Form eines separaten SMD-Bauelementes ausgeführt (obere Leiterplat- te, links vom Display, Beschriftung: „TS“). Dieser Sensor ist via I²C mit dem ATxme- ga128A1 verbunden. Der Temperatursensor MCP9801 wandelt gemessene Umgebungstem- peraturen in binäre Werte um und legt diese in Register ab, auf die mittels I²C zugegriffen werden kann. Neben diesen Temperaturregistern sind zusätzliche Steuerregister vorhanden, um z.B. die Messauflösung (9 bis 12 Bit) oder den Messmodus (kontinuierlich oder Einzel-

    a) Schreiben Sie ein C-Programm, welches fortlaufend die Messung und Anzeige der Umgebungstemperatur realisiert.

    Bei Überschreitung von 25 °C soll die LED D1 mit 0,5 Hz blinken und bei Überschrei- tung von 30 °C soll der Lautsprecher mit 2 kHz ein akustisches Signal ausgeben!

    Die Realisierung der jeweiligen Zeitbasis für das Blinken von LED und für die Laut- sprecherausgabe soll über Zeitgeberinterrupts der Timer E0 und Timer E1erfolgen.

    b) Ergänzen Sie die Programmlösung von a) um folgende Teilfunktionalitäten: Abspeicherung der letzten 50 Messwerte in einem Messwertpuffer Anzeige der Minimaltemperatur im Messwertpuffer per Tastendruck auf T1 Anzeige der Maximaltemperatur im Messwertpuffer per Tastendruck auf T2

    Hinweis: Die Tastendruckauswertung soll über externe Interrupts erfolgen!

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 14

    messung) einzustellen. Die Registerauswahl wird über ein Zeigerregister realisiert. Mit dem MCP9801 sind Messauflösungen von 9 Bit, 10 Bit, 11 Bit und 12 Bit realisierbar. Für die Umrechnung der Temperatur aus dem vom Sensor gelieferten Temperaturrohwert in einen realen Temperaturwert ist die folgende Berechnung zu verwenden:

    n RohwertSensorT

    2 = mit n = 1, 2, 3, 4 für 9-bit, 10-bit, 11-bit oder 12-bit Auflösung

    Zusätzlich können folgende Messmodi eingestellt werden: 1. „Continuous Conversion“: Dieser Modus misst permanent die Temperatur, wandelt diese in einen digitalen Wert und schreibt sie in die entsprechenden Register. 2. „Shutdown-Mode“: In diesem Modus werden alle Funktionen des MCP9801, mit Ausnahme des Kommunikati- onsinterfaces, deaktiviert. Sämtliche Register können weiterhin gelesen bzw. beschrieben werden. 3. „One-Shot-Mode“: Dieser Modus misst einmalig die Temperatur, wandelt diese in einen digitalen Wert und schreibt sie in die entsprechenden Register. Um in den „One-Shot-Mode“ zu gelangen, muss vorher der „Shutdown-Mode“ aktiviert worden sein. Beispiel: Der Temperatursensor soll kontinuierlich mit einer Auflösung von 12 Bit Tempera- turen messen. Dazu ist der folgende Funktionsaufruf im Quelltext zu implementieren: temp_set (TEMP_mode_contconv_gc, TEMP_res_12bit_gc); Für die Nutzung des MCP9801 werden Funktionsbibliotheken mit der zugehörigen Headerda- teien bereitgestellt. Es sind die Dateien MCP9801.c und TWI.c“ in das jeweilige Projekt ein- zufügen sowie die Dateien MCP9801.h und TWI.h in der Hauptquelldatei zu inkludieren. Re- levante Funktionen sind temp_set, get_temperature und temperature_to_string, deren Ver- wendung im Dokument hD2_MCP9801_Funktionen.pdf beschrieben sind.

    3.4.2 Hinweise zur C-Programmierung: Der ATxmega128A1 besitzt mehrere Timer. Ein Timer soll laut Aufgabenstellung für das Blinken der LED und ein Timer für die Tonausgabe verwendet werden. Die Timer sind hierzu in der Betriebsart NORMAL mit Interruptgenerierung beim Overflowereignis zur konfigurie- ren.

    Abbildung 3: NORMAL Mode Operation eines Timers

    Interrupt

    Overflow

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 15

    Zur Konfiguration der Timer im NORMAL Modue mit Overflowinterrupt werden die Spezi- alfunktionsregister TCE0_INTCTRLA, TCE1_INTCTRLA, PMIC_CTRL, TCE0_PER, TCE1_PER, TCE0_CTRLA und TCE1_CTRLA benötigt. Zusätzlich sind zwei Interruptser- viceroutinen für die Interruptbehandlung des jeweiligen Overflowereignisses (TCE0_OVF_vect, TCE1_OVF_vect) zu implementieren. In den Registern TCEx_INTCTRLA ist der Overflowinterrupt des jeweiligen Timers einzu- schalten und das Interruptlevel festzulegen. Mögliche Werte sind 0x01 = LO, 0x10 = MED und 0x11 = HI. Weitere Informationen sind dem ATMEL-Dokument doc8077.pdf Seite 123 zu entnehmen. Um den Low-Level-Interrupt einzuschalten, ist im Register PMIC_CTRL das Bit0 mit einer logischen 1 zu beschreiben (ATMEL: doc8077.pdf Seite 128). Das Register TCEx_CTRLA beinhaltet den Taktvorteiler des Timers der 1, 2, 4, 8, 64, 256 oder 1024 groß sein kann (ATMEL: doc8077.pdf Seite 165). Im Register TCEx_PER wird die Anzahl der Zählschritte des Timers bis zum Overflowereig- nis festgelegt. Der Wert für das Periodenregister TCEx_PER berechnet sich wie folgt:

    VT CPUt

    PERTCEx CLK ⋅

    =_ mit t = gewünschter Zeit, CPUClk = 16MHz, VT = Taktvorteiler

    Beispiel: Der Timer E0 soll nach jeweils 10 ms einen Overflowinterrupt generieren. TCE0_INTCTRLA = 0x01; // intlevel OVF = low für TimerE0 PMIC_CTRL = 0x01; // low level interrupts enable TCE0_PER = 2500; // periode timer E1 t = 2500 * (64 / 16MHz) = 10ms TCE0_CTRLA = 0x05; // prescaler = 64 für TimerE0 Die Interruptserviceroutinen sind im Programm wie folgt zu implementieren: ISR(TCE0_OVF_vect) für TimerE0 und ISR(TCE1_OVF_vect) für TimerE1.

    Für die Speicherung von 50 Messwerten bietet sich die Verwendung eines geeigneten Daten- feldes an. Dazu ist ein Feld vom Typ unsigned int zu deklarieren, dass 50 Elemente enthält. Der Zugriff kann über einen Indexzähler oder über einen geeigneten Zeiger erfolgen. Beispiel: Initialisierung des Datenfeldes und des Indexzählers

    unsigned int iTemperature[50]; // Datenfeld mit 50 Elementen unsigned char cIndexCount; // Indexzähler … Temperaturwert von MCP9801 holen und im Datenfeld einordnen

    iTemperature [cIndexCount] = get_temperature(); cIndexCount++; if (cIndexCount > 49) cIndexCount = 0;

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 16

    Für die Ermittlung der Minimal- bzw. Maximaltemperatur und den Vergleich der gemessenen Temperatur mit den jeweiligen Grenzen zum Einschalten der akustischen und optischen Sig- nalisierung sind Standardoperatoren zu verwenden. Die Behandlung der Tastenbetätigung soll analog zum VK2 per externem Interrupt INT0 und INT1 an PORTH erfolgen. Ausgaben auf dem OLED sind analog zum VK2 zu realisieren.

    3.4.3 Struktur des Hauptprogramms

    Abbildung 4: Struktur des Hauptprogramms Aufgabe 3 a)

    3.5 Kontrollfragen zur Vorbereitung des Versuchskomplexes 3 (ATxmega128A1):

    a) Welche I2C-Adressen haben die RTC und der Temperatursensor? b) Welche Portpins des ATxmega128A1 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?

    Initialisierungen

    Temperatur vom MCP9801 holen

    Temperatur auf OLED aus- geben

    Temperatur > 25 °C ?

    Softwarezeit

    Temperatur > 30 °C ? Timer E1 ein = LSP Ton an

    Timer E0 ein = LED blinken

    Timer E0 aus = LED aus

    Timer E1 aus = LSP aus

    ja

    ja

    nein

    nein

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 17

    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 Da-

    ten! i) Welcher Programmablauf ist prinzipiell notwendig, damit ein Zeichen auf der Grafik-

    anzeige dargestellt wird? j) Welche Funktionen werden in der TWI-Funktionsbibliothek für die C-

    Programmierung bereitgestellt? k) Wie kann die Positionierung von ASCII-Zeichen auf der Grafikanzeige erfolgen? l) Erläutern Sie das Datenformat, wie der Temperatursensor MCP9801 Temperatur-

    messwerte zur Verfügung stellt! m) Welche Funktionen werden in der OLED-Funktionsbibliothek für die C-

    Programmierung zur Verfügung gestellt?

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 18

    4 Versuchskomplex VK4 (C-Programmierung) Anzeigen der RTC-Informationen und Stellen der RTC

    4.1 Aufgaben zu Versuchskomplex 4:

    4.2 Randbedingungen: Skizzieren Sie jeweils einen Programmablaufplan und schreiben Sie anschließend die

    Quelltexte! Verwenden Sie zur Erstellung eigener Programme das bereitgestellte Frame-Projekt! Nutzen Sie die Möglichkeiten des Debuggers (AVR-Studio) zum Test und zur Fehler-

    suche.

    4.3 Versuchsschwerpunkte: Einsatz der RTC am TWI (I2C) des Mikrocontrollers. Realisierung einer Applikation in C! Einsatz von Funktionsbibliotheken.

    4.4 Hinweise zu den Aufgaben

    4.4.1 Funktion der RTC: Die hD2-Hardware ist mit einer Real Time Clock vom Typ DS1339 der Firma Maxim ausge- stattet. Sie ist in Form eines separaten SMD-Bauelementes ausgeführt(obere Leiterplatte, links vom Display, Beschriftung: „RTC“). Diese Uhr ist via I²C-Bus mit dem ATxme- ga128A1 verbunden. Die Taktquelle der Uhr ist ein externer Uhrenquarz, welcher eine Schwingfrequenz von 32,768 kHz besitzt. Zur Realisierung eines permanenten und netzunab- hängigen Betriebes ist die RTC DS1339 zusätzlich mit einer externen 3V-Stützbatterie verse- hen. Somit bleiben die einmal eingestellten Zeitdaten auch ohne angeschlossenes Netzteil über einen längeren Zeitraum erhalten. Die RTC DS1339 besitzt interne Timer/Counter, welche das verstreichen von einzelnen Se- kunden mit Hilfe der Taktreferenz des Uhrenquarzes ermitteln. Die verstrichenen Sekunden werden anschließend in Zählregistern aufsummiert. Es existieren Sekunden-, Minuten-, Stun-

    b) Ergänzen Sie die Programmlösung von a) um die Möglichkeit, Uhrzeit und Datum der RTC in einfacher Weise zu stellen. Setzen Sie den Joystick und die beiden Funktions- tasten zur Bedienung des Stellvorganges ein. Die Tastenabfrage soll mit dem Polling- verfahren im Hauptprogramm realisiert werden. Unterstützen Sie den Bediener des Stellvorganges mit geeigneten Textausgaben.

    c) Erweitern Sie das Programm, in dem Sie den Stellmodus mit der Center-Taste des Joy- stick unter Verwendung des externen Interrupt0 an PORTH starten und verlassen kön- nen.

    a) Schreiben Sie ein C-Programm, welches fortlaufend die RTC-Informationen auf dem Display darstellt!

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 19

    den-, Tages-, Datums-, Monats-, und Jahresregister, welche von der RTC automatisch mit entsprechendem Überlauf der Einheiten hoch gezählt werden. Besondere Überlaufbedingun- gen, wie z.B. langer Monat(31 Tage) oder Schaltjahr, werden ebenfalls korrekt behandelt.

    Abbildung 5: Übersicht über die Zeit- und Datumsregister, Quelle: Datenblatt Maxim DS1339

    Wie in der Abbildung zu erkennen ist, besitzt die DS1339 sieben Zeit- und Datumsregister, welche sowohl gelesen als auch beschrieben werden können. Weiterhin ist die Einheitenzu- ordnung zu Registern sowie die Ziffernzuordnung zu bestimmten Bits erkennbar. Der Inhalt der Zeit- und Datumsregister ist BCD-formatiert. Die DS1339 besitzt weitere Register. Diese sind jedoch für Anwendungen auf der hD2-Harware nicht relevant. Mit der Funktionsbibliothek DS1339.c und der zugehörigen Headerdatei DS1339.h werden die Funktionen get_time, put_time, time_to_string, day_to_string, date_to_string zur Verfü- gung gestellt, die eine einfache Nutzung der RTC erlauben. Die Verwendung ist im Doku- ment hD2_RTC_DS1339_Funktionen.pdf beschrieben. In das jeweilige Projekt sind die Da- teien DS1339.c und TWI.c“ einzufügen sowie die Dateien DS1339.h und TWI.h in der Haupt- quelldatei zu inkludieren.

    4.4.2 Hinweise zur C-Programmierung: Mit den Funktionen der Funktionsbibliotheken DS1339.c und oled.c kann die Visualisierung der Zeitinformationen der RTC auf einfache Weise realisiert werden. Durch den Aufruf der Funktion get_time(); werden die aktuellen RTC-Informationen im String RTCtime[7] in der Reihenfolge RTCtime[0] = Sekunden, RTCtime[1] = Minuten, RTCtime[2] = Stunden, RTC- time[3] = Wochentag, RTCtime[4] = Datum, RTCtime[5] = Monat und RTCtime[6] = Jahr im gepackten BCD-Format abgelegt. Mit den Wandlungsroutinen time_to_string(), day_to_string() und date_to_string() können diese in die Zeichenkette RTCstring[20] umge- wandelt werden. Durch Verwendung der OLED-Funktion oled_print(X,Y,RTCstring,BIG) ist danach die Ausgabe des jeweilig gewandelten Strings möglich. Beispiel: get_time(); // hole Zeitinformationen time_to_string(); // Wandlung der Uhrzeit in einen String oled_print(10,10,RTCstring,BIG); // Uhrzeit auf Display ausgeben Neue RTC-Informationen können mit der Funktion put_time() in die RTC übertragen werden. Dazu ist es notwendig, diese Informationen im gepackten BCD-Format bereitzustellen. In der Funktionsbibliothek bcd.c wird die Funktionen intbcd(unsigned int iBcd) zur Wandlung einer integer-Variablen vom binären Zahlenformat in ein gepacktes BCD-Format bereitgestellt. Rückkehrvariablen der Funktion sind bcd0, bcd1 und bcd2, in denen die Einer, Zehner sowie die Hunderter, Tausender und die Zehntausender-Stellen abgelegt sind. Die Variablen sind

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 20

    global definiert, sodass deren Inhalt von jedem Programmteil aus weiterverarbeitet werden kann. Beispiel: int iCount =12345; // int Variable mit Wert 12345 dezimal intbcd(iCount); // Funktionsaufruf

    bcd0 beinhaltet den Wert 0x45 bcd1 beinhaltet den Wert 0x23 bcd0 beinhaltet den Wert 0x01

    Weiterhin ist in der Funktionsbibliothek bcd.c die Funktion bcdchar(unsigned char in) im- plementiert, mit deren Hilfe eine gepackte 8-Bit große BCD-Zahl in einen Wert vom Typ character gewandelt werden kann. Rückkehrwert dieser Funktion ist der binäre Wert des übergebenen gepackten BCD-Wertes. Beispiel: unsigned char cBCD = 0x34; // unsigned char Variable mit BCD-Wert 0x34 unsigned char cBin; // unsigned char Variable cBin = bcdchar(cBcd); // Funktionsaufruf cBcd beinhaltet den Wert 0x22 bzw. 34 dezimal Beide Funktionen ermöglichen die Manipulation der RTC-Informationen, die nach dem Aus- lesen mit der Funktion get_time(); im String RTCtime[7] abgelegt sind. Beispiel: get_time(); // lesen der RTC Informationen RTCtime[1]= bcdchar(RTCtime[1]); // Wandlung der Minuten von BCD zu binär RTCtime[1]++; // Manipulation der Minuten intbcd(RTCtime[1]); // Rückwandlung der Minuten in gepacktes BCD RTCtime[1] = cBcd0; // speichern des BCD-Wertes im String RTCtime Alle Tasten, d.h. T1, T2 und der Joystick sind an PORTH des ATXMEGA128A1 angeschlos- sen. Für den einfachen Stellvorgang der RTC kann jeder Taste ein RTC-Wert zum Stellen der Zeitinformationen zugewiesen werden.

    Taste Funktion T1 Minuten +1 T2 Stunden +1 JoyUp Wochentag +1 JoyDown Day +1 JoyLeft Monat +1 JoyRight Jahr +1

    Tabelle 1: Tastenbelegung für RTC-Stellvorgang

    Die Tastenauswertung kann mithilfe des Pollingverfahrens einfach gelöst werden. Die Tas- tenerkennung ist mit einer switch-Kontrollstruktur möglich.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 21

    Beispiel: cIn = PORTH_IN; // lese PORTH Staus ein switch(cIn & 0b01111111) // maskiere cIn und erkenne Taste { case 0b01111110: … // Reaktion auf KeyT1 break; case 0b01111101: … // Reaktion auf KeyT2 break; … default: break; }

    4.4.3 Struktur des Hauptprogramms

    Abbildung 6: Struktur des Hauptprogramms Aufgabe 4 b)

    4.5 Kontrollfragen zur Vorbereitung des Versuchskomplexes 4 (ATxmega128A1):

    a) Welche Zeitinformationen stellt die RTC DS1339 zur Verfügung? b) Über welche zusätzlichen Register verfügt die RTC und wozu können diese dienen? c) In welchem Format sind die Zeitinformationen in der RTC gespeichert? d) Welche Umformatierungen sind für die RTC-Zeitinformationen notwendig, um eine

    Displayausgabe realisieren zu können? e) Über welche Taktquelle wird die RTC betrieben? f) Welche TWI-Adresse hat die RTC? g) Welche C-Funktionen für die RTC stellt das ACMC über die Funktionsbibliotheken

    zur Verfügung?

    Initialisierungen

    RTC-Zeitholen

    RTC-Zeit auf OLED aus- geben

    Wartezeit

    Taste betä- tigt?

    Taste auswerten nein

    ja

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 22

    h) Erläutern Sie die erforderlichen Programmschritte, um RTC-Zeitinformationen auszu- lesen und auf einen bestimmte Displayposition auszugeben!

    i) Erläutern Sie die Funktionsparameter für die Anzeigefunktion oled_print! j) Wie kann eine Zeitinformation in die RTC geschrieben werden? k) Erläutern Sie die Funktion einer switch-Kontrollstruktur! l) Wie sind die Funktionstasten und der Joystick am Mikrocontroller schaltungstech-

    nisch angekoppelt? m) Welche Alternativen bestehen zum Polling für die Abfrage der Funktionstasten? n) Abbildung 6 enthält die Grundstruktur des Programmablaufplanes für die Programm-

    aufgabe 4.1 a). Detaillieren Sie diesen Programmablaufplan insbesondere um die er- forderlichen Einzelinitialisierungen und um die Einzelaktionen, die für das Stellen der RTC notwendig sind!

    5 Literaturhinweise

    [1] Programmiermodell des AVR XMEGA128A1, Application Center Microcontroller, Hochschule Mittweida, 02/2010

    [2] Kompaktinformation zur Programmierung in Embedded C, Application Center Microcontroller, Hochschule Mittweida, 03/2010

    [3] Atmel Corporation: doc8077, XMEGA Manual, 04/2009 [4] Atmel Corporation: doc8067, 8/16-bit XMEGA A1 Microcontroller Manual ,

    04/2009 [5] Atmel Corporation: doc0856.pdf, 8 Bit AVR Instruction Set, 07/2009 [6] Beschreibungen zu Assembler- bzw.- C-Funktionen für Komponenten der hD2 und

    für weitere Funktionen auf R:\EIT\Hagenbruch\Modul MCPT [7] Online-Hilfe im AVR Studio 4.1x [8] Schmitt, G.: Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie,

    Oldenbourg Verlag München Wien, 3. Auflage 2007 [9] www.atmel.com

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 23

    Übersicht zum Anlagenteil

    Übersicht zum Anlagenteil 23

    A1. Assembler-Funktionsbibliothek bcd.inc 24

    A2. Assembler-Funktionsbibliothek bin8tostring.inc.inc 26

    A3. Assembler-Funktionsbibliothek OLED_Funktionen.inc 27

    A4. C-Funktionsbibliothek bcd.c 31

    A5. C-Funktionsbibliothek clock.c 32

    A6. C-Funktionsbibliothek DS1339.c 34

    A7. C-Funktionsbibliothek MCP9801.c 36

    A8. C-Funktionsbibliothek oled.c 38

    A9. C-Funktionsbibliothek TWI.c 39

    A10. Hinweise zur Assemblerprogrammierung 40

    A11. Empfehlungen für das Debugging 45

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 24

    A1. Assembler-Funktionsbibliothek bcd.inc Einführung In der Funktionsbibliothek bcd.inc werden die Funktionen SIGNED16_TO_BCD, BIN8_TO_BCD, BCD_TO_BIN8 und BCD_TO_ASCII zur Wandlung von Variablen vom binären Zahlenformat in ein gepacktes BCD-Format und zur Wandlung von gepacktem BCD in ASCII_Format bereitgestellt. Rückkehrvariablen können von jedem Programmteil aus wei- terverarbeitet werden. Unterprogramm- Name

    Beschreibung Übergabe-parameter Rückgabe- parameter

    SIGNED16_TO_BCD Wandlung 16-Bit Bi- närzahl (signed) in gepacktes BCD- Format

    val_signed16 (2 Byte) bcd2, bcd1, bcd0 (je 1 Byte)

    BIN8_TO_BCD Wandlung 8-Bit Binär- zahl (unsigned) in ge- packtes BCD-Format

    val_bin8 (1 Byte)

    bcd1, bcd0 (je 1 Byte)

    BCD_TO_BIN8 Wandlung gepacktes BCD-Format in 8-Bit Binärzahl (unsigned)

    bcd1, bcd0 (je 1 Byte)

    val_bin8 (1 Byte)

    BCD_TO_ASCII Wandlung gepackte BCD-Zahl in ASCII- Code

    bcd (1 Byte) ascii1, ascii0 (je 1 Byte)

    Tabelle 2: Funktionen der bcd.inc

    SIGNED16_TO_BCD Dieses Unterprogramm wandelt eine vorzeichenbehaftete 16-Bit Binär-Zahl in eine gepackte BCD-Zahl, einschließlich Vorzeichen. Die Binärzahl wird wie folgt übergeben: Übergabeparameter Beschreibung Hinweis val_signed16 vorzeichenbehaftete 16-Bit

    Binärzahl (Zweierkomplement- darstellung)

    Größe: 2 Byte val_signed16: Low-Byte val_signed16+1: High-Byte

    Tabelle 3: Übergabeparameter der SIGNED16_TO_BCD

    Die gepackte BCD-Zahl wird in 3 Byte zurückgegeben. Das höchste Byte (bcd2) enthält im oberen Nibble das Vorzeichen. Rückgabeparameter Beschreibung Hinweis bcd2 gepackte BCD-Zahl (Vorzei-

    chen, Zehntausender) Größe: 1 Byte Format: 000V:ZZZZ (Vorzeichen: Zehntausender) Vorzeichen = 0: positiv Vorzeichen = 1: negativ

    bcd1 gepackte BCD-Zahl (Tausen- der, Hunderter)

    Größe: 1 Byte Format: TTTT:HHHH

    bcd0 gepackte BCD-Zahl (Zehner, Einer)

    Größe: 1 Byte Format: ZZZZ:EEEE

    Tabelle 4: Rückkehrparameter der SIGNED16_TO_BCD

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 25

    BIN8_TO_BCD Dieses Unterprogramm wandelt eine 8-Bit Binärzahl in eine gepackte BCD-Zahl. Übergabeparameter Beschreibung Hinweis val_bin8 8-Bit Binärzahl Größe: 1 Byte

    Tabelle 5: Übergabeparameter der BIN8_TO_BCD

    Die BCD-Zahl wird in 2 Byte wie folgt zurückgegeben: Rückgabeparameter Beschreibung Hinweis bcd1 gepackte BCD-Zahl (Hunder-

    ter) Größe: 1 Byte Format: 0000:HHHH

    bcd0 gepackte BCD-Zahl (Zehner, Einer)

    Größe: 1 Byte Format: ZZZZ:EEEE

    Tabelle 6: Rückkehrparameter der BIN8_TO_BCD

    BCD_TO_BIN8 Dieses Unterprogramm wandelt eine gepackte BCD-Zahl in eine 8-Bit Binärzahl. Übergabeparameter Beschreibung Hinweis bcd1 gepackte BCD-Zahl (Hunder-

    ter) Größe: 1 Byte Format: 0000:HHHH (Hunderter)

    bcd0 gepackte BCD-Zahl (Zehner, Einer)

    Größe: 1 Byte Format: ZZZZ:EEEE (Zehner: Einer)

    Tabelle 7: Übergabeparameter der BCD_TO_BIN8

    Rückgabeparameter Beschreibung Hinweis val_bin8 8-Bit Binärzahl Größe: 1 Byte

    Tabelle 8: Rückkehrparameter der BCD_TO_BIN8

    BCD_TO_ASCII Dieses Unterprogramm wandelt eine gepackte BCD-Zahl in ASCII-Code. Übergabeparameter Beschreibung Hinweis bcd gepackte BCD-Zahl Größe: 1 Byte

    Format: ZZZZ:EEEE (Zehner: Einer)

    Tabelle 9: Übergabeparameter der BCD_TO_ASCII

    Der zurückgegebene ASCII-Code für die beiden Ziffern ist auf 2 Byte aufgeteilt. Rückgabeparameter Beschreibung Hinweis ascii1 ASCII-Code (Zehner) Größe: 1 Byte ascii0 ASCII-Code (Einer) Größe: 1 Byte

    Tabelle 10: Rückkehrparameter der BCD_TO_ASCII

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 26

    A2. Assembler-Funktionsbibliothek bin8tostring.inc Einführung Die Funktionsbibliothek zur Assemblerprogrammierung für das OLED beinhaltet eine Funk- tion zur Ausgabe von Zeichenketten. Oft ist die Ausgabe von reinen Zahlenwerten wie z.B. Zählwerten notwendig. Zur Wandlung solcher Werte in 8 Bit Größe in eine Zeichenkette wird die Funktionsbibliothek bin8tostring.inc bereitgestellt. Zur Funktionsbibliothek Es sind die Dateien „bin8tostring.inc“ sowie „bcd.inc“ in das jeweilige Projektverzeichnis zu kopieren und mit den Anweisungen .include „bin8tostring“ und .include "bcd.inc" im As- semblerquelltext einzufügen. Das Inkludieren der „bcd.inc“ ist notwendig, da in dieser Funk- tionsbibliothek Routinen zur BCD-Wandlung und zur ASCII-Wandlung enthalten sind, auf die in der Funktion „bin8tostring“ zurückgegriffen wird. Folgende Funktion ist für den Nutzer relevant: Funktionsname Beschreibung Übergabeparameter Rückgabeparameter bin8tostring Wandlung eines 8 Bit

    großen Wertes in eine Zeichenkette

    bin8in string_var

    Tabelle 11: bin8tostring

    Vor Aufruf der Funktion „bin8tostring“ ist der zu wandelnde 8-Bit-Wert in der SRAM- Variable „bin8in“ zu speichern. Nach Abarbeitung der Funktion bin8tostring steht das Ergeb- nis in der Zeichenkette „string_var“ zur weiteren Verarbeitung zur Verfügung. Beispiel: ldi r16,245 ; lade Register 16 mit 245 dezimal sts bin8in,r16 ; store r16 direct to dataspace bin8in rcall bin8tostring ; Funktionsaufruf Ergebnis steht in string_var

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 27

    A3. Assembler-Funktionsbibliothek OLED_Funktionen.inc Einführung Die hD2 besitzt ein 2,4“-OLED-Display mit einer Auflösung von 320x240 Pixel und einer Farbqualität von bis zu 262.000 Farben. Es ist mit einem Displaycontroller S6E63D6 der Firma Samsung ausgestattet, welcher via SPI mit dem ATXmega128A1 verbunden ist. Zur Funktionsbibliothek Es sind die Dateien OLED.inc (Funktionsbibliothek) und 8x14font.inc (Schriftzeichentabelle) in das jeweilige Projektverzeichnis einzufügen und in der Assemblerquelldatei zu inkludieren. Folgende Funktionen sind für den Nutzer relevant: Unterprogramm-Name Beschreibung Übergabeparameter OLED_INIT Initialisierung OLED keine OLED_CLEAR Display löschen keine OLED_SET_PIXEL Setzen eines Pixels oled_x_koord (2 Byte)

    oled_y_koord (1 Byte) oled_color (2 Byte)

    OLED_PUTC Ausgabe eines ASCII-Zeichens oled_x_koord (2 Byte) oled_y_koord (1 Byte) oled_color (2 Byte)

    OLED_PUT_STRING_const Ausgabe eines konstanten Strings (nullterminiert)

    Z-Pointer (auf den auszugeben- den String im Flash)

    OLED_PUT_STRING_var Ausgabe eines variablen Strings (nullterminiert) aus dem SRAM-Speicherbereich

    Z-Pointer (auf den auszugeben- den String im SRAM) oled_x_koord (2 Byte) oled_y_koord (1 Byte) oled_color (2 Byte)

    Tabelle 12: Funktionen der OLED.inc

    OLED_INIT Das Unterprogramm initialisiert das OLED Display. Das Unterprogramm muss vor der Ver- wendung des Displays aufgerufen werden. OLED_CLEAR Mit diesem Unterprogramm kann die Anzeige des OLED Displays komplett gelöscht werden. OLED_SET_PIXEL Dieses Unterprogramm dient zum Setzen eines einzelnen farbigen Pixel. Es müssen folgende Parameter übergeben werden: Parameter Beschreibung Hinweis oled_x_koord X-Koordinate des Pixels Größe: 2 Byte

    oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0…319

    oled_y_koord Y-Koordinate des Pixels Größe: 1 Byte Wert: 0…239 oled_color RGB-Farbcode für Pixel Größe: 2 Byte

    oled_color: Low-Byte oled_color+1: High-Byte

    Tabelle 13: Übersicht zur OLED_SET_PIXEL

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 28

    Für den RGB-Farbcode können die vordefinierten Farben BLACK, WHITE, RED, GREEN, BLUE und YELLOW verwendet werden. OLED_PUTC Mit diesem Unterprogramm kann ein einzelnes ASCII-Zeichen (Größe: 8x14 Pixel) auf das OLED Display ausgegeben werden. Folgende Parameter müssen dem Unterprogramm über- geben werden: Parameter Beschreibung Hinweis oled_char ASCII-Code Größe: 1 Byte oled_x_koord X-Koordinate obere linke Ecke

    des Zeichens Größe: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0…311

    oled_y_koord Y-Koordinate obere linke Ecke des Zeichens

    Größe: 1 Byte Wert: 0…225

    oled_color RGB-Farbcode für Zeichen Größe: 2 Byte oled_color: Low-Byte oled_color+1: High-Byte

    Tabelle 14: Übersicht zur OLED_PUTC

    Für den RGB-Farbcode können die vordefinierten Farben BLACK, WHITE, RED, GREEN, BLUE und YELLOW verwendet werden. OLED_PUT_STRING_const Mit diesem Unterprogramm kann ein konstanter String (Zeichengröße: 8x14 Pixel), welcher im Flash-Speicherbereich des Mikrocontrollers abgelegt ist, auf dem OLED Display ausgege- ben werden. Es müssen dem Unterprogramm folgende Parameter übergeben werden: Parameter Beschreibung Hinweis Z-Pointer (Registerpaar r31:r30)

    Zeiger auf das erste Zeichen des Strings

    Z-Pointer des Mikrocontrollers (r31:r30) enthält Adresse der Flashspeicherstelle des ersten Zeichens des Strings

    oled_x_koord X-Koordinate obere linke Ecke des ersten Zeichens des Strings

    Größe: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0…311

    oled_y_koord Y-Koordinate obere linke Ecke des ersten Zeichens des Strings

    Größe: 1 Byte Wert: 0…225

    oled_color RGB-Farbcode für String Größe: 2 Byte oled_color: Low-Byte oled_color+1: High-Byte

    Tabelle 15: Übersicht zur OLED_PUT_STRING_const

    Hinweis: Der String muss nullterminiert sein, d.h. dem String muss ein NULL- Zeichen angehangen sein (ASCII-Code: 0x00) ! Für den RGB-Farbcode können die vordefinierten Farben BLACK, WHITE, RED, GREEN, BLUE und YELLOW verwendet werden.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 29

    OLED_PUT_STRING_var Mit diesem Unterprogramm kann ein variabler String (Zeichengröße: 8x14 Pixel), welcher im SRAM-Speicherbereich des Mikrocontrollers abgelegt ist, auf dem OLED Display ausgege- ben werden. Es müssen dem Unterprogramm folgende Parameter übergeben werden: Parameter Beschreibung Hinweis Z-Pointer (Registerpaar r31:r30)

    Zeiger auf das erste Zeichen des Strings

    Z-Pointer des Mikrocontrollers (r31:r30) enthält Adresse der SRAM-Speicherstelle des ers- ten Zeichens des Strings

    oled_x_koord X-Koordinate obere linke Ecke des ersten Zeichens des Strings

    Größe: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0…311

    oled_y_koord Y-Koordinate obere linke Ecke des ersten Zeichens des Strings

    Größe: 1 Byte Wert: 0…225

    oled_color RGB-Farbcode für String Größe: 2 Byte oled_color: Low-Byte oled_color+1: High-Byte

    Tabelle 16: Übersicht zur OLED_PUT_STRING_var

    Hinweis: Der String muss nullterminiert sein, d.h. dem String muss ein NULL- Zeichen angehangen sein (ASCII-Code: 0x00) ! Für den RGB-Farbcode können die vordefinierten Farben BLACK, WHITE, RED, GREEN, BLUE und YELLOW verwendet werden. Beispiel: ; gibt einen variablen String, welcher im SRAM- Speicherbereich abgelegt ist, bei X = 20, Y = 10 aus ;---------------- ; Zuweisung des Speicherbereiches für den variablen String .dseg string_var: .byte 21 ;21 Byte (max. 20 Zeichen + NULL) ;---------------- .cseg ... ; Füllen des Strings mit ASCII-Zeichen, ; z.B. mit entsprechendem Unterprogramm ldi ZL, low(string_var) ; Low-Byte von Speicheradresse des String ldi ZH, high(string_var) ; High-Byte von Speicheradresse des String ldi r16, low(20) ; Low-Byte für X-Koordinate sts oled_x_koord, r16 ; Übergabe ldi r16, high(20) ; High-Byte für X-Koordinate

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 30

    sts oled_x_koord+1, r16 ; Übergabe ldi r16, 10 ; Y-Koordinate (nur 1 Byte) sts oled_y_koord, r16 ; Übergabe ldi r16, low(WHITE) ; Low-Byte RGB-Farbcode „WHITE“ sts oled_color, r16 ; Übergabe ldi r16, high(WHITE) ; High-Byte RGB-Farbcode sts oled_color+1, r16 ; Übergabe rcall OLED_PUT_STRING_var ; Aufruf Unterprogramm Informationen zu weiteren Funktionen zur Ansteuerung des OLED sind dem Dokument Be- schreibung OLED_Funktionen.pdf zu entnehmen.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 31

    A4. C-Funktionsbibliothek bcd.c Zur Funktionsbibliothek In der Funktionsbibliothek bcd.c wird die Funktion intbcd(unsigned int iBcd) zur Wandlung einer integer-Variablen vom binären Zahlenformat in ein gepacktes BCD-Format bereitge- stellt. Rückkehrvariablen der Funktion sind bcd0, bcd1 und bcd2, in denen die Einer, Zehner sowie die Hunderter, Tausender und die Zehntausender-Stellen abgelegt sind. Die Variablen sind global definiert, sodass der Inhalt von jedem Programmteil aus weiterverarbeitet werden kann. Beispiel: int iCount =12345; // int Variable mit Wert 12345 dezimal intbcd(iCount); // Funktionsaufruf

    bcd0 beinhaltet den Wert 0x45 bcd1 beinhaltet den Wert 0x23 bcd0 beinhaltet den Wert 0x01

    Zusätzlich ist in der Funktionsbibliothek bcd.c die Funktion bcdchar(unsigned char in) im- plementiert, mit deren Hilfe eine gepackte 8-Bit große Zahl in einen Wert vom Typ character gewandelt werden kann. Rückkehrwert dieser Funktion ist der binäre Wert des übergebenen gepackten BCD-Wertes. Beispiel: unsigned char cBCD = 0x34; // unsigned char Variable mit BCD-Wert 0x34 unsigned char cBin; // unsigned char Variable cBin = bcdchar(cBcd); // Funktionsaufruf cBcd beinhaltet den Wert 0x22 bzw. 34 dezimal

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 32

    A5. C-Funktionsbibliothek clock.c Einführung Der ATxmega128A1 besitzt erweitertes Potential zur Systemtakteinstellung. Wurden bei älte- ren AVR-Derivaten Takteinstellungen noch durch setzen von Fusebits vorgenommen, nimmt man diese bei XMEGAs nun im Programm mit dem Beschreiben von SFRs durch. Somit kann der Systemtakt durch Programmcode während der Laufzeit verändert und den temporä- ren Ressourcenanforderungen angepasst werden. Diese Eigenschaft kann z.B. zur Erstellung von Low-Power-Applikationen genutzt werden. Systemüberblick Folgende Taktquellen für den ATxmega128A1 sind möglich:

    o interner 2MHz-Oszillator o interner 32MHz-Oszillator o interner 32,768kHz-Oszillator o externe Quarzoszillatoren von 0,4 bis 16MHz Taktfrequenz o externer 32,768kHz-Quarzoszillator o sonstige externe taktgebende Signalquellen

    Nimmt man keine Takteinstellungen im Programmcode vor, so ist die Taktquelle auf den in- ternen 2MHz-Oszillator geschalten. Des Weiteren können die o. g. Frequenzen mit folgenden Funktionsgruppen bearbeitet wer- den:

    o PLL-Schaltkreis zur Multiplikation der Taktquelle mit Faktoren von 1x bis 31x o Taktvorteiler zum herabsetzen der Frequenz der Taktquelle mit Faktoren von

    1/1 bis 1/2048 o Kalibrierung der internen Oszillatoren

    Es ist zu beachten, dass die maximal zulässige Taktfrequenz bei 32MHz liegt. Überschreitun- gen dieser maximalen Frequenz können von undefinierten Aktionen bis zur dauerhaften Funktionsunfähigkeit des Controllers führen! Zur Funktionsbibliothek Es sind die Dateien „clock.c“, „clock.h“ sowie „avr_compiler.h“ in das jeweilige Projekt ein- zufügen. Mit dieser Bibliothek ist es ausschließlich möglich den externen 16MHz-Quarzoszillator, welcher auf der hD2 verbaut ist als Taktquelle zu verwenden. Dies sollte in Anbetracht der zur Verfügung stehenden Vorteiler und PLL-Multiplikatoren jedoch ausreichen, um eine gro- ße Menge von möglichen Systemtakten anbieten zu können. Da es möglich ist mit der Wahl einer entsprechenden Taktquelle und eines entsprechenden PLL-Faktors die maximal zulässige Taktfrequenz zu überschreiten, wurde die Funktionsbib- liothek zur Systemtakteinstellung so erstellt, dass solch ungünstige Einstellungen programm- technisch vermieden werden. Folgende Systemtakte sind einstellbar:

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 33

    Systemtakt Übergabewert für

    clock_init(unsigned long) 32 MHz 32000000UL 16 MHz 16000000UL 8 MHz 8000000UL 4 MHz 4000000UL 2 MHz 2000000UL 1 MHz 1000000UL 500 kHz 500000UL 250 kHz 250000UL 125 kHz 125000UL 62500 Hz 62500UL 31250 Hz 31200UL 15625 Hz 15625UL 7812 Hz 7812UL

    Tabelle 17: Systemtakte der CPU

    Die einzige für den Nutzer relevante Funktion der Bibliothek ist: clock_init(unsigned long); Diese Funktion initialisiert das Taktsystem mit einer vorgegebenen Frequenz. Als Übergabe- parameter ist die gewünschte Frequenz in Hz einzutragen. Es werden lediglich die o. g. Sys- temtakte verarbeitet. Wird eine andere Frequenz eingetragen, so wird der Controller weiterhin mit internen 2MHz betrieben. Sollte die hD2 mit Batterien betrieben werden, ist es ratsam den Systemtakt auf die momenta- ne Anforderung anzupassen um den Energieverbrauch zu senken.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 34

    A6. C-Funktionsbibliothek DS1339.c Einführung Die hD2-Hardware ist mit einer Real Time Clock vom Typ DS1339 der Firma Maxim ausge- stattet. Sie ist in Form eines separaten SMD-Bauelementes ausgeführt (obere Leiterplatte, links vom Display, Beschriftung: „RTC“). Diese Uhr ist via I²C-Bus mit dem ATxme- ga128A1 verbunden. Die Taktquelle der Uhr ist ein externer Uhrenquarz, welcher eine Schwingfrequenz von 32,768 kHz besitzt. Zur Realisierung eines permanenten und netzunab- hängigen Betriebes ist die RTC DS1339 zusätzlich mit einer externen 3V-Stützbatterie verse- hen. Somit bleiben die einmal eingestellten Zeitdaten auch ohne angeschlossenes Netzteil über einen längeren Zeitraum erhalten. Systemüberblick Die RTC DS1339 besitzt interne Timer/Counter, welche das verstreichen von einzelnen Se- kunden mit Hilfe der Taktreferenz des Uhrenquarzes ermitteln. Die verstrichenen Sekunden werden anschließend in Zählregistern aufsummiert. Es existieren Sekunden-, Minuten-, Stun- den-, Tages-, Datums-, Monats-, und Jahresregister, welche von der RTC automatisch mit entsprechendem Überlauf der Einheiten hoch gezählt werden. Besondere Überlaufbedingun- gen wie z.B. langer Monat(31 Tage) oder Schaltjahr werden ebenfalls korrekt behandelt.

    Abbildung 7: Auszug aus dem Registerfile des DS1339

    Wie in Abbildung 1 zu erkennen ist, besitzt die DS1339 sieben Zeit- und Datumsregister, welche sowohl gelesen als auch beschrieben werden können. Weiterhin ist die Einheitenzu- ordnung zu Registern sowie die Ziffernzuordnung zu bestimmten Bits erkennbar. Der Inhalt der Zeit- und Datumsregister ist bereits BCD-formatiert. Spätere Nachbearbeitungen durch Binär-zu-BCD-Umformalgorithmen entfallen dadurch. Die DS1339 besitzt noch weitere Register. Diese sind jedoch für Anwendungen auf der hD2- Harware nicht relevant. Zur Funktionsbibliothek Es sind die Dateien „DS1339.c“, „DS1339.h“, „TWI.c“, „TWI.h“ sowie „avr_compiler.h“ in das jeweilige Projekt einzufügen. Folgende Funktionen sind für den Nutzer relevant: Funktions- name

    Beschreibung Übergabeparameter Rückgabeparame- ter

    get_time Auslesen der aktuellen Uhrzeit und Datum aus der RTC

    Keine globaler String RTCtime[7]

    put_time Schreiben der Zeitdaten in die RTC

    globaler String RTCtime[7]

    keine

    time_to_string Umwandeln der Uhrzeit in einen globaler String globaler String

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 35

    String (Format: hh:mm:ss ->8 Zeichen)

    RTCtime[7] RTCstring[20]

    day_to_string Umwandeln des Wochentages in einen String

    globaler String RTCtime[7]

    globaler String RTCstring[20]

    date_to_string Umwandeln des Datums in ei- nen String (Format: dd.mm.20yy ->10 Zeichen)

    globaler String RTCtime[7]

    globaler String RTCstring[20]

    Tabelle 18: Funktionen der DS1339.c

    Mit den Funktionen get_time bzw. put_time kann man die Registerwerte der RTC1339 le- sen/verändern. Hierzu ist das Array RTCtime [7] mit 7 Variablen angelegt worden, um sämt- liche Zeit- und Datumsregister schreiben/lesen zu können. Für eine korrekte Schreiboperation bzw. die korrekte Auswertung der gelesenen Werte ist die Registerformatierung aus Abbil- dung 1 zu beachten. Die Routinen time_to_string, day_to_string und date_to_string wandeln bereits ausgelesene Registerwerte in Textstrings um sie in zeichenkettenverarbeitenden Funktionen (z.B. printf(), oled_print(), uputs()) weiterverarbeiten zu können. Zur Nutzung dieser Funktionen wird daher das Array RTCstring [20] mit ausreichend vielen char-Variablen bereitgestellt. Beachten soll- te man hierbei, dass jede Zeichenkette mindestens aus Nutztext und Endekennung(‘\0‘) be- steht.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 36

    A7. C-Funktionsbibliothek MCP9801.c Einführung Die hD2-Hardware ist mit einem Temperatursensor vom Typ MCP9801 der Firma Microchip ausgestattet. Er ist in Form eines separaten SMD-Bauelementes ausgeführt(obere Leiterplatte, links vom Display, Beschriftung: „TS“). Dieser Sensor ist via I²C mit dem ATxmega128A1 verbunden. Systemüberblick Der Temperatursensor MCP9801 wandelt gemessene Umgebungstemperaturen in binäre Wer- te um und legt diese in Register ab, auf welche mittels I²C zugegriffen werden kann. Neben diesen Temperaturregistern sind noch Steuerregister vorhanden um z.B. die Messauflösung (9 bis 12 Bit) oder den Messmodus (kontinuierlich oder Einzelmessung) einzustellen. Die Regis- terauswahl ist über ein Zeigerregister zu realisieren. Folgende Messauflösungen sind mit dem MCP9801 realisierbar:

    o 9 Bit o 10 Bit o 11 Bit o 12 Bit

    Folgende Messmodi sind mit dem MCP9801 auf der hD2 realisierbar: „Continuous Conversion“: Dieser Modus misst permanent die Temperatur, wandelt diese in einen digitalen Wert und schreibt sie in die entsprechenden Register. Da der Sensor permanent misst, nimmt er in die- sem Modus auch die meiste Leistung auf. „Shutdown-Mode“: In diesem Modus werden alle Funktionen des MCP9801, mit Ausnahme des Kommunikati- onsinterfaces, deaktiviert. Sämtliche Register können weiterhin gelesen bzw. beschrieben werden. „One-Shot-Mode“: Dieser Modus misst einmalig die Temperatur, wandelt diese in einen digitalen Wert und schreibt sie in die entsprechenden Register. Daher eignet sich dieser Modus besonders für energiesparende Anwendungen indem man die Messung nur zu definierten Zeitpunkten durchführt. Um in den „One-Shot-Mode“ zu gelangen muss vorher der „Shutdown-Mode“ aktiviert worden sein. Zur Funktionsbibliothek Es sind die Dateien „MCP9801.c“, „MCP9801.h“, „TWI.c“, „TWI.h“ sowie „avr_compiler.h“ in das jeweilige Projekt einzufügen. Folgende Funktionen sind für den Nutzer relevant:

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 37

    Funktionsname Beschreibung Übergabeparameter Rückgabeparameter temp_set Einstellung der Con-

    trolregister des MCP9801

    TEMP_mode_t modus, TEMP_res_t resolution

    keine

    get_temperature auslesen des Tempe- raturrohwertes aus dem MCP9801

    keine volatile uint16_t

    temperature_to_string Umwandlung des Temperaturrohwertes in einen String(vorzeichenric htig)

    short temp_value, char* string

    keine

    Tabelle 19: Funktionen der MCP9801.c

    Messmodus und Messauflösung sind mittels der Funktion temp_set einzustellen. Bei den Mo- di „continuous conversion” und “shutdown-mode” ist diese Routine nur einmal auszuführen. Beim „oneshot-mode” hingegen muss die Funktion vor jeder Einzelmessung aufgerufen wer- den. Bei Wahl des „oneshot-mode” ruft die Funktion temp_set automatisch vorher den “shut- down-mode” auf, sodass dies nicht noch einmal extra vorzunehmen ist. Der Temperaturwert, welcher mittels get_temperature ausgelesen wird, ist in binärer Form und somit für eine Weiterverarbeitung noch nicht geeignet. Der Wert muss daher noch unter Berücksichtigung der Kommastellen und der Auflösung BCD-gewandelt werden. Dies ge- schieht in der Funktion temperature_to_string . Sie wandelt diesen Wert in eine vorzeichen- richtige Temperatur als String inklusive der Einheitenbezeichnung „°C“ um. Mögliche Werte für den Datentyp TEMP_mode_t:

    o TEMP_mode_contconv_gc // continuous conversion o TEMP_mode_shutdown_gc // hutdown-mode o TEMP_mode_oneshot_gc // oneshot-mode

    Mögliche Werte für den Datentyp TEMP_res_t:

    o TEMP_res_9bit_gc o TEMP_res_10bit_gc o TEMP_res_11bit_gc o TEMP_res_12bit_gc

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 38

    A8. C-Funktionsbibliothek oled.c Einführung Die hD2 besitzt ein 2,4“-OLED-Display mit einer Auflösung von 320x240 Pixel und einer Farbqualität von bis zu 262.000 Farben. Es ist mit einem Displaycontroller S6E63D6 der Firma Samsung ausgestattet, welcher via SPI mit dem ATXmega128A1 verbunden ist. Zur Funktionsbibliothek Es sind die Dateien „OLED.c“, „OLED.h“, 8x14font.h, 16x28font.h sowie „avr_compiler.h“ in das jeweilige Projekt einzufügen. Folgende Funktionen sind für den Nutzer relevant: Funktionsname Beschreibung Übergabeparameter oled_init Initialisierung keine oled_clr Löschen des Bildschirmes keine oled_draw_line Zeichnen einer Linie in

    Vordergrundfarbe X-Startposition als word Y-Endposition als word X-Startposition als word Y-Endposition als word

    oled_draw_circle Zeichnen eines Kreises in Vordergrundfarbe

    X-Koordinate des Mittelpunktes als word Y-Koordinate des Mittelpunktes als word Radius als word

    oled_draw_rectangle Zeichnen eines Rechteckes X-Startposition als word Y-Endposition als word X-Startposition als word Y-Endposition als word

    oled_fill_rectangle Zeichnen eines Rechteckes in Vordergrundfarbe gefüllt

    X-Startposition als word Y-Startposition als word Weite ab X-Start als word Weite ab Y-Start als word

    oled_putc Schreiben eines ASCII- Zeichens

    X-Position als word Y-Position als word ASCII-Zeichen als char Schriftgröße(SMALL oder BIG)

    oled_print Schreiben einer ASCII- Zeichenkette

    X-Position als word Y-Position als word ASCII-Zeichenkette als char Schriftgröße(SMALL oder BIG)

    oled_write_picture Schreiben eines Bildes X-Position als word Y-Position als word Weite ab X-Start als word Weite ab Y-Start als word eindimensionales Word-Feld

    Tabelle 20: Funktionen der OLED.c

    Standardmäßig ist die Hintergrundfarbe als schwarz (BG_color=BLACK) und die Vorder- grundfarbe als weiß (FG_color=WHITE) definiert. Sollen andere Farben benutzt werden, so müssen diese vor deren Benutzung definiert werden. Dies kann z.B. in oled.c über Foreground colour erfolgen. Mögliche Farben sind „OLED.h“ zu entnehmen.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 39

    A9. C-Funktionsbibliothek TWI.c Einführung Diese Bibliothek stellt Funktionen zur TWI-Kommunikation über den Port C des ATxme- ga128A1 auf der hD2-Hardware zur Verfügung. Aufgrund der dort vorhandenen Bedingun- gen wird der Controller ausschließlich im TWI-Master-Modus betrieben. Es sind die Dateien „TWI.c“, „TWI.h“, sowie „avr_compiler.h“ in das jeweilige Projekt ein- zufügen. Zur Funktionsbibliothek Folgende Funktionen sind für den Nutzer relevant: Funktionsname Beschreibung Übergabeparameter Rückgabeparameter TWI_init Initialisierung des TWI keine keine TWI_MasterState Ermittlung des TWI-

    Zustandes keine TWI_MASTER_BUS

    STATE_t //siehe Typdef. Im Header

    TWI_MasterReady Ermittlung der Bereitschaft des TWI-Master

    keine bool

    TWI_MasterWriteR ead

    Sende- und Leserouti- ne(das physische senden erfolgt in der ISR)

    uint8_t adr //TWI-Slave- Adresse uint8_t *wData //zeigt auf 1. zu schreibendes Byte uint8_t bTW /bytes to write uint8_t bTR //bytes to read

    bool

    TWI_MasterInterru ptHandler

    physische Abarbeitung der Sende- und Lesevorgänge ( in der ISR aufzurufen)

    keine keine

    Tabelle 21: Funktionen der TWI.c

    Hinweise zur Benutzung Die Syntax der Interrupserviceroutine sollte wie nachstehend angegeben gewählt werden: ISR(TWIC_TWIM_vect) { TWI_MasterInterruptHandler(); }

    Möchte man globale Variablen in einer anderen Bibliothek nutzen (als in der wo sie deklariert wurde), so muss man die Variable dort erneut mit dem Präfix „extern“ deklarieren. Der Com- piler sucht dann zur Erstellzeit nach der Variablen mit der primären Definition (ohne extern) und verlinkt diese dann mit allen als extern definierten Variablen.

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 40

    A10. Hinweise zur Assemblerprogrammierung Hinweise zur Quelltexterstellung Typisches Format einer Assembler-Befehlszeile [Marke:] [Befehl] [Zieloperand, Quelloperand] [; Kommentar] Alle Angaben in eckigen Klammern sind optional, d.h. diese können ganz oder teilweise ent- fallen. Die Notation von [Marke:] erfolgt am linken Zeilenrand. Die weiteren Bestandteile einer As- sembler-Quelltextzeile werden zweckmäßig durch Tabulatoren getrennt, damit eine spalten- orientierte übersichtliche Textstruktur entsteht. Marke: Marken repräsentieren die Adresse eines Speicherplatzes, auf dem ein Befehl (Label:) lokalisiert ist. Befehl Ein Befehl stammt aus dem Befehlsvorrat des Mikrocontrollers. Die Befehlssyntax ist aus der Befehlsliste zu entnehmen. Operanden Je nach Befehl werden keine, ein oder zwei Operanden benötigt. Werden zwei Operanden benötigt, so sind diese durch ein Komma zu trennen. Der Zieloperand steht bei der ATmega-Serie immer vor dem Komma, der

    Quelloperand immer anschließend. ; Kommentar Nach Erkennung eines Semikolons wird der Rest der Zeile vom Assembler als Kommentar interpretiert. Anwendungsorientierte Kommentierungen sind für die Lesbarkeit von Assembler-Quelltexten unerlässlich. Beispiel für die Notation von Befehlszeilen: Test1: add r15,r17 ; addiere Register 15 und 17 ret ; Ende des Unterprogramms Direktiven .equ weist einer Konstanten einen Namen zu. Im Quelltext ist mit diesen symbolischen Be- zeichnern eine gut lesbare Befehlsfolge möglich. Beispiele: .equ zahl1 = 0x23 ; hexadezimale Notation

    .equ wert7 = 0b00101000 ; binäre Notation

    .equ maerz = 3 ; dezimale Notation .def bewirkt die Zuordnung von Variablen zu Registern. Beispiel: ; Variablen (Register) .def temp1 = r16

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 41

    .dseg definiert den Beginn eines Datensegments. Es besteht aus .byte-Direktiven und Labels. Mit der .org-Anweisung kann der zugehörige Adresszähler auf Adressen im SRAM gesetzt werden. Die default-Lokalisation des Zählers ist die SRAM-Adresse 0x60. .byte weist einer Variable Speicherplatz im Datensegment (DSEG) zu. Beispiele: .dseg var1: .byte 1 ; 1 Byte für var1 table: .byte 16 ; 16 Byte-Tabelle .cseg definiert den Beginn eines Code-Segments. Der Adresszähler kann mit der .org- Anweisung auf bestimmte Adressen im Programmspeicher gesetzt werden. Beispiele: .cseg const: .db 0x1f ; definiere 1 Byte-Konstante Progr: mov r2,r5 ; ausführbarer Befehl

    add temp2,temp3 ; ausführbarer Befehl .eseg definiert den Beginn eines EEPROM-Segments. Der zugehörige Adresszähler kann mit einer .org-Anweisung auf bestimmte Adressen im EEPROM gesetzt werden. Beispiel: .eseg var: .db 0x2e ; ein Byte im EEPROM var3: .dw 0xffe4 ; ein Wort im EEPROM .db definiert Byte-Konstanten im Programm- (cseg)/ EEPROM- (eseg) Segment. Beispiel: .cseg 000000 const: .db 0x1C, 0x23,“AB“ ; Deklarierung von Byte-Konstanten 000000 231C ; Ablage im Speicher bei Anzeige 000001 4241 ; in Wortbreite

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 42

    .dw definiert Wort-Konstanten im Programm- (cseg)/ EEPOM- (eseg) Segment. Beispiel: .cseg 000000 const: .dw 0x1A2B,261132/4 ; Deklarierung von Wort-Konstanten 000000 1a2b ; Ablage im Speicher bei Anzeige 000001 FF03 ; in Wortbreite .org definiert eine absolute Adresse. Mit dieser Direktive kann der Adresszähler für die ein- zelnen Speichersegmente (dseg 8-Bit Adresse, cseg 16-Bit Adresse sowie eseg 8-Bit Adresse) gesetzt werden. Beispiel: .dseg ; Beginn des Daten-Segments .org 0x3000 ; Setze Datensegment-Adresszähler auf 3000h ... .eseg ; Beginn des EEPROM-Segments .org 6 ; Setze EEPROM-Adresszähler auf 6 var3: .db 0x20 ; ein Byte auf EEPROM-Adresse 6 ... .cseg ; Beginn des Code-Segments .org 0x0014 ; Setze Codesegment-Adresszähler auf 14h MAIN: ldi temp1,0x5f ; Stackpointer low initialisieren … .include bindet eine andere Datei mit Sourcecode ein. Beispiele: .include "ATxmega128A1def.inc " .include "bcd.inc" .include "OLED.inc" .list und .nolist schalten die Erzeugung des Programmlisting in der vom Assembler erzeugten Listing-Datei ein bzw. aus. Beispiel: .nolist ; Erzeugung des Listing aus .include "ATxmega128A1def.inc " ; Einbinden einer Bibliothek .list ; Erzeugung des Listing ein

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 43

    Assemblerdirektiven EQU – symbol equal to an expression allgemeine Syntax: .equ label = expression Beispiel: .equ RAMEND = 0x3FFF 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 0x0FFF, 45327, -32000 BYTE – Reserve bytes to a variable allgemeine Syntax: Label: .byte expression Beispiel: var1: .byte 1 CSEG – Code segment allgemeine Syntax: .cseg Beispiel: .cseg const: .db 0x3F

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 44

    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 0x02100 var6: .byte 1 INCLUDE – Include another file allgemeine Syntax: .include „filename“ Beispiel: .include „m128def.inc“ Hinweis: Benutzen Sie als Arbeitsmaterial während der C-Programmierung die „Kompaktinformation zur Programmierung in Embedded C“ bzw. weitere empfohlene Literatur!

  • Application Center Microcontroller Hochschule Mittweida

    Versuchsprogramm zum Modul MPCT 45

    A11. Empfehlungen für das Debugging Zum Test und zur Inbetriebnahme ist der Einsatz von Debuggingfunktionen des AVR Studio 4 notwendig. Zusätzlich dienen diese Möglichkeiten der Fehlersuche auch zum Kennenlernen der internen Abläufe und Funktionen des Mikrocontrollers. Nach dem Start des Debuggings mit dem Kommando Ctrl + F7 (Project Build and Run) kann der Programmablauf On- Chip debuggt werden.

    Abbildung 8: Debugging im AVR Studio

    Im Workspace-Fenster kann im Reiter Processor der Systemzustand beobachtet werden. Ins- besondere sind das die Zustände von:

    Registern (Register 0-15 / Register 16-31) Processor I/O-Komponenten (IO View XMEGA128A1)

    Zusätzlich ist die Überwachung von Variablen in einem Watch-Fenster und die Inspektion von Programm- und Datenspeicher möglich. Diese Fenster sind über das Menü View Watch bzw. Memory erreichbar. Mit Hilfe verschiedener Bedienkommandos kann die Inbetriebnahme erfolgen bzw. der Funk- tionstest des Programms durchgeführt werden. Dazu sind folgende Kommandos zu verwen- den:

    Go F5 Reset Shift + F5 set/clear Breakpoint F9 Einzelschritt (Trace Into) F11 Prozedurschritt (Step Over) F10

    Die Aktivierung bzw. Deaktivierung eines Breakpoints kann für eine Befehlszeile im Quell- textfenster an der aktuellen Cursorposition über das Kommando F9 erfolgen. Mit dem Kom- mando F5 (Go) stoppt die Programmausführung an dieser Stelle.

Recommended

View more >