 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
| Poglej prejšnjo temo :: Poglej naslednjo temo |
| Avtor |
Sporočilo |
vulgaris Neznanec

Pridružen-a: Tor 25 Mar 2008 19:37 Prispevkov: 7 Aktiv.: 0.03 Kraj: prlekija
|
Objavljeno: Tor Sep 06, 2011 11:32 am Naslov sporočila: ds 1820 na pic mikrokontrolerju |
|
|
Pozdravljeni, trenutno se ukvarjam z temperaturno regulacijo. Zadeve pridno delujejo z senzorjem lm35, vendar želim preklopiti na ds1820. Imam vzorčni program za uporabo omenjenega senzorja ( ds1820) kateri deluje in izmerjeno temperaturo pokaže na lcd-ju, težava pa se pojavi ko hočem še kaj drugega kot samo gledati izmerjrno temp. na lcd-ju. Na primer vklopiti ledico na nekem pinu ob določeni temperaturi ( termostat).
Da poenostavim: kako temperaturo ki jo pokaže lcd "zapakirati " v neko spremenljivko katero bi potem nadalje uporabljal. uporabljam picbasicpro.
Vzorec kode:
' Picbasic Pro program to read DS1820 1-wire temperature sensor
' and display temperature on LCD
' Define LCD pins
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
' Allocate variables
command var byte ' Storage for command
i var byte ' Storage for loop counter
temp var word ' Storage for temperature
DQ var PORTC.0 ' Alias DS1820 data pin
DQ_DIR var TRISC.0 ' Alias DS1820 data direction pin
ADCON1 = 7 ' Set PORTA and PORTE to digital
Low PORTE.2 ' LCD R/W line low (W)
Pause 100 ' Wait for LCD to start
Lcdout $fe, 1, "Temp in degrees C"' Display sign-on message
' Mainloop to read the temperature and display on LCD
mainloop:
Gosub init1820 ' Init the DS1820
command = $cc ' Issue Skip ROM command
Gosub write1820
command = $44 ' Start temperature conversion
Gosub write1820
Pause 2000 ' Wait 2 seconds for conversion to complete
Gosub init1820 ' Do another init
command = $cc ' Issue Skip ROM command
Gosub write1820
command = $be ' Read the temperature
Gosub write1820
Gosub read1820
' Display the decimal temperature
Lcdout $fe, 1, dec (temp >> 1),".",dec(temp.0 * 5)," degrees C"
Goto mainloop ' Do it forever
' Initialize DS1820 and check for presence
init1820:
Low DQ ' Set the data pin low to init
Pauseus 500 ' Wait > 480us
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 100 ' Wait > 60us
If DQ = 1 Then
Lcdout $fe, 1, "DS1820 not present"
Pause 500
Goto mainloop ' Try again
Endif
Pauseus 400 ' Wait for end of presence pulse
Return
' Write "command" byte to the DS1820
write1820:
For i = 1 to 8 ' 8 bits to a byte
If command.0 = 0 Then
Gosub write0 ' Write a 0 bit
Else
Gosub write1 ' Write a 1 bit
Endif
command = command >> 1 ' Shift to next bit
Next i
Return
' Write a 0 bit to the DS1820
write0:
Low DQ
Pauseus 60 ' Low for > 60us for 0
DQ_DIR = 1 ' Release data pin (set to input for high)
Return
' Write a 1 bit to the DS1820
write1:
Low DQ ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 60 ' Use up rest of time slot
Return
' Read temperature from the DS1820
read1820:
For i = 1 to 16 ' 16 bits to a word
temp = temp >> 1 ' Shift down bits
Gosub readbit ' Get the bit to the top of temp
Next i
Return
' Read a bit from the DS1820
readbit:
temp.15 = 1 ' Preset read bit to 1
Low DQ ' Start the time slot
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
If DQ = 0 Then
temp.15 = 0 ' Set bit to 0
Endif
Pauseus 60 ' Wait out rest of time slot
Return
Najlepsa hvala za kakršen koli preedlog.
End _________________ nikoli ni prepozno |
|
| Nazaj na vrh |
|
 |
gkrusi Član



