1 | '****************************************************************
|
2 | #CONFIG
|
3 | __CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _MCLRE_OFF & _FCMEN_OFF
|
4 | __CONFIG _CONFIG2, _PLLEN_ON & _WRT_OFF & _STVREN_OFF & _BOREN_OFF
|
5 | #ENDCONFIG
|
6 |
|
7 | DEFINE OSC 16
|
8 | OSCCON = %01111010
|
9 |
|
10 | ' Alias I2C pins
|
11 | scl VAR PORTB.4 ' I2C clock input
|
12 | sda VAR PORTB.1 ' I2C data input
|
13 |
|
14 | ' Define used register flags
|
15 | SSPIF VAR PIR1.3 ' SSP (I2C) interrupt flag
|
16 | BF VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
|
17 | R_W VAR SSPSTAT.2 ' SSP (I2C) Read/Write
|
18 | D_A VAR SSPSTAT.5 ' SSP (I2C) Data/Address
|
19 |
|
20 | CKP VAR SSPCON1.4 ' SSP (I2C) SCK Release Control
|
21 | SSPEN VAR SSPCON1.5 ' SSP (I2C) Enable
|
22 | SSPOV VAR SSPCON1.6 ' SSP (I2C) Receive Overflow Indicator
|
23 | WCOL VAR SSPCON1.7 ' SSP (I2C) Write Collision Detect
|
24 |
|
25 | ' Define constants
|
26 | I2Caddress CON 2 ' Make our address 2
|
27 |
|
28 | ' Allocate RAM
|
29 | result VAR BYTE ' ADC result
|
30 | datain VAR BYTE ' Data in
|
31 | dataout VAR BYTE[8] ' Data out array
|
32 | readcnt VAR BYTE ' I2C read count
|
33 |
|
34 | '-----------------------------------------------------------------------
|
35 |
|
36 | DEFINE ADC_BITS 10
|
37 | DEFINE ADC_SAMPLEUS 50
|
38 | 'DEFINE ADC_CLOCK 3
|
39 |
|
40 | ADCON0 = %00000001
|
41 | ADCON1 = %01100011
|
42 | TRISA.0 = 1
|
43 | 'TRISA = %00000001
|
44 | FVRCON = %11000001
|
45 | ANSELA = %00000001
|
46 |
|
47 |
|
48 | ' Initialize I2C slave mode
|
49 | SSPADD = I2Caddress ' Set our address (Bit 7-1 = Adress, 0 = unused)
|
50 | SSPCON2 = 0 ' General call address disabled
|
51 | SSPCON1 = $36 ' Set to I2C slave with 7-bit address
|
52 | ' 0011 0110 = 0x36
|
53 |
|
54 | readcnt = 0 ' Zero counter
|
55 |
|
56 | dataout[0] = "A" ' Preset output data to "ADC= "
|
57 | dataout[1] = "D"
|
58 | dataout[2] = "C"
|
59 | dataout[3] = "="
|
60 | dataout[4] = "0"
|
61 | dataout[5] = "0"
|
62 | dataout[6] = "0"
|
63 | dataout[7] = "0"
|
64 |
|
65 | GoTo mainloop ' Skip over subroutines
|
66 |
|
67 |
|
68 | ' SSPBUF = SSP1BUF = ein Empfangs- und Sendebuffer (1 Byte/8 Bit)
|
69 |
|
70 | '-----------------------------------------------------------------------
|
71 | i2cslave: ' I2C slave subroutine
|
72 | '-----------------------------------------------------------------------
|
73 | SSPIF = 0 ' Clear interrupt flag PIR1.3
|
74 | 'SSPIF: Master Synchronous Serial Port Interrupt Flag bit
|
75 | ' 1 = The transmission/reception is complete
|
76 | ' 0 = Waiting to transmit/receive
|
77 |
|
78 | IF ( R_W = 1 ) Then i2crd ' Read data from us
|
79 | IF ( BF = 0 ) Then i2cexit ' Nothing in buffer so exit
|
80 | IF ( D_A = 1 ) Then i2cwr ' Data for us (not address)
|
81 | IF ( SSPBUF != I2Caddress ) Then i2cexit ' Clear the address from the buffer
|
82 | readcnt = 0 ' Mark as first read
|
83 | Return
|
84 |
|
85 |
|
86 | '-----------------------------------------------------------------------
|
87 | i2cwr: ' I2C write data to us
|
88 | '-----------------------------------------------------------------------
|
89 | datain = SSPBUF ' Put data into array
|
90 | Return
|
91 |
|
92 |
|
93 | '-----------------------------------------------------------------------
|
94 | i2crd: ' I2C read data from us
|
95 | '-----------------------------------------------------------------------
|
96 | IF ( D_A = 0 ) Then
|
97 | readcnt = 0 ' Mark as first read
|
98 | EndIF
|
99 |
|
100 | SSPBUF = dataout[readcnt] ' Get data from array
|
101 | CKP = 1 ' Release SCL line
|
102 | readcnt = readcnt + 1 ' Move along read count
|
103 | Return
|
104 |
|
105 |
|
106 | '-----------------------------------------------------------------------
|
107 | mainloop: ' Main program loop
|
108 | '-----------------------------------------------------------------------
|
109 |
|
110 | IF ( SSPIF = 1 ) Then ' Check for I2C interrupt flag
|
111 | GoSub i2cslave
|
112 | EndIF
|
113 |
|
114 | ADCIN 0, result ' Read ADC channel 0
|
115 |
|
116 | dataout[4] = result
|
117 |
|
118 | GoTo mainloop ' Do it all forever
|
119 | End
|
120 |
|
121 | '-----------------------------------------------------------------------
|