; Programm: PRG5.ASM
LIST P=16C71
; Programmerklaerung:
;   Das Hauptprogramm soll hier sehr simpel sein,
;   da nur der Port_B staendig inkrementiert wird.
;   Das Interruptserviceprogramm, welches nur 
;   durch eine Beendigung einer A/D-Konverion
;   ausgeloest wird, ueberprueft das Ergebnis des
;   analogen Einganges an PA0 ob groeaaer als
;   den Wert 80h ist. Ist dies der Fall, so wird 
;   an dem digitale Ausgang PA3 'OVER' ein 
;   posetives Signal ausgegeben. Nur waehrend der 
;   Interruptserviceroutine wird ebenfalls ein 
;   posetives Signal an PA2 'ConEnd' ausgesendet.

; * Symbolzuweisung *
        W        EQU 00h
        f        EQU 01h

        STATUS_R EQU 03h
        Port_A   EQU 05h
        Port_B   EQU 06h
        ADCON0_R EQU 08h
        ADRES_R  EQU 09h
        INTCON_R EQU 0Bh

        OPTION_R EQU 81h
        Tris_A   EQU 85h
        Tris_B   EQU 86h
        ADCON1_R EQU 88h
                
        #DEFINE Carry  STATUS_R,0
        #DEFINE Page_1 STATUS_R,5
        #DEFINE ADIF   ADCON0_R,1
        #DEFINE GO     ADCON0_R,2
        #DEFINE ConEnd Port_A,2
        #DEFINE Over   Port_A,3

; * Zuordnung des Resetvektors *
ORG 0000h
        Goto Init

; * Zuordnung des Interruptvektors *
ORG 0004h 
        ; # Setzen des ConEnd-Bites an PA2
        BSF     ConEnd
        ; # ADC-Ergebnis auslesen
        MOVF    ADRES_R,W
        ; # Subtarktion 80h-W -> W
        SUBLW   80h
        ; # Vergleichen
        ; Carry=1, wenn W>80h
        ; Carry=0, wenn W=<80h
        ; Ist Carry=0, so wird 'Over' gesetzt.
        BTFSS   Carry
          BSF   Over
        ; Ist Carry=1, so wird 'Over' geloescht.
        BTFSC   Carry
          BCF   Over
        BCF     ConEnd
        BSF     GO
        BCF     ADIF
        RETFIE

; * Programmzuweisung *
ORG 0010h

Init:              
        ; # Initialisieren des Prozessors        
        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'10000000'
        MOVWF OPTION_R    ; Init. des OPTION-Reg.
        ; /RBPU = 1 .. Pull Up AUS
        ; RTE = 0 L-H-Flanke
        ; Auf Seite 1 schalten!!
               
        MOVLW b'00000000'
        MOVWF Tris_B      ; Init. d. IO-Dir-Reg.PB
        ; alle AUSgabe
        ; 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'00000010'
        MOVWF ADCON1_R    ; Init. des ADCON1-Reg.
        ; PA0-1 als analog Einaenge
        ; PA3-4 als digital E/A

        BCF   Page_1   ; Umschalten auf Seite 0

        MOVLW b'11000001'
        MOVWF ADCON0_R   ; Init. des ADCON0
        ; ADCS1,0: 11..ADC-Oszillaotor: inter. RC
        ; CHS1,0: 00..ADC-In = PA0
        ; ADON=1: ADC eingeschaltet

        MOVLW b'11000000'
        MOVWF INTCON_R   ; Init. des INTCON-Reg.
        ; ADIE = 1 .. A/D-Int. Enable Bit EIN
        ; GIE  = 1 .. Global Interrupt EIN

        CLRF    Port_B
        CLRF    Port_A

; * Hauptprogramm *
Prog:   
        INCF    Port_B,f
        ; Inkrementieren von Port B
        GOTO    Prog

END
