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