MC Abschlußprüfung Fachhochschule Regensburg Fachbereich Elektrotechnik Prüfungsfach: Mikrocomputertechnik SS02 Prüfungsteilnehmer (bitte in Druckschrift) Name: Aufgabensteller: Prof. Meier, Prof. Scharfenberg Vorname: Prüfungstermin: Matrikel-Nr.: 13.07.2002 10:00 Semester: zugelassene Hilfsmittel: Buch/Skript Teil 2, Arbeitszeit: 90 Min. Aufgabe 1 Sie müssen eine Analogspannungsmessung Ux vornehmen, haben aber nur noch zwei Digital-Port-Pins zur Verfügung (P2.0 und Px.y). Sie haben eine Schaltung bestehend aus einem Transistor Tr, der RC– Kombination und einem CMOS-Schmitt-Trigger aufgebaut. Die Schaltung funktioniert wie folgt: - Die Spannung Ux lädt über Transistor Tr die RC–Kombination auf URC auf - Port P2.0 schaltet Transistor Tr aus - Der Widerstand R entlädt den Kondensator C exponentiell - Nach Ablauf einer Zeit ∆T wird die Schwellspannung Uth des CMOS-Schmitt-Triggers unterschritten, so dass dieser eine „1“ am Port Px.y liefert U RC Uth P2.0 Tr CMOS Schmitt-Trigger Px.y Ux C167 P2.0 Px.y R C URC Beantworten Sie zu den Verfahren: Polling, Interrupt, Timer folgende Fragen: ∆T 1. Geben Sie für Px,y den Port-Pin an, der verwendet werden muss oder, falls optionale Pins verwendet werden können, nennen Sie einen passenden Pin 2. Beschreiben Sie kurz den Ablauf zur Ermittlung der Zeit ∆T 3. Damit Sie die Zeit möglichst genau messen, benötigen auch für das Polling- und Interruptverfahren einen Timer. Welchen Timer und wie wenden Sie den Timer jeweils an? Verfahren 1) Pin Polling P2.1 + altern Interrupt P2.1 + altern Timer (Zeitmessung direkt) Meh; Sfb P3.6 für T3 2) Verfahren 3) Timer Sperren Tr Start des Timers Zyklisches Einlesen, bis an P2.1 eine “1“ anliegt Auslesen Timer; Timerwert entspr. ∆T Timer 3 als Timer Anfangswert 0 Inc. Timer Interrupt freigeben Sperren Tr Start des Timers Interruptroutine liest Timer aus Timerwert entspr. ∆T Timer 3 als Timer Anfangswert 0 Inc. Timer Sperren Tr Start des Timers bei positivem Gate stoppt Timer Auslesen Timer z.B. im nächsten HPZyklus; Timerwert entspr. ∆T Timer 3 als gated Timer Anfangswert 0 Inc. Timer FH Regensburg S. 1 MC Abschlußprüfung SS02 2. Aufgabe Teil a) Unterprogramm QS Das Unterprogramm QS ermittelt die Quersumme über einen Speicherbereich (Words). Schnittstelle: Eingabe R2 : Anfangsadresse des Speicherbereichs, in dem sich die Words befinden R3 : Anzahl der zu summierenden 16 Bit-Werte Ausgabe {R1+R0} : 32 bit Quersumme des Speicherbereichs Hinweis: Werden 16 Bit-Werte addiert, kann sich ein Übertrag zu einer 32 Bit- Größe ergeben, weshalb als Ergebnisgröße zwei Register (R1, R0) gemeinsam vereinbart sind: Ergebnisvariable high-Anteil in R1 low-Anteil in R0 Der Inhalt von R1 kommt dadurch zustanden, dass jeweils nach der Addition zweier Worte (Addition in R0 hinein) geprüft wird, ob ein Überlauf gesetzt ist. Wenn ja, wird der Inhalt von R1 incrementiert. Aufgabenstellung: Der unten stehende Ablaufplan QS stellt den Programmablauf dar. Notieren Sie neben den Ablaufplan die Kodierung des Unterprogramms. QS Retten der lokal benötigten Register R0 (low-Anteil-Register) auf Grundstellung R1 (high-Anteil-Register) auf Grundstellung Addition Speicherinhalt mit R0 -> [RAM-ptr] + R0 n Überlauf? -> CY j Increment high-Anteil-Register R1 Adresszeiger auf nächstes Word weiterführen Decrement der Zählvariablen n alle Words aufaddiert? j Restaurieren der lokal benötigten Register return Meh; Sfb FH Regensburg S. 2 MC Abschlußprüfung SS02 Teil b) Unterprogramm InStr Das Unterprogramm InStr prüft, ob sich innerhalb einer Zeichenkette (data string) eine Zeichenfolge (SearchStr) befindet. (Bedingung: beide Strings keine Null-Strings) Schnittstelle: Eingabe Ausgabe Beispiel: R1 : Anfangsadresse des Data Strings (R1 = data ptr) R3 : Anfangsadresse des SearchStr (R3 = search ptr) R1 : Trefferadresse (goal), Startadresse des SearchStr innerhalb Data Strings falls kein Treffer: Rückgabe des Wertes 0ffffh w o r l Data String (0F600h) H a l l o l l 0h SearchStr Lösung: InStr liefert Trefferadresse 0F602h zurück (goal) d 0h Aufgabenstellung: Das nebenstehende Assemblerprogramm stellt den Programmablauf dar. Zeichnen Sie den detaillierten Ablaufplan des Unterprogramms neben das Assemblerprogramm. Vorgaben zum Ablaufplan: • Kommentare angeben (keine Ass-Anweisungen) • Adresslabels in Ablaufplan übernehmen Meh; Sfb FH Regensburg S. 3 MC Abschlußprüfung InStr PROC SS02 near push R0 push R2 push R4 mov R2,R1 ;save data ptr mov R4,R3 ;save start pos SearchStr mov RL0,[R1] ;load data byte cmp RL0,[R3] ;byte (data ≡ search) jmp cc_nz, SJ2 cmp RL0,#0 jmp cc_z, EnT add R1,#1 ;data ptr add R3,#1 ;search ptr jmp SJ1 cmp RL0,#0 jmp cc_z, EnoT mov RL0,[R3] ;load search byte cmp RL0,#0 jmp cc_z, EnT SJ1: CM1: CM2: SJ2: CM4: ;both strings end pos? ;data string end pos? ;search string end pos? ;no goal EnT: mov R3,R4 ;search ptr start address add R2,#1 ;last data address incr. mov R1,R2 ;resume data ptr jmp SJ1 mov R1,R2 jmp Ende ;goal position from R2 ENoT: mov R1,#0ffffh ;no goal Ende: pop R4 pop R2 pop R0 ret InStr ENDP Meh; Sfb FH Regensburg S. 4 MC Abschlußprüfung SS02 3. Aufgabe Für eine Interrupt-Routine Key_ISR ist das Unterprogramm Trans zur Umwandlung zu entwerfen. Die Routine Trans hat die Aufgabe, die Tasten eines Nummernblocks (Tasten ’0’ bis ’9’) auszuwerten. Vorinformation Beim Betätigen (Drücken und Loslassen) einer Taste einer MF-II-Tastatur – wie man sie vom PC her kennt – wird folgende 3-Byte-Sequenz aus scancode und breakcode vom Tastaturcontroller (sorgt zusätzlich noch für die Entprellung) an den PC übertragen: -----| scancode |------------- -- -- -- -- -- -- ------------| breakcode |---| scancode |--------Aufgaben des Codes: - Der erste scancode kennzeichnet die betätigte Taste - Der breakcode (F0h) zeigt das Loslassen einer Taste an - Der anschließende scancode zeigt an, welche Taste losgelassen wurde Die Struktur der Interrupt-Routine ist wie folgt: Key_ISR Nummernblock Tastaturcode für UP bereitstellen 7 8 9 Trans 4 5 6 1 2 3 Ergebnis an Tastaturtreiber 0 reti Beschreibung der Aufgaben: Ihre Aufgabe ist es die Umwandlungsroutine (Trans) zu schreiben, die die Tasten eines Nummernblocks (Tasten ’0’ bis ’9’) in die zugehörigen ASCII-Codes umwandelt! • Für den scancode soll aus einer Tabelle der zugehörige ASCII-Code ermittelt und an die Aufrufschnittstelle zurückgeliefert werden • Mit dem breakcode wird keine Umwandlung vorgenommen, sondern der breakcode an die Aufrufschnittstelle zurückgeliefert Such-Tabelle (ScanTab): Definieren Sie im Bereich ihres Controllers (ab Adresse 00400h) eine Tabelle für die scancodes des Nummernblocks und legen Sie jeweils neben (hinter) den scancode das dazugehörige ASCIIZeichen, so dass in einem Suchvorgang das ASCII-Zeichen ermittelt werden kann. Die Tabelle ist mit 0h terminiert, so dass die Tabelle später weiter ergänzt werden kann. gedrückte Taste b c d e f g h i j k scancode 70 h 69 h 72 h 7A h 6B h 73 h 74 h 6C h 75 h 7D h ASCII-Code 30 h 31 h 32 h 33 h 34 h 35 h 36 h 37 h 38 h 39 h Schnittstelle Eingabe Ausgabe Meh; Sfb RL0 : Tastaturcode (scancode bzw. breakcode) RL0 - ASCII-Code des Tastaturzeichens, wenn scancode eingetroffen RL0 - breakcode, wenn breakcode eingetroffen // breakcode = F0h FH Regensburg S. 5 MC Abschlußprüfung SS02 Bewertete Lösungsschritte: a) Beschreiben Sie kurz Ihre Vorgehensweise und ergänzen Sie das untenstehende Speicherbild. ScanTab 00400h b) Geben Sie die Adresse des Interrupt-Einsprunges in der Interrupt-Vektortabelle an. Der verwendete Interrupt hat die Int-Nr. 2Bh c) Wie muss das Interrupt-Controlregister xxIC eingestellt werden, damit die Prioritätsebene 12 (Gruppe = 0) erreicht ist und der Interrupt sich durchsetzen kann (Bitmuster)? d) Entwerfen Sie zunächst das Flussdiagramm für die Unterprogrammroutine Trans (Veränderungen von nicht betroffenen Registern unzulässig) e) Codieren Sie das Programm in C167-Assembler Es wird davon ausgegangen, dass alles korrekt initialisiert wurde. Hinweise: • Codierung des breakcodes: F0h • Es wird angenommen, dass keine unbekannten scancode auftreten! Viel Erfolg Meh; Sfb FH Regensburg S. 6