Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier. |
Home Experimente Aufbau einfacher mikroprozessorgesteuerter Geräte Sinusgenerator, Version B | |||
Siehe auch: Experiment: Sinusgenerator, Version A | |||
|
|||
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.
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 ;
|
|||
Home Experimente Aufbau einfacher mikroprozessorgesteuerter Geräte Sinusgenerator, Version B |