117 lines
7.0 KiB
Plaintext
117 lines
7.0 KiB
Plaintext
00001 ;TPicSim8
|
|
00002 ;Programm zum Test des 16F84-Simulators.
|
|
00003 ;Es werden die Interrupts für TMR0, RB0 (INT) und RB4-7 geprüft
|
|
00004 ;(c) St. Lehmann
|
|
00005 ;19.04.2014
|
|
00006
|
|
00007 list c=132 ;Zeilenlänge im LST auf 132 Zeichen setzen
|
|
00008
|
|
00009 ;Definition einiger Symbole
|
|
00010 indirect equ 0
|
|
00011 status equ 03h
|
|
00012 fsr equ 04h
|
|
00013 ra equ 05h
|
|
00014 rb equ 06h
|
|
00015 intcon equ 0bh
|
|
00016
|
|
00017 ;Definition des Prozessors
|
|
00018 device 16F84
|
|
00019 ;Festlegen des Codebeginns
|
|
00020 org 0
|
|
00021 start
|
|
0000 281C 00022 goto main
|
|
0001 0000 00023 nop
|
|
0002 0000 00024 nop
|
|
0003 0000 00025 nop
|
|
00026
|
|
00027 ;Interrupt-Service-Routine muss an Adresse 4 stehen, deshalb die 3 NOPs
|
|
00028 ISR
|
|
0004 1D0B 00029 btfss intcon,2 ;war es ein Timer-Interrupt?
|
|
0005 280B 00030 goto isr1 ;nein
|
|
0006 3054 00031 movlw 54h ;ja, 54h = T in 20h schreiben
|
|
0007 00A0 00032 movwf 20h
|
|
0008 128B 00033 bcf intcon,5 ;Timer-Interrupt sperren
|
|
0009 110B 00034 bcf intcon,2 ;Interrupt-Flag zurücksetzen
|
|
000A 281B 00035 goto isrend
|
|
00036 ISR1
|
|
000B 1C8B 00037 btfss intcon,1 ;war es ein RB0-Interrupt?
|
|
000C 2812 00038 goto isr2 ;nein
|
|
000D 3049 00039 movlw 'I' ;schreibe ein I an 21h
|
|
000E 00A1 00040 movwf 21h
|
|
000F 120B 00041 bcf intcon,4 ;RB0-Interrupt sperren
|
|
0010 108B 00042 bcf intcon,1 ;RB0-Interrupt-Flag löschen
|
|
0011 281B 00043 goto isrend
|
|
00044 ISR2
|
|
0012 1C0B 00045 btfss intcon,0 ;war es ein RB4-7 Interrupt?
|
|
0013 2819 00046 goto isr3 ;dürfte nie passieren
|
|
0014 3052 00047 movlw 'R' ;schreibe ein R nach 22h
|
|
0015 00A2 00048 movwf 22h
|
|
0016 118B 00049 bcf intcon,3 ;keine RB4-7 Interrupts erlauben
|
|
0017 100B 00050 bcf intcon,0 ;auch das Flag löschen
|
|
0018 281B 00051 goto isrend
|
|
00052 ISR3
|
|
0019 3046 00053 movlw 'F' ;Fehlermeldung
|
|
001A 00A3 00054 movwf 23h
|
|
00055
|
|
00056 isrend
|
|
001B 0009 00057 retfie ;Ende der Inetrrupt-Service-Routine
|
|
00058
|
|
00059
|
|
00060 main:
|
|
00061 ;Der TMR0 wird vom Befehlstakt incrementiert. beim Überlauf wird ein Interrupt ausgelöst
|
|
001C 3001 00062 movlw 00000001B ;Option-Register entsp. initialisieren
|
|
001D 1683 00063 bsf status,5 ;Bank umschalten
|
|
001E 0081 00064 movwf 1 ;Option-Register
|
|
001F 1283 00065 bcf status,5
|
|
0020 3020 00066 movlw 20h ;nur Timer-Interrupt erlauben
|
|
0021 008B 00067 movwf intcon
|
|
0022 178B 00068 bsf intcon,7 ;Globale Freigabe, ab jetzt kann ein Interrupt durchkommen
|
|
00069 loop1
|
|
0023 1A8B 00070 btfsc intcon,5 ;fertig, wenn ISR dieses Bit zurücksetzt
|
|
0024 2823 00071 goto loop1 ;bis Timer überläuft
|
|
00072
|
|
00073 ;zuerst die wirksame Flanke für RB0 festlegen (hier die fallende Flanke)
|
|
0025 300F 00074 movlw 00001111b
|
|
0026 1683 00075 bsf status,5
|
|
0027 0081 00076 movwf 1
|
|
0028 1283 00077 bcf status,5
|
|
00078 ;nun den RB0-Interrupt freigeben, Rest sperren
|
|
0029 3010 00079 movlw 10h
|
|
002A 008B 00080 movwf intcon
|
|
002B 178B 00081 bsf intcon,7
|
|
00082 loop2
|
|
002C 1A0B 00083 btfsc intcon,4
|
|
002D 282C 00084 goto loop2
|
|
00085
|
|
00086 ;Beim RB4-7 Interrupts wird ein Flankenwechsel nur an den Pins die als Eingang arbeiten erkannt
|
|
002E 3008 00087 movlw 08h ;RB4-7 Interrupt freigeben
|
|
002F 008B 00088 movwf intcon
|
|
0030 178B 00089 bsf intcon,7 ;GIE
|
|
00090 loop3
|
|
0031 198B 00091 btfsc intcon,3 ;wird in ISR zurückgesetzt
|
|
0032 2831 00092 goto loop3
|
|
00093
|
|
00094 ;das gleiche nochmals, nur sind RB4-6 Ausgänge und werden deshalb ignoriert
|
|
0033 308F 00095 movlw 10001111B
|
|
0034 1683 00096 bsf status,5
|
|
0035 0086 00097 movwf 6 ;TRIS RB
|
|
0036 1283 00098 bcf status,5
|
|
0037 3008 00099 movlw 08h ;RB4-7 Interrupt freigeben
|
|
0038 008B 00100 movwf intcon ;aber nur RB7 ist aktiv
|
|
0039 178B 00101 bsf intcon,7 ;GIE
|
|
00102 loop4
|
|
003A 198B 00103 btfsc intcon,3 ;wird in ISR zurückgesetzt
|
|
003B 283A 00104 goto loop4
|
|
00105
|
|
00106
|
|
00107 ;******************************************************************
|
|
00108 ;wenn alles richtig, dann
|
|
00109 ;in 20h steht 54H
|
|
00110 ;in 21H ein 49H
|
|
00111 ;in 22H ein 53H
|
|
00112
|
|
00113 ende
|
|
003C 283C 00114 goto ende ;Endlosschleife, verhindert Nirwana
|
|
00115
|
|
00116
|