;************************************************************** ; Testprogramm zur Ansteuerung des Ram Moduls ; (c) 2001 by Sascha Dräger ;************************************************************** ; Modus 1: (nach High-> Low Flanke an Portpin 3.2 (Interrupt0): ; Das Programm liest die Eingangszustände am Port 1 jede Milli- ; Sekunde ein und speichert diese über eine Zeitspanne von ; 32,768 Sekunden in dem externen (32768 Byte) Ram ab. ; Solange der Modus 1 aktiviert ist, wird der Portpin 3.4 auf ; Low gesetzt. ; Modus 2: (nach High-> Low Flanke an Portpin 3.3 (Interrupt1): ; Das Programm gibt jede Millisekunde einen der gespeicherten ; Werte am Port 1 aus und das ebenfalls über eine Zeitspanne ; von 32,768 Sekunden. Solange der Modus 2 aktiviert ist, wird ; der Portpin 3.5 auf Low gesetzt. ; Eine erneute High-Low Flanke bricht den aktuellen Durchlauf ; ab und führt damit zu einem neuem Start des Durchlaufs. ; WICHTIG: Zur Ansteuerung des Ram's werden die Leitungen \RD ; und \WR genutzt, die auf den Portpins 3.6 und 3.7 liegen. ; Daher können diese natürlich nicht für andere Zwecke genutzt ; werden und dabei auf Low Signal gesetzt werden! ;Prozessordefinition: INCLUDE 89c52.mc ;Quarzfrequenz: 24 MHz ;Belegte Speicheradressen: Moduswahl BIT 0h LJMP Init ;Überspringe Interruptvektoren nach einem Reset ;************************************************************** Interruptvektoren: (0003h): ;Einsprungadresse externer Interrupt 0 (P3.2/INT0) SETB Moduswahl ;Moduswahl = 1 = Werte vom Port 1 ins Ram schreiben LCALL Neuer_Durchlauf CLR P3.4 ;Modus Anzeige setzen RETI (000Bh): ;Einsprungadresse Interrupt Timer 0 SJMP Interrupt_Timer_0 (0013h): ;Einsprungadresse externer Interrupt 1 (P3.3/INT1) CLR Moduswahl ;Moduswahl = 0 = Werte vom RAM an den Port 1 legen LCALL Neuer_Durchlauf CLR P3.5 ;Modus Anzeige setzen RETI Neuer_Durchlauf: MOV DPTR,#0000h ;Zurücksetzen des DPTR MOV Port1,#FFh ;Port 1 zurücksetzen MOV Port3,#FFh ;Port 3 zurücksetzen MOV TH0,#F8h ;High Byte vom Timer 0 setzen MOV TL0,#33h ;Low Byte vom Timer 0 setzen SETB TR0 ;Timer 0 Start RET ;************************************************************** Interrupt_Timer_0: ; Der Timer 0 zählt nach dem Starten immer bis zum Überlauf ; hoch und löst mit dem Überlaufen einen Interrupt aus. Mit ; Auslösen des Interrupt;s springt der Programmzähler auf die ; Adresse (000Bh). ; Der Wert des Timer;s wird mit jedem Maschinentakt (1/12 ; Oszillatortakt) um einen erhöht. Um eine Zeitbasis von 1 mS ; zu errreichen, wird der Timer auf den Wert F830h vorein- ; gestellt. Bis zum Überlauf müssen nun 10000h-F830h = 7D0h ; = 2000 Maschinentakte erfolgen. Da bei einer Oszillator- ; Frequenz von 24 MHz zwei Maschinentakte 1 uS benötigen, ; beträgt die Zeit bis zum Überlauf die gewünschte 1mS. ; Da die Einsprungzeit eines Interrupts aber zwischen 3 und ; 8 Maschinentakte liegen kann, muss die bereits vergangene ; Zeit zur Voreinstellung addiert werden. Der Timer zählt auch ; nach dem Auslösen eines Interrupts einfach weiter, daher steht ; die seit der Interruptauslösung vergangene Zeit im Timer Low ; Byte. Zusätzlich werden noch 3 Takte für die Abarbeitung von ; MOV A,TL0 / ADD A,#33h / MOV TL0,A addiert: MOV A,TL0 ;Zeit seit Überlauf in den Akku kopieren ADD A,#33h ;A = Zeit seit Überlauf + Grundeinstellung 30 + 3 MOV TL0,A ;Einstellung für das Timer 0 Low Byte MOV TH0,#F8h ;Grundeinstellung Timer 0 High Byte IF BIT Moduswahl THEN ;Moduswahl = 1 = Werte vom Port 1 ins Ram schreiben MOV A,Port1 MOVX @DPTR,A ;Speichere Wert im Ram ELSE ;Moduswahl = 0 = Werte vom Ram an den Port 1 legen MOVX A,@DPTR ;Lese Wert aus dem Ram MOV Port1,A END IF INC DPTR ;Hochzählen der Adresse ;Wenn bis zur Adresse 8000 hochgezählt wurde, stoppe den Timer: IF DPL = #00h THEN IF DPH = #80h THEN CLR TR0 ;Timer 0 stoppen MOV Port1,#FFh ;Port 1 zurücksetzen SETB P3.4 ;Modus Anzeige zurücksetzen SETB P3.5 ;Modus Anzeige zurücksetzen END IF END if RETI ;************************************************************** Init: MOV TMOD,#01h ;Timer 0 Modus = 1 MOV TH0,#F8h ;High Byte vom Timer 0 setzen MOV TL0,#33h ;Low Byte vom Timer 0 setzen SETB EA ;Interruptbehandlung aktivieren SETB ET0 ;Interrupt für Timer 0 aktivieren SETB EX0 ;Externer Interrupt (P3.2/INT0) aktivieren SETB EX1 ;Externer Interrupt (P3.3/INT1) aktivieren SETB IT0 ;Ext0 Interrupt reagiert auf High-Low Flanke SETB IT1 ;Ext1 Interrupt reagiert auf High-Low Flanke MOV DPTR,#0000h ;Initialisierung für den DPTR ;************************************************************** Hauptprogramm: LJMP Hauptprogramm ;Endlosschleife