; Versuchsreihe 3, Versuch 4, Aufgabe 1. ; Datenaustausch zwischen PIC <--> FPGA. ; S5: Fiktive Zahl0 --> FPGA --> PIC --> Ausgabe. ; S6: Fiktive Zahl1 --> FPGA --> PIC --> Ausgabe. ; Autor: Tobias Schubert, April 2003. ; Prozessor definieren. list p=16F84 include ; Variablen. Zahl0 equ 0x0C Zahl1 equ 0x0D Op equ 0x0E Go equ 0x0F D1 equ 0x10 D10 equ 0x11 fpga equ 0x12 ; Reset-Vektor festlegen. org 0x00 goto PrgStart ; Benötigte Zeichen. Number: addwf PCL,1 dt "0123456789" ; Pausen-Funktion. Pause50ms: movlw d'100' movwf 0x41 movlw d'164' movwf 0x40 decfsz 0x40,1 goto $-1 decfsz 0x41,1 goto $-5 return ; "Working Register" auf LCD-Display ausgeben. WREG2LCD: movwf PORTB ; PORTB = WREG. bsf PORTA,2 ; E = 1. call Pause50ms bcf PORTA,2 ; E = 0. clrf PORTB ; PORTB = 0. return ; Tastendruck S5. TasteS5: ; Pause als Entprellung. call Pause50ms ; Op = 0 setzen. bcf Op,0 ; Go = 1 setzen. bsf Go,0 return ; Tastendruck S6. TasteS6: ; Pause als Entprellung. call Pause50ms ; Op = 1 setzen. bsf Op,0 ; Go = 1 setzen. bsf Go,0 return ; Ausgabe FPGA-Daten. AusgabeDaten: clrf D10 clrf D1 incf fpga AusgabeLoop: decfsz fpga goto $+2 goto Ausgabe incf D1 ; D1 = 10? btfss D1, 1 goto AusgabeLoop btfss D1, 3 goto AusgabeLoop incf D10 clrf D1 goto AusgabeLoop Ausgabe: movf D10,0 call Number call WREG2LCD movf D1,0 call Number call WREG2LCD return ; Hauptroutine. PrgStart: ; PORTA / PORTB initialisieren. ; ------------------------------- clrf PORTA clrf PORTB bsf STATUS,5 ; Bank 1 wählen. bcf STATUS,6 clrf TRISB ; PORTB als Ausgang. clrf TRISA ; PORTA als Ausgang. bsf TRISA,0 ; PORTA0 als Eingang (Taster S5). bsf TRISA,1 ; PORTA1 als Eingang (Taster S6). bcf STATUS,5 ; Bank 0 wählen. ; LCD-Display initialisieren. ; ----------------------------- call Pause50ms bcf PORTA,3 ; RS = 0. movlw b'00110000' ; Initialisierung. call WREG2LCD movlw b'00110000' ; Initialisierung. call WREG2LCD movlw b'00110000' ; Initialisierung. call WREG2LCD movlw b'00111000' ; 2 Zeilen, 5*8 Pixel. call WREG2LCD movlw b'00001100' ; Display ein, Cursor aus. call WREG2LCD movlw b'00000001' ; Display löschen. call WREG2LCD bsf PORTA,3 ; RS = 1. Start: ; Initialisierungen. ; -------------------- clrf Go clrf Op movlw 0x0C movwf Zahl0 ; Zahl0 = 0x0C = 12. movlw 0x0F movwf Zahl1 ; Zahl1 = 0x0F = 15. ; Tastendruck abwarten. ; ----------------------- btfsc PORTA,0 ; Taste S5 gedrückt? call TasteS5 btfsc PORTA,1 ; Taste S6 gedrückt? call TasteS6 btfss Go,0 ; Eine der beiden Tasten gedrückt? goto $-5 ; Display löschen. ; ------------------ bcf PORTA,3 movlw b'00000001' call WREG2LCD bsf PORTA,3 ; Daten ans FPGA. ; ----------------- movlw 0x0 call _w2fpga_adr movfw Zahl0 call _w2fpga_data movlw 0x1 call _w2fpga_adr movfw Zahl1 call _w2fpga_data movlw 0x2 call _w2fpga_adr movfw Op call _w2fpga_data ; Daten vom FPGA. ; ----------------- call _getfpga ; Daten ausgeben. ; ----------------- call AusgabeDaten ; Neustart. ; ----------- goto Start ; Interface PIC <--> FPGA einbinden. ; ------------------------------------ #include "pic_fpga.inc" end