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


Pridružen-a: Pon 05 Apr 2004 21:39 Prispevkov: 947 Aktiv.: 4.00 Kraj: Žalec
|
Objavljeno: Sre Jan 06, 2010 4:12 pm Naslov sporočila: Merjenje temperature s PIC in Dallasovimi senzorji |
|
|
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 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
Mogoče ima kdo kakšno boljšo idejo? _________________ Roke spadajo k telesu, ne k delu. |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Sre Jan 06, 2010 5:48 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
NUFAN Član


Pridružen-a: Pon 05 Apr 2004 21:39 Prispevkov: 947 Aktiv.: 4.00 Kraj: Žalec
|
Objavljeno: Sre Jan 06, 2010 11:27 pm Naslov sporočila: |
|
|
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 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 Č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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Čet Jan 07, 2010 9:43 am Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
NUFAN Član


Pridružen-a: Pon 05 Apr 2004 21:39 Prispevkov: 947 Aktiv.: 4.00 Kraj: Žalec
|
Objavljeno: Čet Jan 07, 2010 11:34 am Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Čet Jan 07, 2010 12:44 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
NUFAN Član


Pridružen-a: Pon 05 Apr 2004 21:39 Prispevkov: 947 Aktiv.: 4.00 Kraj: Žalec
|
Objavljeno: Čet Jan 07, 2010 10:45 pm Naslov sporočila: |
|
|
@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č  _________________ Roke spadajo k telesu, ne k delu. |
|
Nazaj na vrh |
|
 |
NUFAN Član


Pridružen-a: Pon 05 Apr 2004 21:39 Prispevkov: 947 Aktiv.: 4.00 Kraj: Žalec
|
Objavljeno: Pon Jan 11, 2010 6:53 pm Naslov sporočila: |
|
|
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
A imaš kakšen primer pinganja, kje napisano? _________________ Roke spadajo k telesu, ne k delu. |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Pon Jan 11, 2010 8:06 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
galex4 Član

Pridružen-a: Tor 01 Apr 2008 18:27 Prispevkov: 459 Aktiv.: 2.19
|
Objavljeno: Ned Feb 21, 2010 8:08 pm Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Pon Feb 22, 2010 10:35 pm Naslov sporočila: |
|
|
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  |
|
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: 495 dni
Powered by phpBB © 2001, 2005 phpBB Group
|