www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Merjenje temperature s PIC in Dallasovimi senzorji

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
NUFAN
Član
Član



Pridružen-a: Pon 05 Apr 2004 21:39
Prispevkov: 947
Aktiv.: 4.00
Kraj: Žalec

PrispevekObjavljeno: Sre Jan 06, 2010 4:12 pm    Naslov sporočila:  Merjenje temperature s PIC in Dallasovimi senzorji Odgovori s citatom

Delam merilni sistem za merjenje temperature s PIC-em in Dallasovimi temperaturnimi senzorji DS18x20. Cilj je narediti čimbolj univerzalen merilni sistem, ki bo omogočal priklop množice temperaturnih senzorjev.

Opis merilnega sistema:

Sistem je sestavljen iz PIC-a, LCD-ja in tipkovnice. Ob vklopu naprave mora sistem vse priključene senzorje na 1wire vodilu avtomatsko zaznati ter za vse na novo priključene senzorje zahtevati, da jim s pomočjo tipkovnice določimo ime (npr. Senzor 1, senzor 2,...), njihove ID-je pa shraniti v EEPROM.
Če se omejim na tri senzorje. Torej, ob čisto prvem vklopu naprave bodo vsi trije priključeni senzorji "novi", zato bo sistem od nas zahteval, da za vse izberemo ime, njihove ID-je pa shranil v EEPROM. Ob naslednjem vklopu pa mora ugotoviti, če je kakšen senzor na novo priključen in samo za tega zahtevati, da izberemo ime, v nasprotnem primeru se začne izvajati merjenje temperature.

Trenutno imam napisano rutino, ki poišče vse priključene senzorje na 1wire vodilu. Ta rutina dela tako, da ko najde prvi senzor, shrani njegov ID v začasno polje velikosti 8x8, nato najde drugega ter shrani v to isto polje (se pravi ga prepiše).
Zanima me pa to. Ko rutina najde prvi senzor moram primerjati njegov ID s tistimi ID-ji, ki so v EEPROM-u. In če se najdeni ID s katerim od tistih v EEPROM-u ne ujema, pomeni, da gre za nov senzor, ki mu nato izberem ime, njegov ID pa vpišem v EEPROM. Problem pa se mi pojavi pri primerjavi ID-jev.

Primer: v EEPROM-u imam shranjene tri ID-je, dodati hočem pa še četrti senzor, ki ima kodo npr. 28 23 54 B2 C8 BE F1 36.



Koda prvega senzorja je na naslovu od 0-7, drugega od 8-F, tretjega pa od 10-17.

Najprej najde prvi senzor in ugotovim, da je že v EEPROM-u, nato najdem drugega, ki je tudi že v EEPROM-u. Potem najdem še tretjega. Tudi ta je že shranjen. Ko pa primerjam ID četrtega senzorja s tistimi tremi v EEPROM-u pa ugotovim, da se ne ujema z nobenim. Kako naj ugotovim na kateri naslov ga moram shranit? Vem, da ga moram shranit na naslov od 18-1F, a kako to ugotovit, če ne vem koliko senzorjev je bilo prej shranjenih oziroma koliko starih senzorjev je na vodilu.
Pa še ena dilema. Imam priključene tiste tri senzorje, ki so zgoraj v tabeli. Zdaj pa izklopim en stari senzor (npr. drugega na naslovu 8-F) in priključim enega čisto novega ter ponovno vklopim napravo. Za tista dva stara senzorja ugotovi, da sta že shranjena, ID tega novega pa se ne ujema z nobenim v EEPROM-u. Kako sedaj ugotovit, da mora ta novi ID shranit na naslov 8-F, kjer je bil tisti stari senzor, ki sem ga odstranil?

Uhh, sem tole zakompliciral Wink Potrudil sem se napisati čimbolj natančno kaj imam in kaj hočem, koliko sem pa bil pri tem uspešen bom pa še videl. Upam, da me bo kdo razumel kaj želim Confused

Mogoče ima kdo kakšno boljšo idejo?

_________________
Roke spadajo k telesu, ne k delu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.70
Kraj: Kranj - struževo

PrispevekObjavljeno: Sre Jan 06, 2010 5:48 pm    Naslov sporočila:   Odgovori s citatom

Za vsak ROM, ki ga prebereš, takoj za tem "pingaš" senzor. Če se ne javi, ponoviš še parkrat in če se še ne javi, potem zbrišeš lokacijo. Brisanje lahko poteka tako, da vpišeš $FFFFFFFF na tisto mesto.
Katera mesta so prazna ugotoviš s CRC8 perverjanjem. Če se CRC ne ujema, je lokacija prazna. Dejansko "prazna" nikoli ne more biti - vedno je neka številka vpisana.
ROM vključuje tudi CRC byte (kar si verjetno že ugotovil, če si prebral datasheet).

