|
|
View previous topic :: View next topic |
Author |
Message |
Geust Guest
|
aj.. 1wire me baby |
Posted: Sat Apr 30, 2005 3:37 pm |
|
|
Hey, I change my code,
but it still doesnt work !
can you take a look on my code :
Code: | #include <16f870.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOLVP
#define SKIP_ROM 0xCC
#define CONVERT_T 0x44
#define READ_SCRATCHPAD 0xBE
#define DQ PIN_C4
//#define Tx_DS1820 PIN_C5
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
//////////////////////////////////////////////////////////////////////////////
// OW_RESET - performs a reset on the one-wire bus and
// returns the presence detect. Reset is 480us, so delay
// value is (480-24)/16 = 28.5 - we use 29. Presence checked
// another 70us later, so delay is (70-24)/16 = 2.875 - we use 3.
//
unsigned char ow_reset(void)
{
unsigned char presence;
output_low(DQ); //pull DQ line low
delay_us(480); // leave it low for 480us
input(DQ); // allow line to return high
delay_us(70); // wait for presence
presence = DQ; // get presence signal
delay_us(424); // wait for end of timeslot
return(presence); // presence signal returned
} // 0=presence, 1 = no part
//////////////////////////////////////////////////////////////////////////////
// READ_BIT - reads a bit from the one-wire bus. The delay
// required for a read is 15us, so the DELAY routine won't work.
// We put our own delay function in this routine in the form of a
// for() loop.
//
unsigned char read_bit(void)
{
unsigned char i;
output_low(DQ); // pull DQ low to start timeslot
input(DQ);// then return high
for (i=0; i<3; i++); // delay 15us from start of timeslot
return(DQ); // return value of DQ line
}
//////////////////////////////////////////////////////////////////////////////
// WRITE_BIT - writes a bit to the one-wire bus, passed in bitval.
//
void write_bit(char bitval)
{
output_low(DQ); // pull DQ low to start timeslot
if(bitval==1) input(DQ); // return DQ high if write 1
delay_us(104); // hold value for remainder of timeslot
input(DQ);
}// Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us
//////////////////////////////////////////////////////////////////////////////
// READ_BYTE - reads a byte from the one-wire bus.
//
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(read_bit()) value|=0x01<<i; // reads byte in, one byte at a time and then
// shifts it left
delay_us(120); // wait for rest of timeslot
}
return(value);
}
//////////////////////////////////////////////////////////////////////////////
// WRITE_BYTE - writes a byte to the one-wire bus.
//
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
temp = val>>i; // shifts val right 'i' spaces
temp &= 0x01; // copy that bit to temp
write_bit(temp); // write bit in temp into
}
delay_us(104);
}
void main()
{
char get[10];
int k;
char temp_f,temp_c;
while(1)
{
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
delay_us(104);
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
for (k=0;k<9;k++)
{ get[k]=read_byte();
}
printf("\n ScratchPAD DATA = %X%X%X%X%X\n",get[8],get[7],get[6],get[5],get[4],get[3],get[2],get[1],get[0]);
}
} |
whats wrong??
Thx |
|
|
burned Guest
|
|
Posted: Sun May 01, 2005 9:36 am |
|
|
I spent 2 1/2 weeks beating my head on trying to get the 1820 to work.
I tried every code segment on this board -- and there are a lot --'just search the forum and you'll find it" -- yeah, you'll find em - lots of em.
BUT -- I got it working last nite. I finally narrowed it down to : CCS compiler does NOT do accurate timing with delay_us
the problem was not the code but the TIMING.
I added a local segment for us delay from some web site (could have been this one -- I spent so much time searching the web for 'working' code for this -- i lost track of what is from where)
Code: |
#define XTAL_FREQ 20MHZ /* Crystal frequency in MHz */
#define MHZ *1000L /* number of kHz in a MHz */
#define delayus(x) { unsigned char _dcnt; \
_dcnt = (x)*((XTAL_FREQ)/(12MHZ)); \
while(--_dcnt != 0) \
continue; }
|
then I replace all the ccs delay_us with the local function delayus and WHAM the code works -- in fact they all started working when I substituted the delay funciton.
The one I have listed has code to deal with the slower clock speeds (like your 4 mhz ) and I chopped that out -- so this prob won't work for you, but the deal is TIMING ! us timing.
find a us delay function for your clock speed to use instead of the library funciton.
good luck |
|
|
geust Guest
|
|
Posted: Sun May 01, 2005 11:58 am |
|
|
finally some good news!!
Thx,
but how can I create a function that gives me uSeconds???
I'm just a rookie,sorry..
and I dont know how to creat a uSecond Segment
Please help
Thanks |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun May 01, 2005 4:26 pm |
|
|
Quote: | BUT -- I got it working last nite. I finally narrowed it down to : CCS compiler does NOT do accurate timing with delay_us |
It always helps a lot when you mention the compiler version you are using.... See the thread http://www.ccsinfo.com/forum/viewtopic.php?t=19516 for the description of a delay_us() bug in v3.191 - 3.202, causing delays larger than 153 to fail. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|