reply
hi Paul
pt2258 is designed for home theatre systems and is i2c capable
i have designed the i2c part of it but i m stucked in the swicthes part
i want total 10 keys to operate the volume
master volume - +
front ch vol - +
rear ch vol - +
subw vol - +
center vol - +
so plz help me u can take my i2c code
here it is
#include p16f72.inc
SDA EQU 6
SCL EQU 7
COUNT1 EQU 0X20
COUNT2 EQU 0X22
COUNT3 EQU 0X24
COUNTER EQU 0X26
SENDVAL EQU 0X28
DATAOUT EQU 0X29
MASTER_VOL EQU 0X30
ORG h'000'
GOTO MAIN
ORG h'004'
MAIN
call DELAY
CALL DELAY ;WAIT
NOP
NOP
BSF STATUS,RP0 ;BANK SELECT 1
MOVLW 0X00 ;MAKE ALL PORTC PINS OUTPUT
MOVWF TRISC ;AND
MOVWF TRISB ;ALL PORTB PINS OUTPUT
CLRF PORTC ;CLEAR THE PORTC PINS
CLRF PORTB ;CLEAR THE PORTB PINS
BCF STATUS,RP0 ;BANK SELECT 0
bcf STATUS,C
CALL START ;START I2C OPERATION
BTFSS STATUS,C ;TEST IF CARRY IS SET
CALL STOP ;NO STOP I2C OPERATION
MOVLW 88H ;MOVE 88H WHICH IS PT2258 DEVICE ADDRESS
MOVWF SENDVAL ;
CALL DATA_OUT ;SEND THE ADDRESS
BTFSC STATUS,C ;TEST CARRY IF CLEAR
CALL ERROR_LED ;NO THEN GOTO ERROR LED
MOVLW B'11100000' ;BINARY DATA FOR -1dB STEP
MOVWF SENDVAL ;SEND THE VALUE OUT
CALL DATA_OUT
BTFSC STATUS,C
GOTO ERROR_LED1
MOVLW B'11100000' ;BINARY DATA FOR -10dB STEP
MOVWF SENDVAL ;SEND THE VALUE OUT
CALL DATA_OUT
BTFSC STATUS,C
GOTO ERROR_LED1
MOVLW B'11100001' ;BINARY DATA FOR -10dB STEP
MOVWF SENDVAL ;SEND THE VALUE OUT
CALL DATA_OUT
BTFSC STATUS,C
GOTO ERROR_LED1
BCF STATUS,C
CALL STOP ; STOP THE I2C OPERATION HERE
HERE
GOTO HERE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;; ------- START OF THE I2C ROUTINE -------- ;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START
BSF PORTC,SDA ;SET SDA HIGH
BSF PORTC,SCL ;SET SCL HIGH
BTFSS PORTC,SDA ;TEST SDA IF SET
CALL ERROR_LED2 ;NO GOTO ERROR_LED2
BSF STATUS,C ;YES SET THE CARRY BIT
BTFSS PORTC,SCL ;TEST SCL IF SET
CALL ERROR_LED3 ;NO GOTO ERROR LED3
BSF STATUS,C ;YES SET THE CARRY BIT
BSF PORTC,SDA ;SET SDA HIGH
BSF PORTC,SCL ;SET SCL HIGH
NOP
NOP ;WAIT
NOP
BCF PORTC,SDA ;MAKE SDA LOW
NOP
NOP ;WAIT
NOP
BCF PORTC,SCL ;MAKE SCL LOW
BTFSS STATUS,C ;TEST CARRY IF SET
CALL ERROR_LED4 ; NO THEN GOTO ERROR_LED4
BCF STATUS,C ;YES CLEAR THE CARRY BIT
RETURN ;RETURN
STOP
BCF PORTC,SDA ;MAKE SDA LOW
NOP
NOP ;WAIT
NOP
BSF PORTC,SCL ;SET SCL HIGH
NOP
NOP ;WAIT
NOP
BSF PORTC,SDA ;SET SDA HIGH
RETURN ;RETURN
DATA_OUT ;DATA OUT ROUTINE
MOVLW .8
MOVWF COUNTER ;MOVE 8 TO COUNTER FOR 8BITS
MOVF SENDVAL,W ;MOVE THE VALUE STORED IN SENDVAL TO WORKING REGISTER
RL
RLF SENDVAL,1
IORLW 0X00
BTFSS STATUS,C
GOTO NEXT
SETLOW
BCF PORTC,SDA
GOTO NEXT
NEXT
NOP
NOP
BSF PORTC,SCL
NOP
NOP
NOP
BCF PORTC,SCL
NOP
NOP
NOP
DECFSZ COUNTER
GOTO RL
BSF STATUS,RP0 ;BANK SELECT 1
MOVLW B'00000100' ;MAKE SDA AN INPUT
MOVWF TRISC ;FOR CHECKING THE RECIEVER'S ACKNOWLEDGE
BCF STATUS,RP0 ;BANK SELECT 0
NOP
NOP ;WAIT
NOP
BSF PORTC,SCL ;SET SCL HIGH
NOP
NOP ;WAIT
NOP
BCF PORTC,SCL ;MAKE SCL LOW
NOP
NOP ;WAIT
NOP
BTFSC PORTC,SDA ;TEST IF SDA IS LOW
GOTO ERROR_LED5 ;NO GOTO ERRROR_LED5
CALL ACK_LED ;YES GOTO ACK_LED
NOP
NOP
bcf PORTC,8 ;WAIT
NOP
RETURN
ERROR_LED
BCF PORTB,0
CALL DELAY
BSF PORTB,0
CALL DELAY
RETURN
ERROR_LED1
BCF PORTB,1
CALL DELAY
BSF PORTB,1
CALL DELAY
RETURN
ERROR_LED2
BCF PORTB,2
CALL DELAY
BSF PORTB,2
CALL DELAY
RETURN
ERROR_LED3
BCF PORTB,3
CALL DELAY
BSF PORTB,3
CALL DELAY
RETURN
ERROR_LED4
BCF PORTB,4
CALL DELAY
BSF PORTB,4
CALL DELAY
RETURN
ERROR_LED5
BCF PORTB,5
CALL DELAY
BSF PORTB,5
CALL DELAY
RETURN
ACK_LED
BCF PORTB,8
CALL DELAY
BSF PORTB,8
CALL DELAY
RETURN
DELAY
MOVLW 0X0F
MOVWF COUNT1
AGAIN
MOVLW 0XFF
MOVWF COUNT2
BACK1
MOVLW 0XFF
MOVWF COUNT3
BACK
DECFSZ COUNT3,F
GOTO BACK
DECFSZ COUNT2,F
GOTO BACK1
DECFSZ COUNT1,F
GOTO AGAIN
RETURN
END