Če delaš nek konkreten sistem, moraš itak obvezno uporabljat CRC pri preverjanju ROM naslovov in pri preverjanju prejetih podatkov iz senzorja.

p.s. Search rutino imaš že spisano? To je najbolj kompliciran del programa.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
NUFAN
Član
Član



Pridružen-a: Pon 05 Apr 2004 21:39
Prispevkov: 947
Aktiv.: 4.00
Kraj: Žalec

PrispevekObjavljeno: Sre Jan 06, 2010 11:27 pm    Naslov sporočila:   Odgovori s citatom

aly je napisal/a:
Za vsak ROM, ki ga prebereš, takoj za tem "pingaš" senzor. Če se ne javi, ponoviš še parkrat in če se še ne javi, potem zbrišeš lokacijo. Brisanje lahko poteka tako, da vpišeš $FFFFFFFF na tisto mesto.

Tole ne zastopim najbolje Sad Kako naj ga pingam? Saj, če ga search rutina najde, pomeni, da je priključen in se odziva. Če ga pingam in se odzove, še ne pomeni, da je "star senzor" in da je njegova ROM koda v EEPROM-u.
Mi lahko to prosim malo natančneje razložiš, kako si si zamislil?

aly je napisal/a:
Katera mesta so prazna ugotoviš s CRC8 perverjanjem. Če se CRC ne ujema, je lokacija prazna. Dejansko "prazna" nikoli ne more biti - vedno je neka številka vpisana.
ROM vključuje tudi CRC byte (kar si verjetno že ugotovil, če si prebral datasheet).

Ravno se spravljam k pisanju CRC-ja Wink Če se CRC ne ujema, lahko tudi pomeni, da gre za nov senzor, ki ga še ni v EEPROM-u.

aly je napisal/a:
p.s. Search rutino imaš že spisano? To je najbolj kompliciran del programa.

Ja, neko oskubljeno verzijo serach rutine že imam spisano in tudi deluje. Dodati moram še CRC preverjanje, spustil sem pa Family skip setup, verifikacijo in Target setup.

_________________
Roke spadajo k telesu, ne k delu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.70
Kraj: Kranj - struževo

PrispevekObjavljeno: Čet Jan 07, 2010 9:43 am    Naslov sporočila:   Odgovori s citatom

CRC se mora VEDNO ujemati (= rezultat je 0). Če se ne ujema, so podatki neveljavni.

Najprej greš po EEPROM-u, eno lokacijo za drugo prebereš ROM-e. Če se CRC prebranih podatkov ujema, je lokacija "polna" in pokličeš ta senzor. Če se javi, je vse ok. Če se ne javi, lokacijo pobrišeš.

Ko to zaključiš, poženeš search. Če najde nov senzor, greš spet po eepromu in ko najdeš prvo "prazno" lokacijo, ga vpišeš tja in povprašaš za ime.

Kako pingati senzor - izberi si eno funkcijo branja iz datasheeta.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
NUFAN
Član
Član



Pridružen-a: Pon 05 Apr 2004 21:39
Prispevkov: 947
Aktiv.: 4.00
Kraj: Žalec

PrispevekObjavljeno: Čet Jan 07, 2010 11:34 am    Naslov sporočila:   Odgovori s citatom

aly je napisal/a:
Najprej greš po EEPROM-u, eno lokacijo za drugo prebereš ROM-e. Če se CRC prebranih podatkov ujema, je lokacija "polna" in pokličeš ta senzor. Če se javi, je vse ok. Če se ne javi, lokacijo pobrišeš.


Ok, to zdaj razumem. Mi je zelo všeč ideja!

aly je napisal/a:
Ko to zaključiš, poženeš search. Če najde nov senzor, greš spet po eepromu in ko najdeš prvo "prazno" lokacijo, ga vpišeš tja in povprašaš za ime.

Ko poženem funkcijo search, mi mi najde prvi senzor za katerega še ne vem ali je nov ali star. Zato moram primerjati ID s tistimi v EEPROM-u. Če je star nadaljujem iskanje, če je nov pa sprožim iskanje prazne lokacije v EEPROM-u, ga zapišem in mu določim ime.

Aly, najlepša hvala za te nasvete!

