[pic] i2c slave

beste mensen ik heb een stukje van basic omgeschreven naar C:
basic code:

code:


' Alias pins
		Symbol SCL = PORTC.3         			' I2C clock input
		Symbol SDA = PORTC.4         			' I2C data input

' Define used register flags
		Symbol SSPIF	PIR1.3          	' SSP (I2C) interrupt flag
		Symbol BF		SSPSTAT.0       	' SSP (I2C) Buffer Full
		Symbol R_W		SSPSTAT.2       	' SSP (I2C) Read/Write
		Symbol D_A		SSPSTAT.5       	' SSP (I2C) Data/Address
		Symbol CKP		SSPCON.4        	' SSP (I2C) SCK Release Control
		Symbol SSPEN	SSPCON.5        	' SSP (I2C) Enable
		Symbol SSPOV	SSPCON.6        	' SSP (I2C) Receive Overflow Indicator
		Symbol WCOL		SSPCON.7        	' SSP (I2C) Write Collision Detect

' Allocate RAM
		Dim datain  as     Byte        		' Data in 
		Dim dataout as     Byte        		' Data out 
        
'------------------------------------------------------------------------------------
        Goto main           				' Jump over the subroutines
'------------------------------------------------------------------------------------

' I2C slave subroutine
i2cslave:
        SSPIF = 0               			' Clear interrupt flag
        If R_W = 1 Then i2Crd   			' Read data from bus
        If BF = 0 Then Return  				' Nothing in buffer so exit
        If D_A = 1 Then i2cwr   			' Data for bus (not address)
        If SSPBUF != 2 Then Return     		' Clear the address from the buffer
        Return
'------------------------------------------------------------------------------------
' I2C write data to bus
i2cwr:	datain = SSPBUF       				' Put data into datain
        Return
'------------------------------------------------------------------------------------
' I2C read data from bus
i2crd:  SSPBUF = datain       				' Get data from datain
        CKP = 1                 			' Release SCL line
		Return
'------------------------------------------------------------------------------------
' Main program loop
Main:        
' Initialise ports and directions
        ADCON1 = 7              			' All PORTA, PORTE pins to digital

' Initialise I2C slave mode
        SSPADD = 2              			' Make our address 2
        SSPCON2 = 0             			' General call address disabled
        SSPCON = $36            			' Set to I2C slave with 7-bit address
        
Again:  If SSPIF = 1 Then Gosub i2cslave	' Check for I2C interrupt

' Clear any I2C collisions or errors
        SSPOV = 0
        WCOL = 0
        Goto Again           				' Do it all forever

en dit is de C code geworden.

code:


#define SCL = PORTC.3
#define SDA = PORTC.4

#define SSPIF  PIR1.F3
#define BF		SSPSTAT.F0
#define SSP (I2C) Read/Write
#define D_A		SSPSTAT.F5
#define CKP		SSPCON.F4
#define SSPEN	SSPCON.F5
#define SSPOV	SSPCON.F6
#define WCOL		SSPCON.F7

void init(void)
{
PORTA = 0;
PORTB = 0;
PORTC = 0;
TRISA = 0;
TRISB = 0;
TRISC = 255;
ADCON1 = 7;
SSPADD = 2;
SSPCON2 = 0;
SSPCON = 0x36;
}


char datain;
char dataout;

void i2cwr(void)
{
	datain = SSPBUF;
  PORTA = 255;
}

void i2crd(void)
{
  SSPBUF = datain;
        CKP = 1;
        PORTA = 255;
}

void i2cslave(void)
{
        SSPIF = 0;
        if(R_W == 1) i2crd;
        if(BF == 0) return;
        if(D_A == 1)i2cwr;
        if(SSPBUF != 2) return;
}


void main(void)
{
init();
while(1)
{
if(SSPIF == 1) i2cslave;
  SSPOV = 0;
  WCOL = 0;
}
}

maar het werkt niet
wat kan er fout zijn.

het betreft een 16F737 die op zijn interne oscilator draait. de master is een gelijk type die ook op interne osc draait.

ik zal straks even de source van de master er ook bij zetten.

gebruikte compiler:
MikroC voor PIC

/edit
schakeling is opgebouwd op een breadboard
voeding is een labvoeding
ontkoppeling van de pic is aangedacht.
de i2c pinnen hebben pullup weerstanden zowel op sck als sda

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

Werkte de BASIC code wel?

Volgend project: funcgen met ad9833 afmaken...

dat was een van de sample codes van proton
en ik geen proton bij de hand heb kan ik dat dus ff niet checken.

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

basic code werkt ook niet

maar ik heb inmiddels wat nieuwe source gevonden die hoogst waarschijnlijk wel wekrt(ofwel ik moet hem nog aanpassen naar mijn wensen maar het heeft wel potentie).

http://www.mikroe.com/forum/viewtopic.php?t=8106&highlight=i2c+sla…

[Bericht gewijzigd door timmie op zondag 5 juli 2009 21:14:03 (16%)

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

Moet het niet i2crd() zijn ipv i2crd?

dat zou je zeggen inderdaad maar daar had ik al aan gedacht.
en maakte niks uit.

echter heb ik nog wel een vraagje over i2c

als ik het goed snap kan ik zolang ik geen stopconditie of herstart conditie verzend gewoon data naar 1 slave toe schuiven zonder continu het adress te moeten zenden toch?

niet met me uitspraken(of opmerkingen) eens mail me.K8048 guide

F_E heeft flink wat geschreven over i2c. Zeker de moeite waard om eens te lezen

http://www.proto-labs.com/