list p=16f1527 ; list directive to define processor #include ; processor specific variable definitions RADIX DEC __IDLOC0 EQU H'8000' __IDLOC1 EQU H'8001' __IDLOC2 EQU H'8002' __IDLOC3 EQU H'8003' __CONFIG _CONFIG1, _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_ON & 0x3FFF __CONFIG _CONFIG2, _WRT_OFF & _STVREN_OFF & _LVP_OFF & _VCAPEN_ON & 0x3FFF ; Diverses ZERO EQU Z ; ZERO-Flag CARRY EQU C ; CARRY-Flag ; Konstanten ;ab 0x20h (.32) Bank 0: PWM_1_LO = 0x20 PWM_1_HI = 0x21 PWM_2_LO = 0x22 PWM_2_HI = 0x23 PWM_3_LO = 0x24 PWM_3_HI = 0x25 PWM_4_LO = 0x26 PWM_4_HI = 0x27 TIMERVAR0 = 0x28 TIMERVAR1 = 0x29 TIMERVAR2 = 0x2A STB0 = 0x2B ; Steuerbyte 0 (0=Merker PWM-Aufruf testweise) I2C_ADRESS_HI = 0x2C I2C_ADRESS_LO = 0x2D I2CDATEN_1 = 0x2E I2C_CTRL_IN = 0x2F I2C_CTRL_OUT = 0x30 I2CLESEPUFFER = 0x31 LOOP1 = 0x32 LOOP2 = 0x33 PWM_COUNTER = 0x34 I2CDATEN_2 = 0x35 ;======================== bankfrei ab hier: OOOO_1_LO = 0x70 ; located in Bank 0, 1, 2, 3 (temp. Var.) OOOO_1_HI = 0x71 ; located in Bank 0, 1, 2, 3 (temp. Var.) TEMP_B0 = 0x72 ; located in Bank 0, 1, 2, 3 (temp. Var.) muss nicht bankfrei sein, weil nur für Bank 0 vorgesehen SYS_TMP1 = 0x73 ; located in Bank 0, 1, 2, 3 SYS_TMP2 = 0x74 ; located in Bank 0, 1, 2, 3 SYS_TMP3 = 0x75 ; located in Bank 0, 1, 2, 3 SYS_TMP4 = 0x76 ; located in Bank 0, 1, 2, 3 SYS_TMP5 = 0x77 ; located in Bank 0, 1, 2, 3 SYS_TMP6 = 0x78 ; located in Bank 0, 1, 2, 3 SYS_TMP7 = 0x79 ; located in Bank 0, 1, 2, 3 SYS_TMP8 = 0x7A ; located in Bank 0, 1, 2, 3 STELLIG = 0x7B ; located in Bank 0, 1, 2, 3 VORNULLEN = 0x7C ; located in Bank 0, 1, 2, 3 W_COPY = 0x7D ; located in Bank 0, 1, 2, 3 S_COPY = 0x7E ; located in Bank 0, 1, 2, 3 P_COPY = 0x7F ; located in Bank 0, 1, 2, 3 ;======================== bankfrei bis hier BANK0 EQU 00h BANK1 EQU 80h BANK2 EQU 100h BANK3 EQU 180h BANK4 EQU 200h BANK5 EQU 280h BANK6 EQU 300h BANK7 EQU 380h BANK8 EQU 400h BANK9 EQU 480h BANK10 EQU 500h BANK11 EQU 580h BANK12 EQU 600h PAGE0 EQU 0000h PAGE1 EQU 0800h PAGE2 EQU 1000h PAGE3 EQU 1800h PAGE4 EQU 2000h PAGE5 EQU 2800h PAGE6 EQU 3000h PAGE7 EQU 3800h ERRORLEVEL -302 ; disable warning (Bankswitching) ERRORLEVEL -306 ; disable warning (Pageswitching) ;---------------------------------------- ;Programmanfang ;---------------------------------------- ORG 0 GOTO SYS_INIT ;---------------------------------------- Interrupt-Adresse: ORG 4 ;----------------------------------------------------------------------------------------------------------------- ;Interrupt-Routine: ;======================================== I2C Schreiben: I2C_WRITE BTFSC PORTC,3 ; Test ob RC.3 auf low liegt, dann Restart statt Start GOTO NORMALSTART BANKSEL SSP1CON2 ; BANK4 BSF SSP1CON2,RSEN ; Restart, weil SCL-Leitung auf Low (ungewiss warum) BTFSS SSP1CON2,RSEN GOTO $-2 CALL WAITMSSP BANKSEL BANK2 BSF LATB,1 BANKSEL BANK0 GOTO EINSTIEG ; sonst normal weiter mit Start NORMALSTART BANKSEL SSP1CON2; BANK4 ; START BSF SSP1CON2,SEN BTFSS SSP1CON2,SEN GOTO $-2 BANKSEL BANK2 BSF LATB,2 BANKSEL BANK0 CALL WAITMSSP EINSTIEG MOVFW I2C_CTRL_IN ; Controlbyte laden (0xA0, input mode) CALL SEND_I2C_BYTE BANKSEL BANK2 BSF LATB,3 BANKSEL BANK0 CALL WAITMSSP BANKSEL BANK4 BTFSC SSP1CON2,ACKSTAT GOTO I2CFAIL BANKSEL BANK0 MOVFW I2C_ADRESS_LO ; Adressbyte Low CALL SEND_I2C_BYTE CALL WAITMSSP BANKSEL BANK4 BTFSC SSP1CON2,ACKSTAT GOTO I2CFAIL BANKSEL BANK0 MOVFW I2C_ADRESS_HI ; Adressbyte High CALL SEND_I2C_BYTE CALL WAITMSSP BANKSEL BANK4 BTFSC SSP1CON2,ACKSTAT GOTO I2CFAIL BANKSEL BANK0 MOVFW I2CDATEN_1 ; Datenbyte 1 CALL SEND_I2C_BYTE CALL WAITMSSP BANKSEL BANK4 BTFSC SSP1CON2,ACKSTAT GOTO I2CFAIL BANKSEL BANK0 MOVFW I2CDATEN_2 ; Datenbyte 2 CALL SEND_I2C_BYTE BANKSEL BANK2 BSF LATB,4 BANKSEL BANK0 CALL WAITMSSP BANKSEL BANK4 BTFSC SSP1CON2,ACKSTAT GOTO I2CFAIL BANKSEL BANK0 BANKSEL BANK4 ; Stop BSF SSP1CON2,PEN CALL WAITMSSP GOTO I2CREAD RETURN ;---------------------------------------- I2C Lesen: I2CREAD BANKSEL BANK4 ; Restart BSF SSP1CON2,RSEN CALL WAITMSSP MOVFW I2C_CTRL_OUT ; Controlbyte (0xA1, Output) CALL SEND_I2C_BYTE CALL WAITMSSP BANKSEL BANK4 BTFSC SSP1CON2,ACKSTAT GOTO I2CFAIL BANKSEL BANK0 BANKSEL BANK4 BSF SSP1CON2,RCEN ; Receive-Mode einschalten, wird automatisch zurückgesetzt wenn fertig. BANKSEL BANK0 CALL WAITMSSP ; EEPROM sendet das Datenbyte, das ist wenn fertig in SSPBUF. BANKSEL BANK4 BSF SSP1CON2,ACKDT ;//BSF// ACK DATA to send is 1, which is NACK. BSF SSP1CON2,ACKEN ;//BSF// Send ACK DATA now. BSF SSP1CON2,PEN ; STOP CALL WAITMSSP BANKSEL BANK4 MOVFW SSP1BUF ; SSPBUF auslesen BANKSEL BANK0 MOVWF I2CLESEPUFFER RETURN ;---------------------------------------- I2C-Subroutinen: I2CFAIL ; Fehlerbehandlung BANKSEL BANK4 BSF SSP1CON2,PEN ; STOP CALL WAITMSSP BANKSEL BANK2 BSF LATB,5 BANKSEL BANK0 BANKSEL BANK0 RETURN SEND_I2C_BYTE ; Laden des Aktuellen Bytes in SSP1BUF BANKSEL BANK4 MOVWF SSP1BUF RETURN WAITMSSP ; Warte bis SSPIF gesetzt ist BANKSEL BANK0 BTFSS PIR1,SSP1IF GOTO $-1 BCF PIR1,SSP1IF RETURN ;======================================== I2C Ende END