Me še pa nekaj zanima. Kako primerjati trenutni ID s tistimi v EEPROM-u? Trenutno sem to delal byte po byte, kar vzame "veliko časa", da pregleda celoten EEPROM.

_________________
Roke spadajo k telesu, ne k delu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.70
Kraj: Kranj - struževo

PrispevekObjavljeno: Čet Jan 07, 2010 12:44 pm    Naslov sporočila:   Odgovori s citatom

NUFAN je napisal/a:
Kako primerjati trenutni ID s tistimi v EEPROM-u? Trenutno sem to delal byte po byte, kar vzame "veliko časa", da pregleda celoten EEPROM.

Po eepromu skačeš po 8 lokacij naprej (ker je ROM dolg 8 bytov).
Na vsaki lokaciji primerjaš 1 byte.
Če je enak, prišteješ lokaciji +1. Če si na koncu dolžine ROM-a, imaš zadetek.
Če byte ni enak, skočiš na začetek naslednje lokacije.

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
NUFAN
Član
Član



Pridružen-a: Pon 05 Apr 2004 21:39
Prispevkov: 947
Aktiv.: 4.00
Kraj: Žalec

PrispevekObjavljeno: Čet Jan 07, 2010 10:45 pm    Naslov sporočila:   Odgovori s citatom

@aly, hvala zaenkrat za vse nasvete in ideje!

Čez vikend bom najprej spravil tole na papir potem pa še poskusil realizirat. Če se mi kje zatakne se pa zopet oglasim po pomoč Wink

_________________
Roke spadajo k telesu, ne k delu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
NUFAN
Član
Član



Pridružen-a: Pon 05 Apr 2004 21:39
Prispevkov: 947
Aktiv.: 4.00
Kraj: Žalec

PrispevekObjavljeno: Pon Jan 11, 2010 6:53 pm    Naslov sporočila:   Odgovori s citatom

Muči me pinganje senzorja. Rekel si, da si lahko izberem eno funkcijo branja. Ok, ampak prej moram senzorjem povedati s katerim se hočem pogovarjati oziroma od koga želim brati, torej z ukazom MatchROM, ker se bodo drugače vsi odzvali. Za naslavljanjem pa nato sprožim funkcijo branja? Pri funkcijah branja sem pa omejen. Npr. Read ROM si ne morem izbrati Wink

A imaš kakšen primer pinganja, kje napisano?

_________________
Roke spadajo k telesu, ne k delu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.70
Kraj: Kranj - struževo

PrispevekObjavljeno: Pon Jan 11, 2010 8:06 pm    Naslov sporočila:   Odgovori s citatom

Edina funkcija za branje je Read Scratchpad. Le ta je dolg 9 bytov. Če se senzor ne odzove (ga ni), potem je linija pri miru in se prebere kot 9-krat 0xFF. Torej bereš scratchpad, dokler:
- če je prebranih bytov = 9, senzorja ni
- če je podatek različen od 0xFF, senzor je in prenehaš z branjem.

Koda:
//----- RESET
............
//----- SEND ROM
............
//----- READ SCRATCHPAD
buffer[0] := $BE;
OWBlock RW (buffer)  // tukaj pošlje ukaz in prebere vrednosti
no_connect := true;
for i := 1 to sendlen-1 do
  if buffer[i] <> $FF then no_connect := false;
if no_connect then
  begin
  Info ('senzor ' + IntToStr (st_senz) + ': No device response', sError);
  // in vrže ven pri procesiranju
  end

_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
galex4
Član
Član



Pridružen-a: Tor 01 Apr 2008 18:27
Prispevkov: 459
Aktiv.: 2.19

PrispevekObjavljeno: Ned Feb 21, 2010 8:08 pm    Naslov sporočila:   Odgovori s citatom

kako prebereš in izpišeš CRC in kaj mora pisati

tu imam del kode vendar nevem če se prav spravljam k stvari

Ow_Reset(PORTE, 2)
Ow_Write(PORTE, 2, 0xBE)
stratchpad = Ow_Read(PORTE, 2)
WordToStr(stratchpad, txt)
Lcd_Out(2, 1, txt)
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.70
Kraj: Kranj - struževo

PrispevekObjavljeno: Pon Feb 22, 2010 10:35 pm    Naslov sporočila:   Odgovori s citatom

CRC je del ROM-a ali Scratchpada. Prebereš ga skupaj z ostalimi vrednostmi. In ga nič ne izpisuješ ampak samo preračunaš, ali so vsi podatki pravilno prebrani. Za več beri datasheet in definicijo CRC-ja.
_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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: 494 dni


Powered by phpBB © 2001, 2005 phpBB Group