Hjälp med delay till ds1820

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
sinus
Inlägg: 2
Blev medlem: 2 mars 2005, 08:48:26
Ort: Göteborg
Kontakt:

Hjälp med delay till ds1820

Inlägg av sinus »

Håller på och försöker få igång en ds1820 och har en hc12:a till hjälp, men eftersom tiderna är kritiska för det är 1-wire kommunikation så får jag det inte o fungera. Någon som kan hjälpa mig med tiderna?

Hjälp!
sinus
Inlägg: 2
Blev medlem: 2 mars 2005, 08:48:26
Ort: Göteborg
Kontakt:

Inlägg av sinus »

Bifogar koden oxå, vet inte om jag gjrt helt rätt i den?

#include "HS12_DG.h"
#include "reg_macro.h"

void delay(unsigned int uSec);

//PTP DATABITAR
//PORTB STYRSIGNAL

#define data 0x80
#define rom_skip 0xCC
#define mem_conv 0x44
#define read_mem 0xBE

void main()
{
unsigned char state=0x00;
unsigned char i;
unsigned char cmd;
unsigned char cmd_state;
unsigned char result_tmp;


/*******init*******/

REG8(DDRP) =0xff; //out
REG8(PTP) =0x00; //nollställ
cmd_state =0x00;
state =0x00;

while(1)
{
REG8(DDRA)=0xff; //TEST
REG8(PORTA)|=0x01; //TEST
switch(state)
{
/*******Reset*******/

case 0x00:
REG8(DDRB) |= data; //data out

REG8(PORTB)&=~ data; //data = 0
delay(500);
state=0x01;

break;

/*******Precence*******/

case 0x01:
REG8(DDRB) &=~data; //data in på 0x80
delay(20); //precence puls 60-240uS

if(REG8(PORTB) & data ==0)
state=0x02;
else
state=0x00;
REG8(PORTA)|=0x02; //TEST
break;

/*******Wait*******/

case 0x02:
REG8(PORTA)|=0x04; //TEST
i=0x01;
cmd=rom_skip;
delay(420);

state=0x03;
break;

/*******Write command*******/

case 0x03:
if(i!=0x00)
{
if(cmd & i==0) //write 0
{
REG8(DDRB) |=data; //data utport
REG8(PORTB) &=~data; //data = 0
delay(60);
REG8(DDRB) &=~data; //Z
delay(5); //delay 65us
}
else //write 1
{
REG8(DDRB) |=data;
REG8(PORTB) &=~data;
delay(5);
REG8(DDRB) &=~data; //Z
delay(60); //delay 65us
}
i<<=1;
}
else
{
switch(cmd_state)
{
case 0x00:
cmd=mem_conv;
break;
case 0x01:
cmd=rom_skip;
state = 0x04;
break;
case 0x02:
cmd=read_mem;
break;
case 0x03:
cmd=rom_skip;
state = 0x05;
break;
default:state=0x00;
}

if(cmd_state==0x03)
cmd_state=0x00;
else
cmd_state++;

i=0;
}
break;

/*******Wait for conversion done*******/

case 0x04:
REG8(DDRB) &=~data; //in
while(REG8(PORTB) & data ==0)
;

state=0x00;
break;

/*******Read and display*******/

case 0x05:
i=0x01;
REG8(DDRB) |= data; //data out
REG8(PORTB) &=~ data; //data = 0
delay(2);

REG8(DDRB) &=~data; //data in
delay(11);

if(REG8(PORTB) & data==1)
result_tmp |= i;
else
result_tmp &=~ i;

//result_tmp & i = REG8(PORTB) & data;
delay(62);

if(i!=0x00)
i<<=1;
else
{
state=0x00;
REG8(PTP)=result_tmp;
}
break;

default:state=0x00;
}
}
}
void delay(unsigned int uSec)
{
unsigned int i;

for(i=0; i<uSec; i++)
;
}
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Och vari består problemet?

Jag använder själv DS18S20 utan problem fast i början var det knepigt. Jag kom sedan på efter att ha lusläst databladet att när jag hade kommanderat en konvertering och den var klar skulle jag skicka en reset-puls varefter jag kunne läsa värdet, sedan fungerade det perfekt.

Jag har inte upplevt tiderna som kritiska, det finns vissa min. och max. tides som ska hållas men det är allt, faktisk är de ganska "breda" och förlåtande.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Det här är en ren chansning, men vet du om din delay fungerar?

För med en smart kompilator så kan det hända att den där for-loopen helt enkelt optimeras bort.
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Just det cyr: jag hade problem med en time-out som aldrig hände och anledningen var just att den blev optimerat bort.

Jag löste dock problemet vid att deklarera timeout-räknaren som volatile, sedan fungerade det. Men jag tror i detta läge att delayen fungerar, det finns ju bara en enda grej att göra i delay-loopen och den kan inte gärna optimeras bort.
Skriv svar