Quoting "Laurent FAILLIE" <l_fail...@yahoo.com>:

> Thanks Robert for your mail : I'll certainly use you code for my  
> PICs haven't I2C hardware.
>
> Pic 16F88 have the needed hardware and I did notice those function  
> in libio lib.
> But my question is more having a full example, from 0 to a workable  
> tiny application :
> - initialization to do,
> - choregraphy
> - checks
>
> Thanks
>
> Laurent

Hello Laurent,

It's a long long time since I programmed all of this, but the  
I2C-specific initialation that I used (for running a PIC16F886 as I2C  
master) looks like this, some of it may be unnecessary, but I added  
them to be on the safe side. I now regret not commenting the code more  
thorougly... I do not, however, have any experience with the 16F88,  
but as I understand it, it should be almost the same as 16F88X  
series...? At least the registers seem to have the same names.

{
   TRISC3=1;
   TRISC4=1;
   SMP=1;
   WCOL=0;
   SSPOV=0;
   SSPEN=1;
   CKP=1;
   SSPCON=SSPCON&0xf0;
   SSPCON=SSPCON|0x08;
   GCEN=0;
   ACKSTAT=0;
   ACKDT=0;
   ACKEN=0;
   RCEN=0;
   PEN=0;
   RSEN=0;
   SEN=0;
   SSPADD=15;
}


Basicly what I did was just read the PIC datasheet really carefylly  
and set all the relevant registers I could find, I never used any  
library functions for anything.
For the 16F886:
SSPSTAT contains the various flags to check.
SSPCON contains the registers to set, and most stuff that follows  
SSPCON in the above code are part of the SSPCON2 register.


Then I just sit and wait for an external interrupt that makes the  
program read out one byte from the slave, in this case a 1Hz square  
wave output from the RTC DS1337 which triggers the PIC to read out the  
clocktime from the RTC.

void RTCputc(unsigned char addr, unsigned char c_data)

{
   unsigned char c;
   c=(RTC_ADDR<<1)&0xfe;;  // recalculate the I2C address & write bit
   I2Cstart();
   I2Cwrite(c);      // send the RTC address to the bus
   I2Cwrite(addr);   // send the RTC internal memory location
   I2Cwrite(c_data); // send the data to that location
   I2Cstop();
}


unsigned char RTCgetc(unsigned char addr)
{
   unsigned char c;
   c=(RTC_ADDR<<1)&0xfe; // recalculate the I2C address & write bit
   I2Cstart();
   I2Cwrite(c);        // Send the RTC's I2C address
   I2Cwrite(addr);     // RTC internal memory location to be read
   I2Crestart();
   c=c|0x01;           // swap the Read/write bit
   I2Cwrite(c);        // resend the address
   c=I2Cread(0);       // read one byte, passing the ACK/NAK bit
   I2Cstop();
   return(c);
}

I hope I answered the right question this time :o)
If you want, I could send the entire project as a .tar.gz, it's a  
school project and contains no secrets, only perhaps bad ideas :o)

Best Regards, Robert

------------------------------------------------------------------------------
This SF.net email is sponsored by Sprint
What will you do first with EVO, the first 4G phone?
Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to