Pridružen-a: Tor 24 Jul 2007 17:22 Prispevkov: 812 Aktiv.: 3.56 Kraj: Ptuj
|
Objavljeno: Tor Sep 06, 2011 12:55 pm Naslov sporočila: |
|
|
Jaz uporabljam tole kodo in mi v float obliki vrne temperaturo. Je pa za CCS C compiler, tako da boš jo moral predelati. Morda vseeno kaj koristi.
| Koda: |
int n;
int1 ds18b20_initialization();
void ds18b20_write_byte(int8 B);
int8 ds18b20_read_byte(void);
void call_device(int address[8])
{
ds18b20_initialization();
ds18b20_write_byte(0x55);
for (n=0; n<8; n++)
{
ds18b20_write_byte(address[n]);
}
}
int1 ds18b20_initialization(void){
int1 ready;
output_low(DS18B20_IO);
delay_us(488); //min 480us
output_float(DS18B20_IO);
delay_us(60); //15 - 60us da se naprava odzove
ready=!input(DS18B20_IO);
delay_us(424);
return ready;
}
void ds18b20_write_bit(int8 b){
output_low(DS18B20_IO);
if(b == 1){
delay_us(2); //min 1
output_float(DS18B20_IO);
}
delay_us(125);
output_float(DS18B20_IO);
}
void ds18b20_write_byte(int8 B)
{
int8 i, aux;
//output_high(PIN_A);
for(i=0; i<8; i++){
aux = B >> i; //aux equals B shifted i times to the right
aux &= 0x01; //least significant bit survives
ds18b20_write_bit(aux);
}
delay_us(120);
//output_low(PIN_A1);
}
int1 ds18b20_read_bit(void){
output_low(DS18B20_IO);
delay_us(2); //min 1us
output_float(DS18B20_IO);
delay_us(8);
return(input(DS18B20_IO)); //next a delay of 60 to 120us must be done!
}
int8 ds18b20_read_byte(void){
int8 i, result=0x00;
//output_high(PIN_A0);
for(i=0; i<8; i++){
if(ds18b20_read_bit())
result |= (0x01 << i);
delay_us(125);
}
//output_low(PIN_A0);
return result;
}
void zahtevajNaslov(int address[8])
{
int i;
ds18b20_initialization();
ds18b20_write_byte(0x33);
for(i=0; i<8; i++)
{
address[i] = 1;
address[i] = ds18b20_read_byte();
}
ds18b20_write_byte(0x44); // zahteva meritev temperature
}
void izmeri_temp_A() //int deviceN[]) // zahteva meritev
{
int i;
ds18b20_initialization(); // resetira senzorje
ds18b20_write_byte(0xCC); // izbere vse naprave
// call_device(deviceN);
ds18b20_write_byte(0x44); // zahteva meritev temperature
}
float izmeri_temp_B(int deviceN[8]) // prebere meritev
{
int8 i=0;
int8 scratchpad_data[9];
signed int16 temp=0;
for(i=0; i<9; i++) { scratchpad_data[i] = 0x00; } // inicializacija 1-wire senzorjev
call_device(deviceN);
ds18b20_write_byte(0xBE); // zahteva scratch pad
for(i=0; i<9; i++) scratchpad_data[i]=ds18b20_read_byte();
temp = (int)((make16(scratchpad_data[1], scratchpad_data[0]))/2);
return ((float)temp - (float)0.25 + (float)((float)(scratchpad_data[7]-scratchpad_data[6])/(float)scratchpad_data[7]));
} |
_________________ Zakaj bi bilo preprosto, če je lahko zakomplicirano??? |
|
| Nazaj na vrh |
|
 |
vulgaris Neznanec

Pridružen-a: Tor 25 Mar 2008 19:37 Prispevkov: 7 Aktiv.: 0.03 Kraj: prlekija
|
Objavljeno: Tor Sep 06, 2011 5:29 pm Naslov sporočila: |
|
|
hvala za odgovor ampak se zame programska jezika prevec razlikujeta. prosil bi, da me nekdo usmeri na pravo pot, namreč problem je samo to da ne vem kako bi iz rezultata ds senzorja v bin obliki dobil rezultat v decimalni obliki in to shranil v neko variablo.
hvala _________________ nikoli ni prepozno |
|
| Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.15
|
Objavljeno: Tor Sep 06, 2011 5:48 pm Naslov sporočila: |
|
|
V basicu sicer picev nisem nikoli programiral ampak v tvojem programu ne najdem dela, ki bi preklapljal kako ledico. Pripel si samo demo, ki izpisuje temperaturo na LCD. Drugače pa je spremenljivka temp tista, ki vsebuje vrednost izmerjene temperature. Če veš koliko je temp, potem res ni težko vklopit in izklopit lediko pri eni fiksni vrednosti. Žal ne vem kako se v basicu to napiše, ampak kar rabiš storiti, je v inicializaciji definirat pin na katerem je ledika kot output (TRISX,Y = 0) ter ga postavit na 0 (PORTX,Y = 0) ter definirat konstanto pri kateri želiš preklop.
Kasneje pri primerjavi vrednosti temp in konstante postaviš s pogojnim stavkom LED na 1 ali 0.
Upam, da je opis razumljiv...
Če ne ti pa bo kakšen basic programer naprej pomagal. _________________ LP, Matjaž |
|
| Nazaj na vrh |
|
 |
vulgaris Neznanec

Pridružen-a: Tor 25 Mar 2008 19:37 Prispevkov: 7 Aktiv.: 0.03 Kraj: prlekija
|
Objavljeno: Tor Sep 06, 2011 6:56 pm Naslov sporočila: |
|
|
hvala za post, ocitno sem se napacno izrazil, to je demo program ja, v njem res ni nobenega stavka za preklop ledice ali cesa drugega, niti ni problem v tem, problem se pojavi ker varibla temp enostavno ne deluje, verjetno je rezultat v binarni oblik,i jaz pa rabim decimalni zapis.
"moji poizkus uporabe temp variable:
if temp>20 then vklop
.
.
.
vklop:
high portb.1
.
.
""
kaki predlogi? _________________ nikoli ni prepozno |
|
| Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Tor Sep 06, 2011 7:08 pm Naslov sporočila: |
|
|
Malo poglej, v kaki obliki senzor pošilja temperaturo... vrednost spremenljivke "temp" ni direktno temperatura v stopinjah  _________________ Tule nisem več aktiven. |
|
| Nazaj na vrh |
|
 |
vulgaris Neznanec

Pridružen-a: Tor 25 Mar 2008 19:37 Prispevkov: 7 Aktiv.: 0.03 Kraj: prlekija
|
Objavljeno: Sre Sep 07, 2011 7:11 am Naslov sporočila: |
|
|
ja to mi je jasno da temp ni direktna spremenljivka, dal sem samo primer kako bi spremenljivko uporabil. senzor poda temp v binarni obliki. v gornjem demo programu je ze pretvorjena in jo lcd izpise, jaz bi rabil samo kako spremenljivko dec (temp >> 1) pretvorim v uporabno obliko, saj if stavek z dec (temp >> 1) spremenljivko ne deluje. Rabil bi nekaj podobnega kot " senz=dec (temp >> 1), tako da bi potem spremenljivko senz uporabil v if stafku .
upam da je bolj razumljivo.
Hvala _________________ nikoli ni prepozno |
|
| Nazaj na vrh |
|
 |
gumby Član


Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 17.60
|
Objavljeno: Sre Sep 07, 2011 7:32 am Naslov sporočila: |
|
|
Kaj je "binarno"?
Poglej datasheet od senzorja, kjer lepo piše, kaj kateri bit pomeni. Ko boš to vedel, ti tudi ne bo več problem pretvorit v kako drugo obliko. Ali pa kar direktno primerjavo naredit v if(), kot si v prejšnjem primeru naredil, samo cifra mora biti prava.
"20" pomeni +1,25 stopinje in ne +20 stopinj, kot si pričakoval  _________________ Tule nisem več aktiven. |
|
| Nazaj na vrh |
|
 |
vulgaris Neznanec

Pridružen-a: Tor 25 Mar 2008 19:37 Prispevkov: 7 Aktiv.: 0.03 Kraj: prlekija
|
Objavljeno: Sre Sep 07, 2011 8:48 am Naslov sporočila: |
|
|
Hvala na namigu, zadeva ze nekoliko bolj jasna in deluje, vsaj v proteusu ).
Najlepsa hvala. _________________ nikoli ni prepozno |
|
| Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 232 dni
Powered by phpBB © 2001, 2005 phpBB Group
|