; Programm: PRG3.ASM
LIST P=16C71
        
; Symbolzuweisung
        f        EQU 01h
        STATUS_R EQU 03h
        Port_A   EQU 05h
        Port_B   EQU 06h
        INTCON_R EQU 0Bh
        OPTION_R EQU 81h
        Tris_A   EQU 85h
        Tris_B   EQU 86h
        ADCON1_R EQU 88h
        
        #DEFINE Stop   Port_B,3
        #DEFINE RBIF   INTCON_R,0
        #DEFINE INTF   INTCON_R,1
        #DEFINE Page_1 STATUS_R,5

; Zuordnung des Resetvektors
ORG 000h
        GOTO Init

; Zuordnung des Interruptvektors
ORG 04h
        GOTO Int_Ser_Rou

; Programmzuweisung
ORG 010h

Init:   
        MOVLW b'10010000'
        MOVWF INTCON_R   ; Init. des INTCON-Reg.
        ; INT = 1 .. Interrupt Enable Bit EIN
        ; GIE = 1 .. Global Interrupt EIN
                
        BSF   Page_1
        ; Umschalten auf 1. Seite
        ; um OPTION-Register, Tris_A/B & ADCON zu
        ; konf. Der Assembler gibt einen Meldung
        ; (4x) aus, dass bei 8Xh-Adressierung das
        ; oberste Bit (also der 8-ter) wegge-
        ; schnitten wurde, dieses geschieht
        ; dadurch, dass bei der Register-
        ; adressierung nur 7 Bit (0-127)
        ; moeglich ist, daher muss auf die 
        ; 1. Seite umgeschaltet werden, nachher
        ; wieder auf Seite 0 zurueckschalten nicht 
        ; vergessen.

        MOVLW b'11000000'
        MOVWF OPTION_R    ; Init. des OPTION-Reg.
        ; /RBPU = 1 .. Pull Up AUS
        ; INTEG = 1 .. Int. bei steigender Flanke
        ; Auf Seite 1 schalten!!
               
        MOVLW b'11110111'
        MOVWF Tris_B      ; Init. d. IO-Dir-Reg.PB
        ; Port B 0,1,2,4,5,6 & 7 EINgaenge
        ; Port B 3 AUSgang
        ; Auf Seite 1 schalten!!

        MOVLW b'00000000'
        MOVWF Tris_A      ; Init. d. IO-Dir-Reg.PA
        ; Port A 0-4 AUSgaenge
        ; Auf Seite 1 schalten!!
        
        MOVLW b'00000011'
        MOVWF ADCON1_R    ; Init. des ADCON1-Reg.
        ; PA0-3 als digital E/A

        BCF   Page_1   ; Umschalten auf Seite 0

        BCF   Stop     ; Loeschen des Stop-Ausg.
        CLRF  Port_B   ; Loeschen des Port_B-Reg.

Prog:   INCF  Port_A,f ; Inkrementieren des PA's 
        GOTO  Prog     ; Sprungbefehl zu 'Prog'


Int_Ser_Rou:           ; INTerrupt SERvice ROUtine
        BSF   Stop     ; Setzen der Stop-Ausg.
                       ; Meldeausgang am PortB-3

Marke1: BTFSS RBIF     ; Ist RBIF=1, dann ueber-
                       ; springe naechsten Befehl
          GOTO Marke1  ; Sprung zu 'Marke1'

        BCF   RBIF     ; Loeschen des RBIF's 

Marke2: BTFSS RBIF     ; Ist RBIF=1, dann ueber-
                       ; springe naechsten Befehl
          GOTO Marke2  ; Sprung zu 'Marke2'
        
        BCF  Stop      ; Loeschen des Stop-Aug.
        BCF  INTF      ; Loeschen des INTF
        BCF   RBIF     ; Loeschen des RBIF's 

        RETFIE         ; Ruecksprungsbefehl 
                       ; des Interrupt-Service-R.

; Programmzuweisung bei Power On Reset
ORG 1FFh
        GOTO Init

; ------------------------------------------------
; Dieses Programm soll eine Verarbeitung einer 
; externen Interruptquelle an Bit 0 des Portes B 
; (PB0) demonstrieren. 
; Das Hauptprogramm des Demonstartionsprogramm
; ist hier kurz gehalten. Es wird das EA-Register
; PortA (PA0-PB4), welches als 5 Bit Ausgabeport 
; geschaltet ist, fortlaufend inkrementiert (um 
; 1 erhoeht), welche als Endlosschleife (mit einem
; GOTO-Befehl in die Zeile des INC-Befehls) 
; realisiert wurde.
; Die Interrupserviceroutine wird durch eine 
; steigenden Flanke an dem Pin PB0 ausgeloest.
; Der PC wird fuer einen RETFIE-Befehl gespeichert
; und nimmt den Wert PC=004h an, in welchem das
; Interrupt-Service-Programm steht. In diesem
; Programm steht ein GOTO-Befehl, natuerlich kann
; auch in und ab der Zeile 004h das Interrupt-
; Service-Routen-Programm stehen.
; Das hier implementiert Interruptservice-Programm
; haltet die Inkrementation an, da kein INC-Befehl
; im IntSer-Prg steht, und gibt an Port B Bit 3 
; (PB3) eine 1 aus, welches den Benuetzer anzeigen 
; soll, dass das System gestoppt hat, daher auch 
; der Name dieses Bits STOP.
; Um aus diesem Zustand zu gelangen, muessen 2
; Zustandaenderung an PortB Bit 4 bis 7 durchge-
; fuehrt werden. Wenn man einen PIC16C71 program-
; miert hat, kann man dieses mit einer Taste real-
; isieren (drucken und wieder loslassen; egal ob
; Schliesser oder Oeffner). Hier wird gezeicht, 
; dass zwar eine Interruptquelle kontrolliert 
; werden kann, ohne diese eine Interruptservice-
; routine aufzurufen, da das Ein/Ausschalt 
; geloescht ist.
; ! Man muss immer darauf achten, dass ein Interrupt
; erkennungsbit nach der Verarbeitung (meisten ein 
; Nachschauen) geloescht wird. Eine Interrupt-
; serviceroutine wird nur bei einer steigenden 
; Flanke eines eingeschlatenen Freigebebit der 
; zugehoere Interruptquelle aufgerufen.
; ! Man muss auch darauf achten, dass man wieder 
; das GIE-Bit setzt.
; Wenn man dieses Programm mit dem Simulator 
; testet kann man die Zustandaenderung der 
; Register gut nachvollziehen.
END
