Fórum témák

» Több friss téma
Fórum » DS18B20 és PIC16F877A közötti kommunikáció
Lapozás: OK   1 / 1
(#) szabolcsx hozzászólása Júl 11, 2012 /
 
Sziasztok. Egy termosztátot építek, és kicsit elakadtam. Ahogy a címben is olvasható egy DS18B20-as digitális hőmérőt használok és egy PIC16F877A-t. Kaptam a neten egy assembly kódot, amivel a pic és a szenzor közti kommunikáció van megoldva és átírtam C-re, mivel én abban dolgozom. HIGH TECH C fordítót használok. Az egyetlen gond az, hogy örökké zérót olvas le a pic a szenzorról. A kódot itt találtam, és mellékelem az én forráskódomat is. A szenzor az RC0-s lábra van bekötve, és biztosan jól, mert egy másik oldalon talált programmal működik. (azért nem használom azt a programot, mert mikroC-ben van megírva és onnan nem tudom kiszedni az 1 wire könyvtár kódjait...) A főprogramban így olvasom le a hőmérsékletet:
  1. OW_RESET();
  2. DSTXBYTE(0xCC);
  3. DSTXBYTE(0x44);
  4. __delay_ms(750);
  5. OW_RESET();
  6. DSTXBYTE(0xCC);
  7. DSTXBYTE(0xBE);
  8. tempe = DSRXBYTE();
  9. tempe += (DSRXBYTE() << 8);

A forráskódban a DQ-val hivatkozok a szenzor lábára és a DQ_DIR-el meg a neki megfelelő TRIS bitre.

ds18b20.h
    
(#) polonkaig válasza szabolcsx hozzászólására (») Júl 11, 2012 / 1
 
Szia!
T1CON regiszter jól van beállítva? Doksiból idézek:
Idézet:
„When the Timer1 oscillator is enabled (T1OSCEN is
set), the RC1/T1OSI/CCP2 and RC0/T1OSO/T1CKI
pins become inputs. That is, the TRISC<1:0> value is
ignored, and these pins read as ?0?.”
(#) szabolcsx válasza polonkaig hozzászólására (») Júl 11, 2012 /
 
Na erre nem gondoltam... és az lcd tartalmát a Timer1 modullal frissítem minden 100ms-ban. Megpróbálom úgy, hogy átcinezem máshova. Köszi az észrevételt
(#) polonkaig válasza szabolcsx hozzászólására (») Júl 11, 2012 /
 
Majd szólj vissza, hogy megoldódott-e.
(#) michael67 válasza szabolcsx hozzászólására (») Júl 11, 2012 /
 
Szia.Pár tipp:
Bár a c nyelvet nem vágom. De a "0xCC" Skip rom parancs helyett, a "0xF0" search rom-al próbálkoznék (az adatlap 7. oldalán található ábra szemlélteti).
A másik. Amikor elküldöd neki a reset impulzust, vizsgáld meg, hogy megjött-e a válasz. Azt látom, hogy pd-t beállítod, viszont nem vizsgálod, hogy az értéke tényleg 1-e.
(#) szabolcsx válasza szabolcsx hozzászólására (») Júl 11, 2012 /
 
Nos. Ez megoldotta a gondomat, de most egy másik problémába ütköztem. Ki kell valahogy számolni a hőfokot, mert valami hülye értékek jönnek ki.
(#) polonkaig válasza szabolcsx hozzászólására (») Júl 11, 2012 /
 
Ha pontosítanál jobb lenne, mert ebből az információból nem tudok meg sokat.
(#) kyrk válasza szabolcsx hozzászólására (») Júl 11, 2012 / 1
 
En ezt hasznalom:

static float ds18b20_convert_temperature(unsigned int rawTemp) {
float result = 0;
int temp = 0;
temp = (int)rawTemp;
result = temp;
//printf("Raw:%u\r\n", rawTemp);
//printf("Raw:%d\r\n", temp);
result /= 16.0;
//printf("Raw:%d\r\n", (int)result);
return result;
}
(#) kyrk hozzászólása Júl 11, 2012 / 2
 
Velemenyem szerint a DS18B20 szenzor viszonylag pontos de a kommunikacio miatt szornyu egy valasztas.

Eleve rovid idoket kell idoziteni, emiatt el kell pazarolni egy timert. Ha pedig esetleg soros portal csinalna az ember akkor meg egy usart modulnak lottek. Eszi a HW-t mint a fene es meg a SW-t is fenttartja.

Konkretan a 470us-es reset idozites szivas mert az mar majdnem fel milisec, es ennyit elvenni a foprogrambol gyakran fajdalamas tud lenni.

Mondhatna az ember, hogy tobb eszkozt fel lehet fuzni a buszre, de azokat megcimezni konkretan szivas. Meg nem lattam olyan projektet ahol eszkozcim alapjan cimeztek volna az eszkozoket. Ezzel ugyanis az a baj, hogy ha az ember sorozatot gyart (akar 2 panel eseten) elore tudni kellene a cimeket. Na ezt panelenkent beaalitani szivas. Persze lehet dinamikusan keresni, de ki fogja azt leimplementalni...

Eleinte nagyon lelkesedtem a onewire eszkozokert, de mire sikerult egy rendes drivert irnom hozza vert izzadtam. Foleg, hogy tobb PIC-en is mukodnie kellet, multitaskingos kornyezetben ugy hogy az interruptol ne vegye el az idot (reset impulzus 470us evel azert mar sok). Aranytalanul tobb volt vele a munka mint egy sima I2C-s eszkozzel. Vegulis ugy voltam vele, hogy ha mar egyszer megirom akkor legyen tokeletes. De ha lehet akkor a jovoben inkabb i2c-t valasztanek.

Mellekletben az a driver amit internetrol olloztam ossze es kicsit atpofoztam.

ds18b20.zip
    
(#) polonkaig válasza kyrk hozzászólására (») Júl 11, 2012 /
 
1. A rawtemp-ben mi van? Ki tudod rakni az LCD-re?
2. A legelső hozzászólásodban nem értem, hogy a 0x44 convert parancs után miért reseteled megint az eszközöket. Szerintem 0x44 után várj kicsit, a 750ms bőven elég, és utána egyből mehet a 0xBE, majd utána az olvasás. Ha így sikerült olvasni, és más eredmény jött ki mint enélkül a módosítás nélkül, akkor azt is írd meg kérlek. DS18B20-at még nem használtam, most olvasom először az adatlapját, de ilyen irányban próbálkoznék.

Illetve még annyi, hogy ha kiolvastad a scratchpad első két bájtját, akkor utána csinálj egy resetet a buszon, hogy ne küldje a többit, mert ez esetleg a további olvasásokat megzavarhatja.
(#) polonkaig válasza kyrk hozzászólására (») Júl 11, 2012 /
 
Egyet értek, nekem sem jöttek be a 1wire eszközök. Viszont ha csak 1 darabot kell használni, akkor még aránylag jól működtethető a dolog.
(#) szabolcsx hozzászólása Júl 11, 2012 /
 
Köszönök minden segítséget, most már működik.
(#) polonkaig válasza szabolcsx hozzászólására (») Júl 11, 2012 / 1
 
Remekül hangzik. Végül miken változtattál? A pontokat ne felejtsd el kiosztani!
(#) szabolcsx hozzászólása Júl 12, 2012 / 1
 
Hol lehet pontokat osztogatni?
(#) polonkaig válasza szabolcsx hozzászólására (») Júl 12, 2012 /
 
Gondolom a hozzászólásnál a jobb felső sarokban a zöld kézre kattintva be tudod jelölni, hogy "ez a hozzászólás segített".
(#) kyrk válasza polonkaig hozzászólására (») Júl 13, 2012 /
 
1. A rawTemp az az ertek amit a DS18B20-bol olvastam ki. unsigned int mivel 2 byte. A printf-el debugoltam regebben LCD-re illetve soros portra.
(#) simi21 hozzászólása Okt 18, 2012 /
 
Üdv mindenkinek.Adott egy PIC16F877a mikrovezérlő.Az lenne a kérdésem hogy ha ez levan védve,mert le lehet.Valahogy vissza lehet állítani?
(#) bbalazs_ válasza simi21 hozzászólására (») Okt 18, 2012 /
 
A vedelem tobbszintu lehet. Ami le van vedve, azt nem tudod kiolvasni kivulrol.
De ha torlod az egeszet, a PIC ujbol programozhatova valik, de a tartalom elveszik belole.
(#) simi21 hozzászólása Okt 19, 2012 /
 
Lehetséges ezt valahogy feltörni?Olyasmi ötletre gondolok mint pl. a számítógép alaplapból ha kiveszem az elemet 1 napra.Akkor ez után a PC is elfelejti a dolgokat.Sikerült így már megjavítanom többször a gépet..
(#) _vl_ válasza simi21 hozzászólására (») Okt 19, 2012 /
 
Idézet:
„Akkor ez után a PC is elfelejti a dolgokat.Sikerült így már megjavítanom többször a gépet..”

Így ezt is meg tudod "javítani". Lehet törölni a komplett tartalmát a chipnek, és megint használhatod. Csak kiolvasni nem fogod tudni, ahogy a PC-ből sem, ha kiveszed az elemet...
A hozzászólás módosítva: Okt 19, 2012
(#) simi21 hozzászólása Okt 19, 2012 /
 
Szóval kiolvasni nemlehet.Köszi a választ.
(#) kyrk válasza simi21 hozzászólására (») Nov 4, 2012 /
 
Altalaban 2 lehetoseg van. Ha torlod a tartalmat akkor elveszik a program de a vedelem is kikapcsol.

Ki lehet olvasni vedelemmel de hulyeseget ad ki magabol.

Kinaban vannak cegek akik nehany ezer dollarert es 2 ures chippert vallaljak cserebe hogy lemarjak a kulsejet es kiolvassak neked. Eloszor vedetten ujraprogramozzak es visszakuldik. Ha jo akkor kuldik a masodik chiped vedelem nelkul programozva.
Következő: »»   1 / 1
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem