Praktikum Mikrocomputertechnik

Ähnliche Dokumente
Praktikum Mikrocomputertechnik

Praktikum Mikrocomputertechnik

Ausarbeitung eines Praktikumsversuches zum Design eines 1-Wire-Master-Controllers Falk Niederlein

USB > I2C- Bus Modul. Startet den I2C-Bus. Daten einlesen NACK senden

Arduino Kurs Das LC-Display. Stephan Laage-Witt FES Lörrach

LCD board EB

SMP Übung 8 - Lösungsvorschlag

Die Temperaturmessung mit dem Sensor LM75. Andreas Heller & Eduard Auer

Der I²C-Bus. Vorstellung des Inter-Integrated Circuit -Bus. Aufbau und Funktionsweise. Beispiel PortExpander am Arduino

Die Temperaturmessung

Mikrocomputertechnik

HD44780-LC-Display am Atmel-AVR Mikrocontroller

Der I²C-Bus. Bearbeitet von: Thomas Finke, EL5

Ansteuerung eines LCD-Screens

DMXface ACTIVE SEND mit RS232

Hardware PCI-Bus. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Hardware PCI-Bus. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Arduino Kurs Bits und Bytes. Stephan Laage-Witt FES Lörrach

Zusatzanleitung. MPR-1 I²C-Protokoll. Version 1.01

Praktikum Mikrocomputertechnik

SMP Übung 9 - Lösungsvorschlag

Serielle Kommunikation - Kodierung

Projektlabor. LCD Ansteuerung

Arduino Nano. Hello World per LED On-Board LED (Pin D13) Beispiel: Arduino IDE / Beispiele / Basics / Blink 5 / 20

10 Versuch Nr Anmerkungen zum Versuch Nr. 8

Remote-Objekt-Überwachung. von Jan Schäfer und Matthias Merk

1.9 Atmega-Programmierung in ASM/LED-Ziffernanzeige

Mikrocomputertechnik. Thema: Serielle Schnittstelle / UART

LCD-Ansteuerung mit MikroForth

Bus Manuals SPI I2C. Busse und Sensoren. Twix. Chaos Computer Club Cologne Twix

1. TÜ-Zusammenfassung zum Modul Computersysteme

Anleitung zum Einstieg in die Assemblerprogrammierung des Mikrocontroller C167

Manual RS232/485 ISO Artikelnummer: 8410.CON2

Mikroprozessortechnik Grundlagen 1

Aufgabe 1 Entwicklung einer Virtuellen Maschine

11. Die PC-Schnittstelle

Programmierübungen in Assembler

C-DIAS-Serielles-Interface CSI 021

Arbeitsblatt Nr.19: RFID Kit

Aufgabe 4, I2C Kommunikation mit Temperatursensor. Labor Mikrocontroller mit NUC130

Anwendungen der Mikrocontrollertechnik

Beschreibung RS232-Protokoll für POWER-TRAP Fotovoltaik-Wechselrichter (ab Protokollversion ENS1 = 5 und ENS2 = 6)

Microcomputertechnik

Mikrocomputertechnik. Thema: Der Aufbau des XC888-Mikrocontrollers -Teil 1 -

Übungsaufgaben. Stand

Interrupts im Handbuch des ATmega128 gründlich lesen.

Modbus TCP/IP Gateway für 1-Wire Sensoren

Applikationen zur Mikrocontroller-Familie

Mikrocomputertechnik mit Controllern der AtmelAVR-RISC-Familie

Klausur "Informatik I" vom Teil "Rechnerstrukturen"

Tag 4 7 Segment-Anzeige, File Include, LC-Display

U5-2 Register beim AVR-µC

Datentechnik. Prinzipieller Aufbau eines Schnittstellenbausteins

Adressierung von Speichern und Eingabe- Ausgabegeräten

Mini- Mikroprozessor-Experimentier-System. Version 1.0b vom :21. mit einem 8051-Mikrocontroller

Versuch D3: Busse, Speicher und Ampelsteuerung mit Speicher

D.1 Vorbereitung. Teil D Analog-Digital-Wandler 1

Selbststudium Informationssysteme - H1102 Christian Bontekoe & Felix Rohrer

qfix ASCII-Protokoll

C++ mit dem Arduino (Uno und Mega2560)

Displaysteuerung: ATmega32u4. HTL St.Pölten. EL Autor: Kuran. Displaysteuerung Fachspezifische Softwaretechnik 2

Laborübung 3. Latches, Flipflops, Counter

Technische Informatik I - HS 18

FAKULTÄT FÜR INFORMATIK

Microcontroller Kurs Microcontroller Kurs/Johannes Fuchs 1

RGB-Sequenzer RS232 RS485 MDX512 AD / IO Platine

SPI-Bus. 282 Ergänzung zu Kapitel 10

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Zähler- und Zeitgeber-Baugruppen

Projektdokumentation: DCF 77 Funkuhr

Speichern von Zuständen

Praktikum Grundlagen von Hardwaresystemen Sommersemester Versuch 6: Computergrafik und Sprites

Parallele Datenübertragung mit Hilfe von WinSim85. über einen reellen PC Port

Die Robo-TX RS-485 Schnittstelle

Protokoll TID v0.1 ( )

1. Allgemein Technische Daten... 2

Der Magnetfeldsensor HMC5883L

Speicheraufbau des AT89C5131

Manual SPI Module zum CARME-Kit

Carry Lookahead Adder

ArduBlock Station 4 - Farbthermometer

Arduino Kurs Timer und Interrupts. Stephan Laage-Witt FES Lörrach

JX6-INT1 Versions Update von V1.00 auf V1.24

Arduino für FunkAmateure

ARM-Cortex-M4 / Thumb-2-Befehlssatz Adressierungsarten und arithmetische Operationen

2017/01/23 15:50 1/5 Bedienung

TCP/IP ASCII Schnittstelle Programmierhandbuch

Temperaturmodul. Software. Bedeutung der Leuchtdioden. Kanal-LEDs. System-LEDs. Start nach Reset

Handbuch Digi-Prog. Revision 1.0. Copyright c Welzel GbR Steinstrasse Giessen

Beschreibung Modell Motorspindel

MSP 430. Einführung. Was kann er? Hauptthemen. Wie sieht er aus? 64 / 100 polig. Was kann er? MSP 430 1

Type ME23 ProfiNet Ethernet IP Modbus TCP

Vorbereitung. Teil D Analog-Digital-Wandler 1

Einleitung Die Pins alphabetisch Kapitel 1 Programmierung des ATmega8 und des ATmega

Transkript:

Praktikum Mikrocomputertechnik Versuch 5M: Labor: Termin der Durchführung: IE-Labor oder DT-Labor 1-Wire Thermometer Teilnehmer: Gruppe: Semester: Student 1: Student 2: Testat: Datum: Bemerkungen: Unterschrift: Praktikum Mikrocomputertechnik - 1 - V5M 1-Wire Thermometer

Praktikum Mikrocomputertechnik Versuch 5M: 1-Wire Thermometer 1) Allgemeine Beschreibung Auf dem Rapid-IO Board befindet sich ein digitaler Temperatursensor DS18S20 von Maxim. Der Baustein wird über einen Eindraht-Bus (1-Wire) an den XC164 angebunden. Der Sensor beinhaltet einen 9-Bit AD-Wandler, mit dem ein Temperaturbereich von -10 C bis +55 C abgedeckt werden kann. Die Standard-Auflösung beträgt hierbei 0,5 C. Des weiteren hat jeder Baustein eine eindeutige Seriennummer, die ebenfalls über den Eindraht-Bus ausgelesen werden kann. Aufgrund der Komplexität des Protokolls sind schon einige Unterprogramme vorgegeben. Diese sind in Keil (V3) Projekt PMC_V5M.zip auf der Labor-Homepage abgelegt. Folgende Funktionen sollen realisiert werden: Auf dem LC-Display soll in der ersten Zeile die ID des Bausteins und in der zweiten Zeile die aktuelle Temperatur angezeigt werden. Binden Sie Ihre Software aus V2 in das Projekt mit ein. Dies können Sie entweder über ein include machen oder die benötigten Unterprogramme einfach an das Ende der MAIN-Sektion kopieren. Sollten Sie im LCD-Versuch Timer T3 für das Timing verwendet haben, müssen Sie dies ändern oder die gegebenen Unterprogramme anpassen, da hier dieser Timer für den 1µs Takt verwendet wird. Für die Ansteuerung des 1-Wire Bausteins sind die folgenden Unterprogramme vorgesehen: ow_init_t3 Initialisiert Timer T3 um einen 1µs Takt zu generieren. Der Timer wird manuell bedient, da ein 1µs Takt mit Interrupt zu viel Overhead erzeugt. ow_wait Warteprogramm auf µs-basis... die Anzahl der µs wird in R15 übergeben. ACHTUNG: Programm macht einen Fehler von ca. +2,5 µs (Overhead). Dieser rührt aus dem Unterprogramm-Aufruf und der Initialisierung der Register etc. ow_init Initialisiert die Ports für die One-Wire Schnittstelle Praktikum Mikrocomputertechnik - 2 - V5M 1-Wire Thermometer

ow_reset Liefert die Reset-Bedingung für den One-Wire Baustein. Dieser Reset muss vor jeder Kommunikation auf dem Bus ausgeführt werden. ow_read_byte Liest ein Byte vom One-Wire-Bus ow_write_byte Schreibt ein Byte an den One-Wire-Bus ow_convert Startet die Konvertierung der Temperatur und wartet bis der Baustein fertig ist und das Datenpaket zur Abholung bereit ist. ow_read_temp Startet die Konvertierung (durch Aufruf des Unterprogramms ow_convert und liest das unbearbeitete Datenpaket aus und legt es im Speicher (RAM: OW_Temp) ab. ow_read_rom Liest die Familiy ID, Seriennummer und CRC-Byte aus dem DS18S20 aus und legt diese im Speicher (RAM: OW_ROM) ab. create_ascii_id Konvertiert die im µc Speicher befindliche Hex-Zahl der Device ID in AS- CII Zeichen und legt diese ebenfalls im RAM (OW_ID) ab. create_ascii_temp Konvertiert die beiden gelesenen Temperatur-bytes in ASCII-Zeichen um und legt diese als Text-String ebenfalls im Speicher ab (OW_ASCII_Temp) Folgende Aufgaben sind von Ihnen durchzuführen: Unterprogramm: Assemblerprogramm Flußdiagramm ow_init_t3 Gegeben - ow_wait Gegeben Gegeben ow_init Gegeben - ow_read_byte Gegeben Gegeben ow_write_byte Gegeben Ihre Aufgabe ow_convert Gegeben Ihre Aufgabe ow_read_temp Gegeben Ihre Aufgabe ow_read_rom Ihre Aufgabe Ihre Aufgabe create_ascii_id Ihre Aufgabe Ihre Aufgabe create_ascii_temp Ihre Aufgabe Ihre Aufgabe ow_reset Gegeben Gegeben Praktikum Mikrocomputertechnik - 3 - V5M 1-Wire Thermometer

2) Versuchsvorbereitung Dieser Versuch baut sehr stark auf Kenntnisse über die Schnittstelle zum Temperatursensor als auch auf das Verständnis der vorhandenen Programmstrukturen. Daher ist es unerlässlich sich in das Thema einzulesen und die Flußdiagramme vor Beginn der Programmierarbeit zu erarbeiten. Lesen Sie sich in das Datenblatt des DS18S20 (finden Sie auf der Internetseite des Labores wo sich auch die Versuchsbeschreibungen befinden) ein. Besonders wichtig ist das Protokoll, wie Daten übertragen werden, als auch der Inhalt und der Aufbau der Datenpakete. Leider werden Device ID und Temperatur nicht als ASCII Werte übertragen, sondern hexadezimal. Die Daten müssen also zunächst in auf dem Display darstellbare Zeichen umgewandelt werden. Im Anhang dieser Versuchsbeschreibung finden Sie die bereitgestellten Unterprogramme (wie sie auch im Projektfile auf der Homepage enthalten sind). Lesen Sie sich in die Funktionen ein und beachten Sie die notwendigen Übergabeparameter für die unterschiedlichen Funktionen. Zeichnen Sie die funktionalen Flussdiagramme der gegebenen Programme sowie die Flußdiagramme, für Unterprogramme, die sie noch selbst erstellen müssen mit Hilfe einer PC-Software. Die Ablaufpläne sollen keine graphische Repräsentation des Assembler Programms sein. Verwenden Sie allgemeinverständliche Ausdrücke, um den Ablauf abstrakt zu beschreiben. In den Flussdiagrammen sind die korrekten Symbole zu verwenden. Im Anhang finden Sie des weiteren extrahierte Informationen zum One-Wire Interface. Schlüsselinformationen wurden dort aus dem Datenblatt extrahiert. Es sind allerdings nicht alle für den Versuch notwendigen Informationen dort enthalten. Ein Studium des Datenblattes ist daher zwingend notwendig. 3) Versuchsdurchführung Die technische Umsetzung der Aufgabe wird weitestgehend Ihnen überlassen. Es gelten aber folgende Rahmenbedingungen: Erstellen Sie die geforderten Unterprogramme. Sie müssen auch ein Hauptprogramm erstellen, das die notwendige Ausgabe zyklisch auf das Display schreibt. Die ID muss nur 1x ausgegeben werden. Die AD-Wandlung der Temperatur benötigt ca. 700ms und kann so kontinuierlich konvertiert, verarbeitet und ausgegeben werden. Die gegebenen Unterprogramme sind mit entsprechenden Köpfen ausgestattet. Einen Rumpf des Kopfes sowie den Unterprogrammrahmen für die durch Sie zu erstellenden Softwarekomponenten finden Sie ebenfalls in der zur Verfügung gestellten Projektdatei. Codieren Sie Ihre Überlegungen und Flussdiagramme in Assembler und testen Sie die Software. Gehen Sie beim Testen schrittweise vor und probieren Sie auch Teillösungen aus. Das Suchen von Fehlern an der Gesamtlösung kann oft aufwendig sein. Erst wenn ein Teilprogramm zuverlässig funktioniert, widmen Sie sich dem folgenden Schritt. Praktikum Mikrocomputertechnik - 4 - V5M 1-Wire Thermometer

Die Programme sind so zu schreiben, dass leicht Anpassungen durchgeführt werden können. Es sollen z.b. Equate-Anweisungen verwendet werden und deren Bedeutung/Funktion auch eindeutig kommentiert sein. Im RAM sind bereits die notwendigen Speicherbereiche für das Ablegen der Sensordaten sowie deren Umrechnung in ASCII vorhanden. Sollte der bereitgestellte Rahmen Ihnen nicht in das Konzept passen, dann können Sie existierende Unterprogramme sowie Speicherbereiche gerne für sich anpassen. Bitte markieren Sie aber solche Änderungen in den Ausdrucken. Die Software ist in den einzelnen Funktionsschritten zu dokumentieren, so dass auch Nicht-Assembler-Kenner den Funktionsablauf nachvollziehen können. Auf gute Lesbarkeit und Dokumentation der Software achten. Mit dem Logikport ist das Einlesen der Device-ID zu protokollieren. Fertigen Sie hierzu bitte zwei Screen-Shots an (Gesamtpaket ist zu lange, um leserlich dargestellt werden zu können; verwenden Sie die verfügbare Auflösung der Darstellung der Signale auf dem Bildschirm so gut wie möglich): Reset des 1-Wire Bus mit Senden des Kommandos. Markieren Sie den Reset-Vorgang und das Kommando-Byte, das an den Baustein geschickt wird. Senden der kompletten Device ID (incl. CRC und Family Code). Markieren Sie im Screenshot die zusammengehörigen Bytes sowie deren Werte. LSB, MSB und Leserichtung sind mit anzugeben. 4) Ausarbeitung Nach Beendigung des Versuches haben Sie alle Arbeiten erledigt. Sie können die Ausarbeitung direkt nach dem Praktikumstermin abgeben. Die Ausarbeitung besteht aus folgenden Komponenten: Ausgefülltes Deckblatt Ausdruck der am PC erstellten Flussdiagramme Ausdruck der Assemblerdateien zur Durchsicht. Nicht verwendete Unterprogramme bitte vor dem Ausdruck entfernen! Gegebene Unterprogramme bitte mit ausdrucken Ausdruck der Logikport Diagramme für die geforderte Übertragung incl. Ihrer Anmerkungen Praktikum Mikrocomputertechnik - 5 - V5M 1-Wire Thermometer

5) Anhang: 5.1) Vorgefertigte Unterprogramme Auf den folgenden Seiten finden Sie die gegebenen Unterprogramme. Alle diese Unterprogramme finden Sie in digitaler Form im vorbereiteten Projekt für diesen Versuch auf der Labor Homepage. Sollten für Ihr Konzept Anpassungen erforderlich sein, markieren Sie diese bitte in Ihrem Ausdruck für die Abgabe. ;################################################################################## ;# Unterprogramm: ow_init_t3 # ;# # ;# Initialisiert Timer T3 im einen 1µs Takt zu generieren # ;# Der Timer wird manuell bedient, da ein 1µs Takt mit Interrupt zu viel Overhead # ;# erzeugt # ;# Übergabewerte: - keiner - # ;# Rückgabewerte: - keiner - # ;# Zerstörte Register: - keine - # ;# Erstellt: 02. April 2015, Armin Schön # ;################################################################################## ow_init_t3 PROC NEAR mov RET GPT12E_T3CON, #0000$1000$1000$0000b ; Timer T3: Timer, PS:4, zählt runter, gestoppt ow_init_t3 ENDP ;################################################################################## ;# Unterprogramm: ow_wait # ;# # ;# Warteprogramm auf µs-basis... die Anzahl der µs wird in R15 übergeben. # ;# ACHTUNG: Programm macht einen Fehler von ca. +2,5 µs (Overhead) # ;# Basis ist eine normale Warteschleife ohne IRQ # ;# Übergabewerte: R15: Anzahl der µs, die gewartet werden soll # ;# Rückgabewerte: - keiner - # ;# Zerstörte Register: - keine - # ;# Erstellt: 26. März 2015, Armin Schön # ;################################################################################## ow_wait PROC NEAR PUSH R15 PUSH R14 ; Rette benötigte Register mov R14, #5 ; Multipliziere R15 mit 5 (5 Timer Steps = 1us) mulu R14, R15 mov GPT12E_T3, MDL ; Multiplikationsergebnis als Timer-Wert laden ; High-Word der Multiplikation wird ignoriert, da eine ; größere Zeit im aktuellen Kontext nicht notwendig ist. bclr GPT12E_T3CON_T3OTL bset GPT12E_T3CON_T3R ; Lösche Timer T3 OTL für aktuellen Durchgang ; Starte Timer ow_wait_on_t3: jnb GPT12E_T3CON_T3OTL, ow_wait_on_t3 ; Warte bis Output-Toggle-Latch gesetzt bclr GPT12E_T3CON_T3R ; T3 bis zum nächsten Aufruf anhalten POP R14 POP R15 ; Gesicherte Register zurück holen RET ; Rücksprung zum aufrufenden Programm ow_wait ENDP Praktikum Mikrocomputertechnik - 6 - V5M 1-Wire Thermometer

ow_wait Timer vorab initialisieren, prescaler = 4 aber auf STOP Register R15, R14 sichern Timerwert * 5 1 µs (prescaler = 4 d.h. 200 ns) * 5 = 1µs Anfangszustand OTL = 0 starte Timer OTL = 0 = 0 = 1 Timer anhalten Register R1, R15 zurückspeichern ret Praktikum Mikrocomputertechnik - 7 - V5M 1-Wire Thermometer

;################################################################################## ;# Unterprogramm: ow_init # ;# # ;# Initialisiert die Ports notwendig für die One-Wire Schnittstelle # ;# Übergabewerte: - keiner - # ;# Rückgabewerte: - keiner - # ;# Zerstörte Register: - keine - # ;# Erstellt: 26. März 2015, Armin Schön # ;################################################################################## ow_init PROC NEAR extr #1 bset ODP4.1 ; Onw-Wire Pin auf Open-Drain bclr ow_pin ; Pin auf logisch "0" RET ow_init ENDP ;################################################################################## ;# Unterprogramm: ow_reset # ;# # ;# Liefert die Reset-Bedingung für den One-Wire Baustein # ;# Übergabewerte: - keiner - # ;# Rückgabewerte: - keiner - # ;# Zerstörte Register: Port 1, High Byte, Bit 7 # ;# Ausgabe: Auf LED 15 wird gelesener Rückgabewert ausgegeben # ;# Erstellt: 26. März 2015, Armin Schön # ;################################################################################## ow_reset PROC NEAR push R15 ; Rette benötigte Register push R0 bset ow_dir ; One-Wire auf Ausgang (und 0) mov R15, #500 ; warte 500µs bclr ow_dir ; One-Wire auf Eingang (und 1) mov R15, #65 ; warte 65µs bmov R0.0, ow_pin mov R15, #435 ; warte 435µs bmov P1H.7, R0.0 ; Gib Erfolg auf LED 15 aus pop R0 pop R15 ; Hole gerettete Register zurück RET ow_reset ENDP Praktikum Mikrocomputertechnik - 8 - V5M 1-Wire Thermometer

ow_reset Register sichern log. 0 ausgeben 500 µs warten log. 1 ausgeben 65 µs warten 1-wire einlesen (R0.0) 435 µs warten LED on / off LED = 0 Reset OK LED = 1 Reset nicht OK Register rückspeichern ret nach erfolgreichem Reset ist der DS1820-Baustein bereit für weitere Kommunikation Praktikum Mikrocomputertechnik - 9 - V5M 1-Wire Thermometer

;################################################################################## ;# Unterprogramm: ow_read_byte # ;# # ;# Liest ein Byte vom One-Wire-Bus # ;# Übergabewerte: - keiner - # ;# Rückgabewerte: - RL0: Gelesenes byte # ;# Zerstörte Register: - R0 # ;# Erstellt: 02.04.2015, Armin Schön # ;################################################################################## ow_read_byte PROC NEAR push R15 ; Rette benötigte Register push R1 mov R0, #0 ; Initialisiere Werteregister mov R1, #8 ; Initialisiere Bit-Zähler ow_rd_next_bit: bset ow_dir ; One-Wire auf Ausgang (und 0) mov R15, #1 ; warte 1µs bclr ow_dir ; One-Wire auf Eingang (und 1) mov R15, #8 ; warte 8µs bmov R0.8, ow_pin ; Bit vom Bus einlesen mov R15, #50 ; warte 50µs shr R0, #1 ; R0 Eingangsregister um 1 rechts sub R1, #1 ; Bitzähler dekrementieren jmp cc_nz, ow_rd_next_bit ; Nächstes Bit bis ein Byte komplett pop R1 pop R15 ; Hole gerettete Register zurück RET ow_read_byte ENDP Praktikum Mikrocomputertechnik - 10 - V5M 1-Wire Thermometer

Lesevorgang für ein einziges Bit read_byte Register R15, R1 sichern Bit-Zähler (= 8) vorbesetzen Bit-Lesezyklus starten 1 µs warten Portrichtung auf Einlesen 8 µs warten Bit einlesen 50 µs warten eingelesenes Bit shiften Bit-Zähler - 1 Schleife 8 x nein Byte eingelesen Register R1, R15 zurückspeichern ret Praktikum Mikrocomputertechnik - 11 - V5M 1-Wire Thermometer

;################################################################################## ;# Unterprogramm: ow_write_byte # ;# # ;# Schreibt ein Byte an den One-Wire-Bus # ;# Übergabewerte: - RL0: zu schreibendes Byte # ;# Rückgabewerte: - keiner - # ;# Zerstörte Register: - keines - # ;# Erstellt: 02.04.2015, Armin Schön # ;################################################################################## ow_write_byte PROC NEAR push R15 ; Rette benötigte Register push R0 push R1 mov R1, #8 ; Initialisiere Bit-Zähler ow_wr_next_bit: jb R0.0, ow_wr_1 ow_wr_0: bset ow_dir ; One-Wire auf Ausgang (und 0) mov R15, #65 ; warte 65µs bclr ow_dir ; One-Wire auf Eingang (und 1) mov R15, #1 ; warte 65µs jmp cc_uc, ow_er_b_done ow_wr_1: bset ow_dir ; One-Wire auf Ausgang (und 0) mov R15, #2 ; warte 65µs bclr ow_dir ; One-Wire auf Eingang (und 1) mov R15, #60 ; warte 65µs jmp cc_uc, ow_er_b_done ow_er_b_done: shr R0, #1 ; R0 Eingangsregister um 1 rechts sub R1, #1 ; Bitzähler dekrementieren jmp cc_nz, ow_wr_next_bit ; Nächstes Bit bis ein Byte komplett pop R1 pop R0 pop R15 ; Hole gerettete Register zurück RET ow_write_byte ENDP Praktikum Mikrocomputertechnik - 12 - V5M 1-Wire Thermometer

;################################################################################## ;# Unterprogramm: ow_convert # ;# # ;# Startet die Konvertierung und wartet bis fertig # ;# Übergabewerte: - keiner - # ;# Rückgabewerte: - keiner - # ;# Zerstörte Register: - keines - # ;# Erstellt: 02.04.2015, Armin Schön # ;################################################################################## ow_convert PROC NEAR push R15 ; Rette benötigte Register push R0 call ow_reset movb RL0, #0xCC ; Schreibt Kommando, um Adressierung zu überspringen call ow_write_byte ; Schreibt Kommando auf OW-Bus movb RL0, #0x44 ; Schreibt Kommando, um Konvertierung zu starten call ow_write_byte ; Schreibt Kommando auf OW-Bus ow_rd_until_done: bset ow_dir ; One-Wire auf Ausgang (und 0) mov R15, #1 ; warte 1µs bclr ow_dir ; One-Wire auf Eingang (und 1) mov R15, #8 ; warte 8µs jb ow_pin, ow_conv_done ; In der Schleife bleiben bis eine 1 gelesen wird mov R15, #5000 ; 5ms Zeit geben jmp ow_conv_done: cc_uc, ow_rd_until_done ; Erneut lesen, bis '1' pop R0 pop R15 ; Hole gerettete Register zurück RET ow_convert ENDP Praktikum Mikrocomputertechnik - 13 - V5M 1-Wire Thermometer

;################################################################################## ;# Unterprogramm: ow_read_temp # ;# # ;# Startet Konvertierung, wartet bis fertig und legt Ergebnis im Speicher ab # ;# Übergabewerte: - keiner - # ;# Rückgabewerte: - 8-Byte-Ergebnis im RAM (OW_ROM) # ;# Zerstörte Register: - keines - # ;# Erstellt: 02.04.2015, Armin Schön # ;################################################################################## ow_read_temp PROC NEAR push R15 ; Rette benötigte Register push R0 push R1 mov R15, #OW_Temp ; Lade Startwert für zu schreibenden Speicherbereich mov R1, #9 ; Zähler für zu lesende Bytes call call ow_convert ow_reset movb RL0, #0xCC ; Schreibt Commando, um Addressierung zu überspringen call ow_write_byte ; Schreibt Kommando auf OW-Bus movb RL0, #0xBE ; Schreibt Kommando, um das Scratchpad zu lesen call ow_write_byte ; Schreibt Kommando auf OW-Bus ow_read_sp_next_byte: call ow_read_byte movb [R15], RL0 ; Schreibe Byte in RAM-Bereich add R15, #1 ; Pointer auf nächste Speicherstelle sub R1, #1 ; Alle Bytes eingelesen? jmp cc_nz, ow_read_sp_next_byte pop R1 pop R0 pop R15 ; Hole gerettete Register zurück RET ow_read_temp ENDP Praktikum Mikrocomputertechnik - 14 - V5M 1-Wire Thermometer

5.2) Elektrische Informationen zum 1-Wire Bus Der 1-Wire Bus besteht, wie der Name schon sagt, nur aus einer einzigen Datenleitung. An dieser einen Leitung können 1-100 Teilnehmer angeschlossen sein. Diese Topologie ist eine strikte Master/Slave Organisation. Vom Master werden alle Kommunikationen, egal ob senden oder empfangen, initiiert und auch zeitlich getriggert. Über die individuelle Device ID (Seriennummer) kann der Master alle Busteilnehmer gezielt ansprechen. Über ein bestimmtes Protokoll kann der Master auch herausfinden, wie viele Bausteine und mit welcher individuellen Adresse am Bus angeschlossen sind. Neben der Device-ID gibt es auch noch eine Familiy-ID über die der Master erfährt, um welchen Sensor-Typ es sich handelt. In unserem Versuch ist nur ein einzelner Maxim DS18S20 angeschlossen. Das relativ aufwendige Suchen nach Busteilnehmern kann also entfallen. Der Master in unserem System ist der XC164. Er ist also verantwortlich für die gesamte Kommunikation, die auf dem Bus stattfindet. Da es sich um einen Eindraht-Bus handelt, müssen sowohl Master als auch Slave diesen Bus treiben können. Hierzu wird ein einfaches Verfahren angewendet. Alle Busteilnehmer haben einen Open-Kollektor- bzw. Open-Drain-Ausgang. Sie können das Signal also nur auf GND ziehen. Den Pegel für den elektrischen High-Pegel übernimmt ein Pull-Up Widerstand von typisch 4,7kW. Dieser ist selbstverständlich auf dem Board vorhanden. Funktionsweise beim Schreiben auf 1-wire-Bus Mit dem Öffnen / Schließen des Bustreibers (im Portpin) durch den direction port DP wird das Potential am 1-wire-Bus gesteuert: DP = 0 Treiberausgang floatet, d.h. pull-up-widerstand zieht nach log. 1 DP = 1 Treiber durchgeschalten, d.h. 1-wire-Bus wird nach log. 0 gezogen GND DP pull up Vcc 1-wire-Bus Temperatursensor DS1820 Abbildung: Treiber des µc mit one-wire incl. Pull-Up und Sensor Der Pin am µc, der für die Kommunikation mit dem 1-Wire Bus zuständig ist, ist der Port 4.1. Dieser Port muss im Register ODP4 (Extended Special Function Register!) auf '1' gesetzt werden, um den Treiber als Open-Drain auszuführen. Der Einfachheit halber wird der Output P4.1 auf logisch '0' gesetzt und bleibt im weiteren Verlauf unverändert. Praktikum Mikrocomputertechnik - 15 - V5M 1-Wire Thermometer

Nun kann mit dem Direction-Port der Port 4.1 auf Ausgang geschaltet werden und dieser treibt eine logische '0' auf dem Bus. Wenn der DP4.1 nun auf Eingang geschaltet wird, übernimmt der externe Pull-Up die Aufgabe, die logische '1' zu treiben. Der Pin am µc kann nun direkt verwendet werden, um im Lesemodus die Antwort des 1-Wire Teilnehmers zu lesen. 5.3) Timing Informationen des 1-Wire Buses Im folgenden sehen Sie das Timing und die verschiedenen Buszugriffsarten, die sie im Versuch für die Kommunikation mit dem Temperatursensor benötigen. Die vollständigen Details können aus dem Datenblatt für den DS18S20 entnommen werden, das Sie auf der Homepage des Labors ebenfalls finden können. Vor jeder Kommunikation mit dem Baustein muss ein Reset-Puls initiiert werden. Dieser versetzt den 1-wire Bus und dessen Teilnehmer in einen definierten Zustand. Der Master (µc) zieht den Bus auf '0' und geht nach mindestens 480µs in den Lesemodus und der Pull-Up zieht den Bus nach logisch '1'. Nach spätestens 60µs antworten angeschlossene Busteilnehmer ihrerseits mit einem LOW auf dem Bus. Danach kann mit einem entsprechenden Kommando die gewünschte Kommunikation gestartet werden. Abbildung: Timing für Bus-Reset Nun kann die Kommunikation mit dem Baustein erfolgen. Zunächst muss der Master ein Kommando auf den Bus absetzen. Danach antwortet entweder der Busteilnehmer oder der Master sendet die entsprechenden Daten. In unserem Fall befindet sich nur ein Teilnehmer am Bus, so dass die gezielte Adressierung entfallen kann. Hierzu gibt es ein eigenes Bypass-Kommando ( Skip ROM ). Praktikum Mikrocomputertechnik - 16 - V5M 1-Wire Thermometer

Soll ein Bit auf den Bus geschrieben werden (Kommando oder Daten), dann verhält sich der Busteilnehmer (Slave) passiv, und das korrekte Timing ist vom Master zu liefern. Es gibt während der Übertragung kein Feedback von dem Busteilnehmer(n). Abbildung: Timing das Schreiben eines Bits (Master auf Bus) Muss der Master vom Bus Daten lesen, die der Temperatursensor bereitstellt, dann wird ebenfalls das Timing durch den Master bestimmt. Der Master muss jedes Bit auf dem Bus initiieren. In einem definierten Zeitrahmen antwortet der 1-Wire Baustein auf dem Bus. In dieser Zeit muss der µc den Wert einlesen. Das Zeitfenster beträgt hier nur wenige µs und muss daher ziemlich genau erfolgen. Abbildung: Timing das Lesens eines Bits (Master vom Bus) Praktikum Mikrocomputertechnik - 17 - V5M 1-Wire Thermometer

5.4) Kommunikation mit dem DS18S20 Für das Auslesen der ID und das Auslesen der Temperatur sind für unseren Versuch nur drei Kommunikations-Modi relevant. Diese sind das Auslesen der ID, das Starten einer A/D-Wandlung der aktuellen Temperatur und das Auslesen des sogenannten Scratchpads, das auch die beiden Bytes für die Temperatur enthält. Diese Abläufe sollen die folgenden drei Flussdiagramme auf Protokoll-Ebene erläutern. Für die ID und das Scratch Pad sind reine Lesevorgänge notwendig. Der Ablauf ist also sehr ähnlich: Read ID Read Scratchpad 1-Wire Reset 1-Wire Reset Command: Read ROM 33h Read from DS18S20: Family Code 1 Byte Read from DS18S20: Serial Number 6 Byte Read from DS18S20: CRC 1 Byte Bus Idle Abbildung: Lesen der Baustein Seriennummer Command: Skip ROM 0xCC Command: Read Scratch Pad 0xBE Read from DS18S20: Scratch Pad 8 Byte Read from DS18S20: CRC 1 Byte Bus Idle Abbildung: Lesen des Scratch Pads Praktikum Mikrocomputertechnik - 18 - V5M 1-Wire Thermometer

Beim Auslesen der Temperatur muss die Wandlung der Daten abgewartet werden. Dies kann beim verwendeten Baustein bis zu 780ms dauern. Daher kann die Temperatur durchaus kontinuierlich ausgelesen werden. Die Konvertierungszeit von knapp einer Sekunde ist gleichzeitig eine akzeptable Aktualisierungszeit für die Temperaturausgabe auf dem Display. Convert Temp. 1-Wire Reset Command: Skip ROM 0xCC Command: Convert Temperature 0x44 Einzelnes Bit vom 1-Wire Bus lesen Nein Gelesenes Bit = '1' Ja Bus Idle Abbildung: Start der Temperaturkonvertierung 5.5) Interpretation der Datenpakete Wenn die Datenpakete vom DS18S20 eingelesen wurden und durch die entsprechenden Unterprogramme im RAM des µc abgelegt sind, können diese Daten nun interpretiert werden und als ASCII-Zeichen auf dem LCD ausgegeben werden. Wichtig bei der gesamten Kommunikation ist, dass das LSB zuerst gesendet wird. Dies bezieht sich auf das gesamte Datenpaket und nicht nur auf die einzelnen Bytes. Praktikum Mikrocomputertechnik - 19 - V5M 1-Wire Thermometer

Sehen wir uns zunächst die Device ID an. Diese besteht aus insgesamt 8 Bytes: CRC ID, Byte 5 ID, Byte 4 ID, Byte 3 ID, Byte 2 ID, Byte 1 ID, Byte 0 Family ID MSB LSB Die Family ID ist beim DS18S20 grundsätzlich 0x10. Daran kann der µc erkennen, welche Art von Bausteinen am Bus hängen, um sie korrekt anzusprechen. Die mittleren sechs Byte liefern die individuelle Seriennummer (wird bei mehreren Bausteinen am Bus auch als Adresse verwendet). Das letzte gesendete Byte (aber erstes in der Darstellung) beinhaltet einen CRC Wert, mit dessen Hilfe die Richtigkeit der gesendeten Daten überprüft werden kann. Dieses Byte kann aber im Rahmen des Versuches ignoriert werden. Für Sie relevant sind eigentlich nur die mittleren sechs Bytes. Diese beinhalten die ID als HEX-Zahl. In dieser Form eignet sie sich nicht zur Darstellung auf dem LCD. Die Sechs Bytes müssen also zunächst in 12 ASCII-Zeichen umgewandelt werden. Wegen der Lesbarkeit wäre es vorteilhaft, wenn die Bytes durch Bindestriche getrennt auf dem Display dargestellt würden. z.b.: 00-E4-8C-DD-32-0F Hierzu teilen Sie die einzelnen Bytes in die oberen und unteren 4 Bit (verschieben und ausmaskieren). Für die Ziffern (0-9) addieren Sie nun einfach 0x30, und sie haben die jeweilige ASCII-Darstellung und für Buchstaben entsprechend 0x37 (A-F). Diese legen Sie am besten als Block im RAM ab. Sie können Ihre Textausgabe aus Versuch 2 verwenden, um den String komplett auf dem LCD darzustellen. Bei dem Inhalt des Scratch Pad wird die Temperatur ebenfalls als Hex-Wert geliefert. Da diese allerdings vorzeichenbehaftet ist, ist die Umwandlung in ASCII etwas komplexer. Sie erhalten hier 9 Bytes (incl. CRC): Byte 0 Temperature Low Byte Temperaturinformation Byte 1 Temperature High Byte Temperatur Vorzeichen Byte 2 Th Register or User byte 1 Byte 3 Tl Register or User byte 2 Byte 4 Byte 5 Byte 6 Reserved (0xFF) Reserved (0xFF) Count Remain Byte 7 Count per C Byte 8 CRC Praktikum Mikrocomputertechnik - 20 - V5M 1-Wire Thermometer

Für uns relevant sind nur die beiden Temperatur-Bytes. (Byte 0 und Byte 1) LS Byte 2 6 2 5 2 4 2 3 2 2 2 1 2 0 2-1 Temp. Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 HS Byte S S S S S S S S Sign Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Das High-Byte wird vollständig zur Darstellung des Vorzeichens verwendet. Die Bits 7..1 stellen die Temperatur in vollen C dar. Achtung, diese Zahl ist vorzeichenbehaftet und muss entsprechend behandelt werden. Die Temperatur kann auch negativ sein! Das Bit 0 gibt noch an, ob die Nachkommastelle ',0' oder ',5' ist. Sie hat also die Wertigkeit 2-1, was aber leider nicht direkt durch eine Division umgerechnet werden kann. Wenn alles richtig umsetzt wird, dann könnte es in etwa so aussehen: Um zur ASCII-Darstellung zu kommen, könnte man sich die Vorgehensweise auf der folgenden Seite vorstellen. Praktikum Mikrocomputertechnik - 21 - V5M 1-Wire Thermometer

Temp. To ASCII 1 LS-Byte [Bit 0] 0 Nachkommastelle: ',5' Nachkommastelle: ',0' LS-Byte um eine Stelle nach rechts shiften und die Bits 6..0 ausmaskieren => Temperatur-Byte 11111111 MS-Byte [Bit 8..15] 00000000 Vorzeichen = '-' Vorzeichen = '+' Zweierkomplement des Temperatur-Bytes berechnen Temperatur-Byte durch 10 dividieren Teilerergebnis + 0x30 => 10er Stelle in ASCII Teilerrest + 0x30 => 1er Stelle in ASCII Temperatur-Byte durch 10 dividieren Teilerergebnis + 0x30 => 10er Stelle in ASCII Teilerrest + 0x30 => 1er Stelle in ASCII ASCII-String im Speicher Ablegen DONE Praktikum Mikrocomputertechnik - 22 - V5M 1-Wire Thermometer

6) Weitere Informationsquellen: 1. Infineon technologies; XC164-16 User s Manual, Volume 1 (of 2): System Units 2. Infineon technologies; XC164-16 User s Manual, Volume 2 (of 2): Peripheral Units 3. Infineon technologies; XC164-16 Data Sheet 4. Infineon technologies, C166S User Manual (Befehlssatz) 5. http://www.infineon.com 6. https://hps.hs-regensburg.de/~fam39454/ie_lab/pmc.php 7. http://www.keil.com 8. G. Schmitt; Mikrocomputertechnik mit dem Controller C167, Oldenbourg Wissenschaftsverlag GmbH, München 2000 9. Maxim Datenblatt zum DS18S20 (auf der Labor-Homepage oder direkt bei Maxim-IC) Praktikum Mikrocomputertechnik - 23 - V5M 1-Wire Thermometer