'Config Word
Define CONFIG = 0x2f30

'Default PWM settings
'PWM Auto mode minimum duty
EEPROM 0, 0x00
EEPROM 1, 0x00
'PWM Manual mode duty
EEPROM 2, 0xff
EEPROM 3, 0x01
'PWM Status
EEPROM 4, 0x01

'Internal Oscillator Setup
OSCCON = %01110000
OSCTUNE = %00000000

'Const and Variable Setup
Dim data_register(15) As Byte
Dim register_pointer As Byte
Dim junk As Byte
Dim first As Bit
first = True
Const rx_elmnts = 15
Dim pwm_duty As Word
Dim pwm_auto_mode_min_duty As Word
Dim pwm_auto_mode_duty As Word
Dim pwm_manual_mode_duty As Word
Dim pwm_status As Byte
Dim sample As Word
Dim temp As Word
Dim i As Byte

'IO Setup
TRISA = %00011111
TRISB = %00010010

'Analog Setup
ADCON0 = 0x42
ADCON1 = 0xc0

'I2C Slave Setup
SSPADD = 0x70  'Compiler error? 0x70 = 0x38
SSPADD = ShiftLeft(SSPADD, 1)  'Shift left 1 bit to get the 0x70 address
SSPSTAT = 0x00
SSPCON = 0x36

'Interrupt Setup
PIE1.SSPIE = True
INTCON.PEIE = True
INTCON.GIE = True

'PWM Setup
'Read PWM Auto mode minimum duty
Read 0, data_register(0)
Read 1, data_register(1)
'Read PWM Manual mode duty
Read 2, data_register(2)
Read 3, data_register(3)
pwm_manual_mode_duty.LB = data_register(2)
pwm_manual_mode_duty.HB = data_register(3)
'Read PWM Status
Read 4, data_register(4)
PWMon 1, 1  'PWM:1 Mode:1  (PWM:468Hz/10bit @ Fosc:8MHz)

main:
	
	temp = 0
	For i = 1 To 64 Step 1
		Adcin 0, sample
		temp = temp + sample
	Next i
	temp = ShiftRight(temp, 6)
	data_register(5) = temp.LB
	data_register(6) = temp.HB
	pwm_auto_mode_duty = temp

	temp = 0
	For i = 1 To 64 Step 1
		Adcin 1, sample
		temp = temp + sample
	Next i
	temp = ShiftRight(temp, 6)
	data_register(7) = temp.LB
	data_register(8) = temp.HB

	temp = 0
	For i = 1 To 64 Step 1
		Adcin 2, sample
		temp = temp + sample
	Next i
	temp = ShiftRight(temp, 6)
	data_register(9) = temp.LB
	data_register(10) = temp.HB

	temp = 0
	For i = 1 To 64 Step 1
		Adcin 3, sample
		temp = temp + sample
	Next i
	temp = ShiftRight(temp, 6)
	data_register(11) = temp.LB
	data_register(12) = temp.HB

	temp = 0
	For i = 1 To 64 Step 1
		Adcin 4, sample
		temp = temp + sample
	Next i
	temp = ShiftRight(temp, 6)
	data_register(13) = temp.LB
	data_register(14) = temp.HB

	pwm_status = data_register(4)
	
	If pwm_status.0 = 1 Then
		pwm_duty = pwm_auto_mode_duty
		If pwm_duty < pwm_auto_mode_min_duty Then
			pwm_duty = pwm_auto_mode_min_duty
		Endif
		PWMduty 1, pwm_duty
	Else
		pwm_manual_mode_duty.LB = data_register(2)
		pwm_manual_mode_duty.HB = data_register(3)
		pwm_duty = pwm_manual_mode_duty
		PWMduty 1, pwm_duty
	Endif
	
	If pwm_status.1 = True Then
		Write 0, data_register(0)
		Write 1, data_register(1)
		Write 2, data_register(2)
		Write 3, data_register(3)
		pwm_status.1 = False
		Write 4, pwm_status
	Endif

	WaitMs 200

Goto main

End                                               

On Interrupt

If SSPSTAT.R_W = True Then  'master Read(r_w = 1)
	If SSPSTAT.D_A = False Then  'last Byte was an address (d_a = 0)
		SSPBUF = data_register(register_pointer)  'load with value from array
		register_pointer = register_pointer + 1
		SSPCON.CKP = True  'release clk
	Endif
	If SSPSTAT.D_A = True Then  'last Byte was data (d_a = 1)
		SSPBUF = data_register(register_pointer)  'load with value from array
		register_pointer = register_pointer + 1
		SSPCON.CKP = True  'release clk
	Endif
Endif

If SSPSTAT.R_W = False Then  'master Write(r_w = 0)
	If SSPSTAT.D_A = False Then  'last Byte was an address (d_a = 0)
		first = True  'last Byte was address, Next will be data location
		junk = SSPBUF  'Read buffer To clear BF
		SSPCON.CKP = True  'release clk
	Endif
	If SSPSTAT.D_A = True Then  'last Byte was data (d_a = 1)
		If first = True Then
			register_pointer = SSPBUF  'load index with array location
			first = False  'now clear this since we have location To Read from / Write To
		Else
			If register_pointer < rx_elmnts Then  'make sure index is Not out of range of array
				data_register(register_pointer) = SSPBUF  'load array with data
				register_pointer = register_pointer + 1
			Else
				junk = SSPBUF  'array location Not valid, discard data
			Endif
		Endif
		If SSPCON.WCOL = True Then  'did a Write collision occur?
			SSPCON.WCOL = False  'clear WCOL
			junk = SSPBUF  'dummy Read To clear BF Bit
		Endif
	SSPCON.CKP = True  'release clk
	Endif
Endif

PIR1.SSPIF = False

Resume                                            