Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Experiment: Sinusgenerator, Version B

In diesem Experiment soll eine andere Version des Sinusgenerators aufgebaut werden, bei der eine Rechteckspannung am Eingang /NMI (nichtmaskierbarer Interrupt) des Mikroprozessors als Taktfrequenz für die Ausgabe der Sinustabelle dient. Dadurch bekommt man einen Sinusgenerator, dessen Frequenz ein ganzzahliger Teil der Taktfrequenz ist. Der Frequenzfaktor hängt von der Zahl der Stützstellen der Sinustabelle ab.

Jede negative Flanke des Rechtecksignals löst im Mikroprozessor einen Interrupt (NMI) aus, bei dessen Bearbeitung ein Wert aus einem Funktionspuffer geholt und auf den DA-Wandler DAC1 ausgegeben wird. Der Zeiger in den Puffer wird nach jeder Ausgabe erhöht und beim Erreichen des Endes des Puffers auf dessen Anfangsadresse gesetzt.

Im Hauptprogramm des Sinusgenerators wird zuerst der Funktionspuffer mit den Werten der Sinustabelle geladen und der Zeiger auf den Puffer initialisiert. Sodann beginnt der Prozessor eine unendliche Warteschleife zu bearbeiten, die von den Interrupts unterbrochen wird.

Der Aufbau des Experiments ist in Abbildung EXSINB gezeigt. Zur Erzeugung der erforderlichen Taktfrequenz kann man entweder den auf der Platine DIGMLT implementierten Rechteckgenerator oder bei Verwendung eines zwischengeschalteten Teilers auch den PLL-gesteuerten Oszillator der Platine FQSYNT einsetzen.

Aufbau des Sinusgenerators, Version B

Das hier beschriebene Experiment hat einen nicht ganz unwesentlichen Schönheitsfehler: Falls die Taktfrequenz am Eingang /NMI zu hoch wird, unterbricht sich der NMI selber, und es kommt in der Folge zu einem Stack-Overflow und zu einem Absturz des Rechners. Eine verbesserte Version dieses Experiments würde entweder den maskierbaren Interrupt (INT) verwenden, da dieser blockierbar ist (Befehle EI und DI) und damit der reentrante Aufruf verhindert wird. Oder aber es wird in die NMI-Routine ein Software-Mechanismus eingebaut, der die Unterbrechung der Bearbeitung des NMI nicht zulässt. Diese Methode löst allerdings nicht das Problem, sondern verschiebt nur die maximal erlaubte Taktfrequenz nach oben.

Man sieht also, dass es keinen absoluten Software-Schutz gegen das Selbstunterbrechen des NMI gibt. Die einzige Möglichkeit besteht darin, externe Hardware vorzusehen, die den nächsten NMI verhindert, solange ein NMI bearbeitet wird.

;===================================================
;--- non maskable interrupt - Funktionsgenerator ---
;===================================================
;
            ORG     0066H
;
            .GLOBAL NMI
NMI:        PUSH    DE          ;Register sichern
            PUSH    HL
            PUSH    AF
            LD      HL,(FBFPOI) ;Zeiger auf Funktions-
            LD      A,(HL)      ;  tabelle
            INC     HL          ;Daten lesen
            LD      H,(HL)
            LD      L,A
            CALL    ODAC1       ;Wert ausgeben
            LD      HL,(FBFPOI) ;Zeiger erhöhen
            INC     HL
            INC     HL
            LD      DE,FBFEND   ;überprüfen, ob Ende
            PUSH    HL          ;  der Tabelle
            XOR     A
            SBC     HL,DE
            POP     HL
            JR      C,$1        ;nein
            LD      HL,FNCBUF   ;ja, Zeiger rücksetzen
$1:         LD      (FBFPOI),HL
            POP     AF
            POP     HL
            POP     DE
            RETN                ;Ende NMI-Service
;
            .DATA
FNCBUF:     DEFS    512         ;Funktionspuffer
FBFPOI:     DEFW    0           ;Zeiger auf Tabelle
            .CODE
;
FBFEND      EQU     FNCBUF+512
;
;===================================================
;---- Experiment: Sinusgenerator, Version B --------
;===================================================
;
            .GLOBAL SINUSB
SINUSB:     LD      HL,SINTAB   ;Sinustabelle laden
            LD      DE,FNCBUF
            LD      BC,512
            LDIR
            LD      HL,FNCBUF   ;Zeiger initialisieren
            LD      (FBFPOI),HL
SINGEN:     JR      SINGEN      ;warten auf NMI
;


Last Update: 2008-05-31