Sida 1 av 1
Hjälp med delay till ds1820
Postat: 2 mars 2005, 08:51:58
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!
Postat: 2 mars 2005, 08:53:36
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++)
;
}
Postat: 2 mars 2005, 10:42:19
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.
Postat: 2 mars 2005, 13:32:55
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.
Postat: 2 mars 2005, 14:14:44
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.