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

  • Published on
    05-May-2018

  • View
    215

  • Download
    3

Transcript

Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT Versuchsprogramm zum Praktikum im Modul MPCT Inhaltsbersicht Einfhrung und Randbedingungen Versuchskomplexe VK1 bis VK4 Hinweise zur Assemblerprogrammierung Hinweise zur C-Programmierung Empfehlungen fr 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 geschtzt. Alle Rechte, auch ber-setzungen, vorbehalten. Reproduktion, gleich welcher Art, ob Fotokopie, Mikrofilm oder Erfassung in Datenverarbeitungsanlagen nur mit schriftlicher Genehmigung des Herausgebers. Haftungsbeschrnkung: Die Nutzung der in diesem Dokument zur Verfgung gestellten Inhalte erfolgt auf al-leinige Gefahr des Nutzers. Fr mgliche Schden (insbesondere entgangener Gewinn, Datenverlust bzw. Produktionsausflle) bernimmt das ACMC, seine Lieferanten bzw. Dritte, die in dem Dokument erwhnt werden, keinerlei Haftung. Dies gilt nicht im Falle des Vorsatzes und fr den Fall, dass eine Haftung gesetzlich zwingend vorge-schrieben ist. Falls die Nutzung des Dokuments bzw. der angebotenen Inhalte dazu fhrt, dass Sie Ihre Gerte oder Ihre Daten warten, reparieren, austauschen oder sonst wie korrigieren mssen, bernimmt das ACMC hierfr 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, Wnsche 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 Einfhrung 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 fr das Debugging 45 Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 4 0 Einfhrung und Randbedingungen Eine effiziente und erfolgreiche Entwicklung von Software fr 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 fr 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 lsen. Der bergang zur C-Programmierung erfolgt ab Versuchskomplex 2, indem eine zuerst in Assembler zu realisierende Applikation anschlieend in C zu verwirklichen ist. Fr die Durchfhrung 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 whrend der unmittelbaren Versuchsdurchfhrung werden das Das Programmiermodell der AVR ATXMEGA128A1 (inklusive Befehlsliste), die Kompaktinformation zur Pro-grammierung in Embedded C und vorliegendes Handbuch empfohlen. Fr 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 verndert zu werden. !!! Wichtiger Hinweis !!! Falsche Einstellungen der Fuse-Bits knnen zu Fehlfunktionen fhren! 0.2 Einstellung des Systemtaktes Fr ATXMEGA-Mikrocontroller sind vielfltige Einstellungen fr die Auswahl einer Takt-quelle und die Einstellung der Taktfrequenz mglich. Im Rahmen des vorliegenden Ver-suchsprogramms soll der auf der hD2 bestckte 16 MHz Quarz eingesetzt werden. Fr As-semblerprogramme muss deshalb zur Einstellung die Include-Datei Systemtakt.inc und fr 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 fr C die Funktion clock_init (16000000UL) zur Aus-wahl des 16 MHz Quarzes als Taktquelle zur Verfgung. 0.3 Einsatz von Rahmenprojekten Setzen Sie vorgefertigte Rahmenprojekte ASMframe.aps und Cframe.aps fr 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 Programmlsung mit den Mglichkeiten 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! Schlieen Sie an die hD2 das Steckernetzteil an! Starten Sie das AVR Studio! ffnen Sie das Assembler-Projekt VK1.aps fr das XMEGA-Target und studieren Sie den darin enthaltenen Befehlscode. Kontrollieren Sie an Hand des Stromlauf-planes, ob ein mgliches Portpin fr 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 Mglichkeiten 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 anschlieend jeweils das kommentierte Assemblerlisting! Verwenden Sie zur Erstellung eigener Programme das bereitgestellte Frame-Projekt! Nutzen Sie die Mglichkeiten des Debuggers zum Test und zur Fehlersuche. 1.3 Versuchsschwerpunkte: Kennenlernen der hD2 und Test der Versuchsanordnung mit den Tools. Test ausgewhlter 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 knnen 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 fr 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 fr 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 Programmlsung mit den Mglichkeiten des Debuggers! e) Schreiben Sie ein Programm, welches den Zustand der Funktionstaste T2 pollt und bei gedrckter Taste einen 1Ton von 1 kHz ber den Lautsprecher generiert! Nutzen Sie eine Zeitverzgerung per Software fr die Tongenierung! Skizzieren Sie einen kompakten Programmablaufplan! Testen Sie Ihre Programmlsung mit den Mglichkeiten des Debuggers! Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 7 PORTx_IN - Data Input Value Register Diese Register knnen direkt mit einer Bitmaske verknpft 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 knnen zum Setzen, Lschen 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, Lschen 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 lschen 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 knnen Konstanten im Codespeicherbereich gelesen werden? c) Welche Wesensmerkmale kennzeichnen die Stackfunktionalitt? 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 Gre sind die Befehle codiert? h) Ist der Befehl ldi r12,0xc3 mglich? 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 berprft werden? m) Auf welche Hardwarekomponente eines Ports wird ber das DATA Input Value Regis-ter zugegriffen? n) Wie kann eine Softwarezeitverzgerung von 1 ms fr die vorliegende Taktung des ATxmega128A1 realisiert werden? o) Wie knnen 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) Zhlen, Bewerten und Anzeigen von Tastenbettigungen 2.1 Aufgaben zu Versuchskomplex 2: 2.2 Randbedingungen: Skizzieren Sie jeweils einen Programmablaufplan und schreiben Sie anschlieend die kommentierten Quelltexte! Verwenden Sie zur Erstellung eigener Programme die bereitgestellten Frame-Projekte! Nutzen Sie die Mglichkeiten 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 anschlieend in C! Einsatz von Funktionsbibliotheken. 2.4 Hinweise zur Nutzung der Funktionsbibliotheken 2.4.1 Assemblerprogrammierung Fr die Wandlung eines 8 Bit groen Zhlwertes in einen String zur Ausgabe auf dem OLED wird die Funktion bin8tostring der Funktionsbibliothek bin8tostring.inc bereitgestellt. Diese Funktionsbibliothek bentigt zur Binr-BCD-Wandlung die Funktionsbibliothek bcd.inc. Die-se Bibliothek beinhaltet zustzliche 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 bentigten Funktionen sind den jeweiligen Doku-menten zu den Bibliotheken zu entnehmen! 2.4.2 C-Programmierung Fr die Wandlung eines 8 Bit groen Zhlwertes 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 Bettigungen fr die linke Funktionstaste (T1) per externem Interrupt bei steigender Flanke erfasst und in einer 8-Bit Zhlvariablen kumuliert. Der Inhalt der Zhlvariable (Anzahl erfolgter Tastenbet-tigungen) soll im Grafikdisplay angezeigt werden! Ergnzen Sie das Programm durch eine berwachung der Anzahl von Tastenbetti-gungen. Bei mehr als 50 Tastenbettigungen soll die rote LED blinken. Die Frequenz-generierung soll ber eine Software-Zeitverzgerung erfolgen. b) Portieren Sie die Programmlsung von a) in eine C-Programmlsung mit identischer Zielfunktionalitt! Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 9 string.h verfgbar ist. Diese Standardbibliotheken des Compilers sind in die Hauptquelldatei zu inkludieren. Zur Ausgabe des gewandelten Zhlwertes 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 Einfgen der oled.c in das Projekt ist die Ver-wendung mglich. Beschreibungen zur Anwendung der bentigten 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 (Rckkehradresse) auf dem Stack gerettet und der Befehlscode ab der Adresse, auf die eine vom Controllerhersteller spezifizierte 16-bit Adresse zeigt, ausgefhrt (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 fr 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 fr PORTC_INT0 ; Interruptbehandlung reti ; Rckkehr 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-gelst wird. Mglich 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 Verfgung gestellt, die mit der #include-Anweisung in der C-Quelldatei einzubinden ist. Als Argument fr 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 angehngt 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 Grundstzlich die Interruptserviceroutinen (ISR) wie folgt zu deklarieren: ISR(Vectorname_vect) Mit dem Makro wird eine ISR erstellt. Beispiel: Interruptserviceroutine fr den externen Interrupt PORTH_INT0: ISR(PORTH_INT0_vect) { // Nutzfunktionalitt } Grundstzlich werden durch den Compiler folgende Komponenten generiert: Einfgen des IV in die IVT (Sprung zur ISR) Retten und Wiederherstellen von R0, R1, R18 bis R31 und SREG Anfgen 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 bentigten 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-gelst wird. Mglich 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 fr die externen Inter-rupts von PortA einzutragen? c) Was versteht man unter einem Interruptrequestbit? d) Wie ist ein Interruptvektor codiert? e) Welche Spezialfunktionsregister sind fr 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 Auslsung eines externen Interrupt ber Flankentriggerung das Problem des Tastenprellens gelst werden? h) Wie kann das programmtechnische Rcksetzen eines Interruptrequestbit erfolgen? i) Erlutern 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 Prprozessoranweisung #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 Verfgung? r) Welche Mglichkeiten bietet der C-Compiler AVR-GCC, Interruptserviceroutinen zu deklarieren? s) Welche Funktionen werden in der OLED-Funktionsbibliothek fr 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 anschlieend die Quelltexte! Verwenden Sie zur Erstellung eigener Programme das bereitgestellte Frame-Projekt! Nutzen Sie die Mglichkeiten 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 ausgefhrt (obere Leiterplat-te, links vom Display, Beschriftung: TS). Dieser Sensor ist via IC mit dem ATxme-ga128A1 verbunden. Der Temperatursensor MCP9801 wandelt gemessene Umgebungstem-peraturen in binre Werte um und legt diese in Register ab, auf die mittels IC zugegriffen werden kann. Neben diesen Temperaturregistern sind zustzliche Steuerregister vorhanden, um z.B. die Messauflsung (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 fr das Blinken von LED und fr die Laut-sprecherausgabe soll ber Zeitgeberinterrupts der Timer E0 und Timer E1erfolgen. b) Ergnzen Sie die Programmlsung von a) um folgende Teilfunktionalitten: 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 Messauflsungen von 9 Bit, 10 Bit, 11 Bit und 12 Bit realisierbar. Fr die Umrechnung der Temperatur aus dem vom Sensor gelieferten Temperaturrohwert in einen realen Temperaturwert ist die folgende Berechnung zu verwenden: nRohwertSensorT2= mit n = 1, 2, 3, 4 fr 9-bit, 10-bit, 11-bit oder 12-bit Auflsung Zustzlich knnen 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. Smtliche Register knnen 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 Auflsung 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); Fr die Nutzung des MCP9801 werden Funktionsbibliotheken mit der zugehrigen Headerda-teien bereitgestellt. Es sind die Dateien MCP9801.c und TWI.c in das jeweilige Projekt ein-zufgen 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 fr das Blinken der LED und ein Timer fr 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 InterruptOverflowApplication 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 bentigt. Zustzlich sind zwei Interruptser-viceroutinen fr 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. Mgliche 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 Zhlschritte des Timers bis zum Overflowereig-nis festgelegt. Der Wert fr das Periodenregister TCEx_PER berechnet sich wie folgt: VTCPUtPERTCEx CLK=_ mit t = gewnschter Zeit, CPUClk = 16MHz, VT = Taktvorteiler Beispiel: Der Timer E0 soll nach jeweils 10 ms einen Overflowinterrupt generieren. TCE0_INTCTRLA = 0x01; // intlevel OVF = low fr TimerE0 PMIC_CTRL = 0x01; // low level interrupts enable TCE0_PER = 2500; // periode timer E1 t = 2500 * (64 / 16MHz) = 10ms TCE0_CTRLA = 0x05; // prescaler = 64 fr TimerE0 Die Interruptserviceroutinen sind im Programm wie folgt zu implementieren: ISR(TCE0_OVF_vect) fr TimerE0 und ISR(TCE1_OVF_vect) fr TimerE1. Fr 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 enthlt. Der Zugriff kann ber einen Indexzhler oder ber einen geeigneten Zeiger erfolgen. Beispiel: Initialisierung des Datenfeldes und des Indexzhlers unsigned int iTemperature[50]; // Datenfeld mit 50 Elementen unsigned char cIndexCount; // Indexzhler 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 Fr 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 Tastenbettigung 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) Erlutern 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 fr die C-Programmierung bereitgestellt? k) Wie kann die Positionierung von ASCII-Zeichen auf der Grafikanzeige erfolgen? l) Erlutern Sie das Datenformat, wie der Temperatursensor MCP9801 Temperatur-messwerte zur Verfgung stellt! m) Welche Funktionen werden in der OLED-Funktionsbibliothek fr die C-Programmierung zur Verfgung 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 anschlieend die Quelltexte! Verwenden Sie zur Erstellung eigener Programme das bereitgestellte Frame-Projekt! Nutzen Sie die Mglichkeiten 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 ausgefhrt(obere Leiterplatte, links vom Display, Beschriftung: RTC). Diese Uhr ist via IC-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-hngigen Betriebes ist die RTC DS1339 zustzlich mit einer externen 3V-Sttzbatterie verse-hen. Somit bleiben die einmal eingestellten Zeitdaten auch ohne angeschlossenes Netzteil ber einen lngeren 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 anschlieend in Zhlregistern aufsummiert. Es existieren Sekunden-, Minuten-, Stun-b) Ergnzen Sie die Programmlsung von a) um die Mglichkeit, 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. Untersttzen 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 kn-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 gezhlt 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 knnen. 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 fr Anwendungen auf der hD2-Harware nicht relevant. Mit der Funktionsbibliothek DS1339.c und der zugehrigen 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 einzufgen 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() knnen 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 mglich. 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 knnen 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 binren Zahlenformat in ein gepacktes BCD-Format bereitgestellt. Rckkehrvariablen 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 groe BCD-Zahl in einen Wert vom Typ character gewandelt werden kann. Rckkehrwert dieser Funktion ist der binre 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 ermglichen 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 binr RTCtime[1]++; // Manipulation der Minuten intbcd(RTCtime[1]); // Rckwandlung 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. Fr 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 fr RTC-Stellvorgang Die Tastenauswertung kann mithilfe des Pollingverfahrens einfach gelst werden. Die Tas-tenerkennung ist mit einer switch-Kontrollstruktur mglich. 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 Verfgung? b) ber welche zustzlichen Register verfgt die RTC und wozu knnen diese dienen? c) In welchem Format sind die Zeitinformationen in der RTC gespeichert? d) Welche Umformatierungen sind fr die RTC-Zeitinformationen notwendig, um eine Displayausgabe realisieren zu knnen? e) ber welche Taktquelle wird die RTC betrieben? f) Welche TWI-Adresse hat die RTC? g) Welche C-Funktionen fr die RTC stellt das ACMC ber die Funktionsbibliotheken zur Verfgung? 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) Erlutern Sie die erforderlichen Programmschritte, um RTC-Zeitinformationen auszu-lesen und auf einen bestimmte Displayposition auszugeben! i) Erlutern Sie die Funktionsparameter fr die Anzeigefunktion oled_print! j) Wie kann eine Zeitinformation in die RTC geschrieben werden? k) Erlutern 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 fr die Abfrage der Funktionstasten? n) Abbildung 6 enthlt die Grundstruktur des Programmablaufplanes fr die Programm-aufgabe 4.1 a). Detaillieren Sie diesen Programmablaufplan insbesondere um die er-forderlichen Einzelinitialisierungen und um die Einzelaktionen, die fr 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 fr Komponenten der hD2 und fr 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 Mnchen 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 fr das Debugging 45 Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 24 A1. Assembler-Funktionsbibliothek bcd.inc Einfhrung 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 binren Zahlenformat in ein gepacktes BCD-Format und zur Wandlung von gepacktem BCD in ASCII_Format bereitgestellt. Rckkehrvariablen knnen von jedem Programmteil aus wei-terverarbeitet werden. Unterprogramm-Name Beschreibung bergabe-parameter Rckgabe- parameter SIGNED16_TO_BCD Wandlung 16-Bit Bi-nrzahl (signed) in gepacktes BCD-Format val_signed16 (2 Byte) bcd2, bcd1, bcd0 (je 1 Byte) BIN8_TO_BCD Wandlung 8-Bit Binr-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 Binrzahl (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 Binr-Zahl in eine gepackte BCD-Zahl, einschlielich Vorzeichen. Die Binrzahl wird wie folgt bergeben: bergabeparameter Beschreibung Hinweis val_signed16 vorzeichenbehaftete 16-Bit Binrzahl (Zweierkomplement-darstellung) Gre: 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 zurckgegeben. Das hchste Byte (bcd2) enthlt im oberen Nibble das Vorzeichen. Rckgabeparameter Beschreibung Hinweis bcd2 gepackte BCD-Zahl (Vorzei-chen, Zehntausender) Gre: 1 Byte Format: 000V:ZZZZ (Vorzeichen: Zehntausender) Vorzeichen = 0: positiv Vorzeichen = 1: negativ bcd1 gepackte BCD-Zahl (Tausen-der, Hunderter) Gre: 1 Byte Format: TTTT:HHHH bcd0 gepackte BCD-Zahl (Zehner, Einer) Gre: 1 Byte Format: ZZZZ:EEEE Tabelle 4: Rckkehrparameter der SIGNED16_TO_BCD Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 25 BIN8_TO_BCD Dieses Unterprogramm wandelt eine 8-Bit Binrzahl in eine gepackte BCD-Zahl. bergabeparameter Beschreibung Hinweis val_bin8 8-Bit Binrzahl Gre: 1 Byte Tabelle 5: bergabeparameter der BIN8_TO_BCD Die BCD-Zahl wird in 2 Byte wie folgt zurckgegeben: Rckgabeparameter Beschreibung Hinweis bcd1 gepackte BCD-Zahl (Hunder-ter) Gre: 1 Byte Format: 0000:HHHH bcd0 gepackte BCD-Zahl (Zehner, Einer) Gre: 1 Byte Format: ZZZZ:EEEE Tabelle 6: Rckkehrparameter der BIN8_TO_BCD BCD_TO_BIN8 Dieses Unterprogramm wandelt eine gepackte BCD-Zahl in eine 8-Bit Binrzahl. bergabeparameter Beschreibung Hinweis bcd1 gepackte BCD-Zahl (Hunder-ter) Gre: 1 Byte Format: 0000:HHHH (Hunderter) bcd0 gepackte BCD-Zahl (Zehner, Einer) Gre: 1 Byte Format: ZZZZ:EEEE (Zehner: Einer) Tabelle 7: bergabeparameter der BCD_TO_BIN8 Rckgabeparameter Beschreibung Hinweis val_bin8 8-Bit Binrzahl Gre: 1 Byte Tabelle 8: Rckkehrparameter der BCD_TO_BIN8 BCD_TO_ASCII Dieses Unterprogramm wandelt eine gepackte BCD-Zahl in ASCII-Code. bergabeparameter Beschreibung Hinweis bcd gepackte BCD-Zahl Gre: 1 Byte Format: ZZZZ:EEEE (Zehner: Einer) Tabelle 9: bergabeparameter der BCD_TO_ASCII Der zurckgegebene ASCII-Code fr die beiden Ziffern ist auf 2 Byte aufgeteilt. Rckgabeparameter Beschreibung Hinweis ascii1 ASCII-Code (Zehner) Gre: 1 Byte ascii0 ASCII-Code (Einer) Gre: 1 Byte Tabelle 10: Rckkehrparameter der BCD_TO_ASCII Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 26 A2. Assembler-Funktionsbibliothek bin8tostring.inc Einfhrung Die Funktionsbibliothek zur Assemblerprogrammierung fr das OLED beinhaltet eine Funk-tion zur Ausgabe von Zeichenketten. Oft ist die Ausgabe von reinen Zahlenwerten wie z.B. Zhlwerten notwendig. Zur Wandlung solcher Werte in 8 Bit Gre 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 einzufgen. 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 zurckgegriffen wird. Folgende Funktion ist fr den Nutzer relevant: Funktionsname Beschreibung bergabeparameter Rckgabeparameter bin8tostring Wandlung eines 8 Bit groen 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 Verfgung. 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 Einfhrung Die hD2 besitzt ein 2,4-OLED-Display mit einer Auflsung von 320x240 Pixel und einer Farbqualitt 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 einzufgen und in der Assemblerquelldatei zu inkludieren. Folgende Funktionen sind fr den Nutzer relevant: Unterprogramm-Name Beschreibung bergabeparameter OLED_INIT Initialisierung OLED keine OLED_CLEAR Display lschen 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 gelscht werden. OLED_SET_PIXEL Dieses Unterprogramm dient zum Setzen eines einzelnen farbigen Pixel. Es mssen folgende Parameter bergeben werden: Parameter Beschreibung Hinweis oled_x_koord X-Koordinate des Pixels Gre: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0319 oled_y_koord Y-Koordinate des Pixels Gre: 1 Byte Wert: 0239 oled_color RGB-Farbcode fr Pixel Gre: 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 Fr den RGB-Farbcode knnen die vordefinierten Farben BLACK, WHITE, RED, GREEN, BLUE und YELLOW verwendet werden. OLED_PUTC Mit diesem Unterprogramm kann ein einzelnes ASCII-Zeichen (Gre: 8x14 Pixel) auf das OLED Display ausgegeben werden. Folgende Parameter mssen dem Unterprogramm ber-geben werden: Parameter Beschreibung Hinweis oled_char ASCII-Code Gre: 1 Byte oled_x_koord X-Koordinate obere linke Ecke des Zeichens Gre: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0311 oled_y_koord Y-Koordinate obere linke Ecke des Zeichens Gre: 1 Byte Wert: 0225 oled_color RGB-Farbcode fr Zeichen Gre: 2 Byte oled_color: Low-Byte oled_color+1: High-Byte Tabelle 14: bersicht zur OLED_PUTC Fr den RGB-Farbcode knnen die vordefinierten Farben BLACK, WHITE, RED, GREEN, BLUE und YELLOW verwendet werden. OLED_PUT_STRING_const Mit diesem Unterprogramm kann ein konstanter String (Zeichengre: 8x14 Pixel), welcher im Flash-Speicherbereich des Mikrocontrollers abgelegt ist, auf dem OLED Display ausgege-ben werden. Es mssen 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) enthlt Adresse der Flashspeicherstelle des ersten Zeichens des Strings oled_x_koord X-Koordinate obere linke Ecke des ersten Zeichens des Strings Gre: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0311 oled_y_koord Y-Koordinate obere linke Ecke des ersten Zeichens des Strings Gre: 1 Byte Wert: 0225 oled_color RGB-Farbcode fr String Gre: 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) ! Fr den RGB-Farbcode knnen 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 (Zeichengre: 8x14 Pixel), welcher im SRAM-Speicherbereich des Mikrocontrollers abgelegt ist, auf dem OLED Display ausgege-ben werden. Es mssen 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) enthlt Adresse der SRAM-Speicherstelle des ers-ten Zeichens des Strings oled_x_koord X-Koordinate obere linke Ecke des ersten Zeichens des Strings Gre: 2 Byte oled_x_koord: Low-Byte oled_x_koord+1: High-Byte Wert: 0311 oled_y_koord Y-Koordinate obere linke Ecke des ersten Zeichens des Strings Gre: 1 Byte Wert: 0225 oled_color RGB-Farbcode fr String Gre: 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) ! Fr den RGB-Farbcode knnen 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 fr den variablen String .dseg string_var: .byte 21 ;21 Byte (max. 20 Zeichen + NULL) ;---------------- .cseg ... ; Fllen 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 fr X-Koordinate sts oled_x_koord, r16 ; bergabe ldi r16, high(20) ; High-Byte fr 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 binren Zahlenformat in ein gepacktes BCD-Format bereitge-stellt. Rckkehrvariablen 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 Zustzlich ist in der Funktionsbibliothek bcd.c die Funktion bcdchar(unsigned char in) im-plementiert, mit deren Hilfe eine gepackte 8-Bit groe Zahl in einen Wert vom Typ character gewandelt werden kann. Rckkehrwert dieser Funktion ist der binre 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 Einfhrung 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 whrend der Laufzeit verndert und den tempor-ren Ressourcenanforderungen angepasst werden. Diese Eigenschaft kann z.B. zur Erstellung von Low-Power-Applikationen genutzt werden. Systemberblick Folgende Taktquellen fr den ATxmega128A1 sind mglich: 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 knnen 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 zulssige Taktfrequenz bei 32MHz liegt. berschreitun-gen dieser maximalen Frequenz knnen von undefinierten Aktionen bis zur dauerhaften Funktionsunfhigkeit des Controllers fhren! Zur Funktionsbibliothek Es sind die Dateien clock.c, clock.h sowie avr_compiler.h in das jeweilige Projekt ein-zufgen. Mit dieser Bibliothek ist es ausschlielich mglich den externen 16MHz-Quarzoszillator, welcher auf der hD2 verbaut ist als Taktquelle zu verwenden. Dies sollte in Anbetracht der zur Verfgung stehenden Vorteiler und PLL-Multiplikatoren jedoch ausreichen, um eine gro-e Menge von mglichen Systemtakten anbieten zu knnen. Da es mglich ist mit der Wahl einer entsprechenden Taktquelle und eines entsprechenden PLL-Faktors die maximal zulssige Taktfrequenz zu berschreiten, wurde die Funktionsbib-liothek zur Systemtakteinstellung so erstellt, dass solch ungnstige Einstellungen programm-technisch vermieden werden. Folgende Systemtakte sind einstellbar: Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 33 Systemtakt bergabewert fr 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 fr 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 gewnschte 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 Einfhrung 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 ausgefhrt (obere Leiterplatte, links vom Display, Beschriftung: RTC). Diese Uhr ist via IC-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-hngigen Betriebes ist die RTC DS1339 zustzlich mit einer externen 3V-Sttzbatterie verse-hen. Somit bleiben die einmal eingestellten Zeitdaten auch ohne angeschlossenes Netzteil ber einen lngeren Zeitraum erhalten. Systemberblick 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 anschlieend in Zhlregistern aufsummiert. Es existieren Sekunden-, Minuten-, Stun-den-, Tages-, Datums-, Monats-, und Jahresregister, welche von der RTC automatisch mit entsprechendem berlauf der Einheiten hoch gezhlt 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 knnen. Weiterhin ist die Einheitenzu-ordnung zu Registern sowie die Ziffernzuordnung zu bestimmten Bits erkennbar. Der Inhalt der Zeit- und Datumsregister ist bereits BCD-formatiert. Sptere Nachbearbeitungen durch Binr-zu-BCD-Umformalgorithmen entfallen dadurch. Die DS1339 besitzt noch weitere Register. Diese sind jedoch fr 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 einzufgen. Folgende Funktionen sind fr den Nutzer relevant: Funktions-name Beschreibung bergabeparameter Rckgabeparame-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/verndern. Hierzu ist das Array RTCtime [7] mit 7 Variablen angelegt worden, um smt-liche Zeit- und Datumsregister schreiben/lesen zu knnen. Fr 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 knnen. 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 Einfhrung Die hD2-Hardware ist mit einem Temperatursensor vom Typ MCP9801 der Firma Microchip ausgestattet. Er ist in Form eines separaten SMD-Bauelementes ausgefhrt(obere Leiterplatte, links vom Display, Beschriftung: TS). Dieser Sensor ist via IC mit dem ATxmega128A1 verbunden. Systemberblick Der Temperatursensor MCP9801 wandelt gemessene Umgebungstemperaturen in binre Wer-te um und legt diese in Register ab, auf welche mittels IC zugegriffen werden kann. Neben diesen Temperaturregistern sind noch Steuerregister vorhanden um z.B. die Messauflsung (9 bis 12 Bit) oder den Messmodus (kontinuierlich oder Einzelmessung) einzustellen. Die Regis-terauswahl ist ber ein Zeigerregister zu realisieren. Folgende Messauflsungen 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. Smtliche Register knnen 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 fr energiesparende Anwendungen indem man die Messung nur zu definierten Zeitpunkten durchfhrt. 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 einzufgen. Folgende Funktionen sind fr den Nutzer relevant: Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 37 Funktionsname Beschreibung bergabeparameter Rckgabeparameter 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(vorzeichenrichtig) short temp_value, char* string keine Tabelle 19: Funktionen der MCP9801.c Messmodus und Messauflsung sind mittels der Funktion temp_set einzustellen. Bei den Mo-di continuous conversion und shutdown-mode ist diese Routine nur einmal auszufhren. 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 binrer Form und somit fr eine Weiterverarbeitung noch nicht geeignet. Der Wert muss daher noch unter Bercksichtigung der Kommastellen und der Auflsung 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. Mgliche Werte fr 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 Mgliche Werte fr 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 Einfhrung Die hD2 besitzt ein 2,4-OLED-Display mit einer Auflsung von 320x240 Pixel und einer Farbqualitt 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 einzufgen. Folgende Funktionen sind fr den Nutzer relevant: Funktionsname Beschreibung bergabeparameter oled_init Initialisierung keine oled_clr Lschen 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 gefllt 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 Schriftgre(SMALL oder BIG) oled_print Schreiben einer ASCII-Zeichenkette X-Position als word Y-Position als word ASCII-Zeichenkette als char Schriftgre(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 Standardmig ist die Hintergrundfarbe als schwarz (BG_color=BLACK) und die Vorder-grundfarbe als wei (FG_color=WHITE) definiert. Sollen andere Farben benutzt werden, so mssen diese vor deren Benutzung definiert werden. Dies kann z.B. in oled.c ber Foreground colour erfolgen. Mgliche Farben sind OLED.h zu entnehmen. Application Center Microcontroller Hochschule Mittweida Versuchsprogramm zum Modul MPCT 39 A9. C-Funktionsbibliothek TWI.c Einfhrung Diese Bibliothek stellt Funktionen zur TWI-Kommunikation ber den Port C des ATxme-ga128A1 auf der hD2-Hardware zur Verfgung. Aufgrund der dort vorhandenen Bedingun-gen wird der Controller ausschlielich im TWI-Master-Modus betrieben. Es sind die Dateien TWI.c, TWI.h, sowie avr_compiler.h in das jeweilige Projekt ein-zufgen. Zur Funktionsbibliothek Folgende Funktionen sind fr den Nutzer relevant: Funktionsname Beschreibung bergabeparameter Rckgabeparameter TWI_init Initialisierung des TWI keine keine TWI_MasterState Ermittlung des TWI-Zustandes keine TWI_MASTER_BUSSTATE_t //siehe Typdef. Im Header TWI_MasterReady Ermittlung der Bereitschaft des TWI-Master keine bool TWI_MasterWriteRead 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_MasterInterruptHandler physische Abarbeitung der Sende- und Lesevorgnge ( in der ISR aufzurufen) keine keine Tabelle 21: Funktionen der TWI.c Hinweise zur Benutzung Die Syntax der Interrupserviceroutine sollte wie nachstehend angegeben gewhlt werden: ISR(TWIC_TWIM_vect) { TWI_MasterInterruptHandler(); } Mchte man globale Variablen in einer anderen Bibliothek nutzen (als in der wo sie deklariert wurde), so muss man die Variable dort erneut mit dem Prfix extern deklarieren. Der Com-piler sucht dann zur Erstellzeit nach der Variablen mit der primren 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 knnen ganz oder teilweise ent-fallen. Die Notation von [Marke:] erfolgt am linken Zeilenrand. Die weiteren Bestandteile einer As-sembler-Quelltextzeile werden zweckmig durch Tabulatoren getrennt, damit eine spalten-orientierte bersichtliche Textstruktur entsteht. Marke: Marken reprsentieren 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 bentigt. Werden zwei Operanden bentigt, so sind diese durch ein Komma zu trennen. Der Zieloperand steht bei der ATmega-Serie immer vor dem Komma, der Quelloperand immer anschlieend. ; Kommentar Nach Erkennung eines Semikolons wird der Rest der Zeile vom Assembler als Kommentar interpretiert. Anwendungsorientierte Kommentierungen sind fr die Lesbarkeit von Assembler-Quelltexten unerlsslich. Beispiel fr 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 mglich. Beispiele: .equ zahl1 = 0x23 ; hexadezimale Notation .equ wert7 = 0b00101000 ; binre 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 zugehrige Adresszhler auf Adressen im SRAM gesetzt werden. Die default-Lokalisation des Zhlers ist die SRAM-Adresse 0x60. .byte weist einer Variable Speicherplatz im Datensegment (DSEG) zu. Beispiele: .dseg var1: .byte 1 ; 1 Byte fr var1 table: .byte 16 ; 16 Byte-Tabelle .cseg definiert den Beginn eines Code-Segments. Der Adresszhler 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 ; ausfhrbarer Befehl add temp2,temp3 ; ausfhrbarer Befehl .eseg definiert den Beginn eines EEPROM-Segments. Der zugehrige Adresszhler 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 Adresszhler fr 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-Adresszhler auf 3000h ... .eseg ; Beginn des EEPROM-Segments .org 6 ; Setze EEPROM-Adresszhler auf 6 var3: .db 0x20 ; ein Byte auf EEPROM-Adresse 6 ... .cseg ; Beginn des Code-Segments .org 0x0014 ; Setze Codesegment-Adresszhler 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 whrend 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 fr das Debugging Zum Test und zur Inbetriebnahme ist der Einsatz von Debuggingfunktionen des AVR Studio 4 notwendig. Zustzlich dienen diese Mglichkeiten der Fehlersuche auch zum Kennenlernen der internen Ablufe 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 Zustnde von: Registern (Register 0-15 / Register 16-31) Processor I/O-Komponenten (IO View XMEGA128A1) Zustzlich ist die berwachung von Variablen in einem Watch-Fenster und die Inspektion von Programm- und Datenspeicher mglich. 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 durchgefhrt 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 fr eine Befehlszeile im Quell-textfenster an der aktuellen Cursorposition ber das Kommando F9 erfolgen. Mit dem Kom-mando F5 (Go) stoppt die Programmausfhrung an dieser Stelle.

Recommended

View more >