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


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Čet Maj 06, 2010 10:24 pm Naslov sporočila: Več sond DS1820 na posamezen pin na PIC-u...program |
|
|
Pozdravljeni,
zanima me kako bi sprenil program oz. kako brati(rutina) vsako posamezno sondo npr. če imam 3 sonde na posameznih pinih mikrokontrolerja?
Primer programa, ki je priložen je narejen za branje ene sonde...torej #define ki je na začetku je za pin_b0. Nimam pa ideje kako bi bral 3 sonde..
Hvala za vsak nasvet.
Koda: |
/*-------1-wire definitions-------*/
#define ONE_WIRE_PIN PIN_B0
/*******************1-wire communication functions********************/
/************onewire_reset*************************************************/
/*This function initiates the 1wire bus */
/* */
/*PARAMETERS: */
/*RETURNS: */
/*********************************************************************/
void onewire_reset() // OK if just using a single permanently connected device
{
output_low(ONE_WIRE_PIN);
delay_us( 500 ); // pull 1-wire low for reset pulse
output_float(ONE_WIRE_PIN); // float 1-wire high
delay_us( 500 ); // wait-out remaining initialisation window.
output_float(ONE_WIRE_PIN);
}
/*********************** onewire_write() ********************************/
/*This function writes a byte to the sensor.*/
/* */
/*Parameters: byte - the byte to be written to the 1-wire */
/*Returns: */
/*********************************************************************/
void onewire_write(int data)
{
int count;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // pull 1-wire low to initiate write time-slot.
output_bit(ONE_WIRE_PIN, shift_right(&data,1,0)); // set output bit on 1-wire
delay_us( 60 ); // wait until end of write slot.
output_float(ONE_WIRE_PIN); // set 1-wire high again,
delay_us( 2 ); // for more than 1us minimum.
}
}
/*********************** read1wire() *********************************/
/*This function reads the 8 -bit data via the 1-wire sensor. */
/* */
/*Parameters: */
/*Returns: 8-bit (1-byte) data from sensor */
/*********************************************************************/
int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // pull 1-wire low to initiate read time-slot.
output_float(ONE_WIRE_PIN); // now let 1-wire float high,
delay_us( 8 ); // let device state stabilise,
shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result.
delay_us( 120 ); // wait until end of read slot.
}
return( data );
} |
_________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.02 Kraj: Črnuče
|
Objavljeno: Čet Maj 06, 2010 10:49 pm Naslov sporočila: |
|
|
Ne programiram ravno v C-ju, vendar se tem stvarem streže tako, da narediš eno zanko v kateri se povečuje števec - če imaš senzorje na pinih 1-3 bi moral v zanki števec povečevati od 1 do 3. Vsebino števca pa potem uporabiš kot naslov pina na katerem je tvoj senzor.
recimo
Koda: |
For n = 1 to 3 do
Tvoja funkcija za branje vsebine, kjer One wire pin spremenljiko zamenjaš z n (ali obratno)
n=n+1
if n=3 then n=1
next
|
Seveda moraš kodo ustrezno spisati za C jezik oziroma kar pač uporabljaš. _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
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 Maj 06, 2010 11:54 pm Naslov sporočila: |
|
|
In zakaj ne bi imel vseh treh skupaj na enem pinu, če so namenjeni vezavi v omrežje?
Zato si jih pa tudi tako drago plačal, ker ima vsak vpisano edinstveno serijsko številko. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
mk0388 Član


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Pet Maj 07, 2010 6:24 pm Naslov sporočila: |
|
|
aly je napisal/a: |
In zakaj ne bi imel vseh treh skupaj na enem pinu, če so namenjeni vezavi v omrežje?
Zato si jih pa tudi tako drago plačal, ker ima vsak vpisano edinstveno serijsko številko. |
Pozdravljen,
To sem se odločil zato ker:
-Iz izkušenj servisiranja teh sond v industriji
-Ker če crkne ena, ne boš vedu kira je crknala(pri onewire)
-Ker branje 64-bitov rabi veliko časa(Ta "unikat" koda)
-Pa zato ker mam dovolj pinov za to apklikacijo kar izdelujem sedaj _________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
NUFAN Član


Pridružen-a: Pon 05 Apr 2004 21:39 Prispevkov: 947 Aktiv.: 4.00 Kraj: Žalec
|
Objavljeno: Pet Maj 07, 2010 8:51 pm Naslov sporočila: |
|
|
mk0388 je napisal/a: |
-Ker če crkne ena, ne boš vedu kira je crknala(pri onewire) |
Odvisno od programerja
mk0388 je napisal/a: |
-Ker branje 64-bitov rabi veliko časa(Ta "unikat" koda) |
Odvisno koliko je to zate veliko?  _________________ 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: Pet Maj 07, 2010 10:06 pm Naslov sporočila: |
|
|
mk0388 je napisal/a: |
Ker branje 64-bitov rabi veliko časa(Ta "unikat" koda) |
Sploh ne. Konverzija temperature traja eno celo sekundo, vsi podatki (vsa komunikacija) pa so poslani v delčku sekunde. Razen če si kaj narobe sprogramiral  _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
mk0388 Član


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Sob Maj 08, 2010 10:13 am Naslov sporočila: |
|
|
To kar ste odgovorili je res, ampak mislim da smo zavili s prvotnega problema.
A bi lahko kako med delovanjem pic-a različno definiral ta "ONE_WIRE_PIN", pač ko bi rabil bi klical določen pin katera tem. bi me zanimala? _________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
woops Član


Pridružen-a: Sre 03 Mar 2010 23:23 Prispevkov: 19 Aktiv.: 0.10 Kraj: Ljubljana
|
Objavljeno: Sob Maj 08, 2010 10:52 am Naslov sporočila: Več sond DS1820 na PIC |
|
|
Pozdravljeni!
To je dokaj preprosto, še lažje bo z uporabo prevajalnika od MikroelEktronike - MikroC for PIC: http://www.mikroe.com/eng/products/view/411/mikroc-for-pic/
DS1820 temperaturni senzorji uporabljajo OneWire komunikacijo, in točen primer imaš v helpu od MikroC, prav tako je prikazana vezava na pin RA5, pine pa lahko določiš po svoje, le da so priklopleni na digitalnih vhodih/izhodih, naprimer: RB0, RB1 in RB2.
MikroC ima že vnaprej spisane knjižnice za OneWire protokol, tako da to zelo poenostavi zadevo, za branje enega senzorja rabiš samo to kodo (primer za PORT A, PIN 5):
Koda: |
//--- perform temperature reading
Ow_Reset(&PORTA, 5); // Onewire reset signal
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTA, 5);
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0xBE); // Issue command READ_SCRATCHPAD
temp = Ow_Read(&PORTA, 5);
temp = (Ow_Read(&PORTA, 5) << 8) + temp;
|
Isto uporabiš še za druge pine kjer so priklopljeni senzorji.
Program prevedeš in HEX uporabiš za kateri koli softwarski programator, [slovenščina je zame španska vas] uporablam Microchipov Mplab & ICD 3.
Primer vsebuje še prikaz temperature na display, mičkn več težav je s pretvarjanjem v pravo obliko zapisa, vse ostalo je pa simple enough  |
|
Nazaj na vrh |
|
 |
woops Član


Pridružen-a: Sre 03 Mar 2010 23:23 Prispevkov: 19 Aktiv.: 0.10 Kraj: Ljubljana
|
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Sob Maj 08, 2010 11:14 am Naslov sporočila: |
|
|
Načeloma, bi lahko spreminjal naslov ONE_WIRE_PIN, boš pa verjetno moral vsakič narediti potem še OneWireReset.
Preizkusi
V definiciji programa spremeni:
Koda: |
int One_Wire_pin=Pin_A0; |
Potem pa ko bereš senzor enostavno narediš takole:
Koda: |
One_Wire_pin==Pin_A0;
temperature1 = ds1820_read();
One_Wire_pin==Pin_A1;
temperature2 = ds1820_read();
One_Wire_pin==Pin_A2;
temperature3 = ds1820_read(); |
Ostali del kode, si boš pa sam potem spisal....
Načeloma bi vse skupaj lahko izvedel tudi v "for" zanki, ampak to pa prepuščam tebi
P.S.: Sem prevajal in preizkušal za PIC, ki nima B porta .... lahko seveda uporabiš drugi port kot A 
Nazadnje urejal/a bungee Sob Maj 08, 2010 11:18 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
bungee Član


Pridružen-a: Pon 07 Mar 2005 18:49 Prispevkov: 1479 Aktiv.: 6.24 Kraj: Ljubljana
|
Objavljeno: Sob Maj 08, 2010 11:16 am Naslov sporočila: |
|
|
woops.... glede na to, da uporablja CCS primer kode, bo laže v tem jeziku .. sicer pa kot vidiš v mojem primeru kode, to sploh ni težko  |
|
Nazaj na vrh |
|
 |
Majster Član


Pridružen-a: Sob 14 Nov 2009 1:05 Prispevkov: 344 Aktiv.: 1.81 Kraj: Majšperk
|
Objavljeno: Sob Maj 08, 2010 10:42 pm Naslov sporočila: |
|
|
mk0388 je napisal/a: |
-Ker če crkne ena, ne boš vedu kira je crknala(pri onewire) |
Saj ti je aly napisal da ima EDINSTVENO serijsko tako, da če sonda crkne je več ne bo šlo nasloviti.
bungee v for zanki je še najpreprosteje  _________________ Smith & Wesson — the original point and click interface. |
|
Nazaj na vrh |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.70 Kraj: Kranj - struževo
|
Objavljeno: Sob Maj 08, 2010 11:01 pm Naslov sporočila: Re: Več sond DS1820 na posamezen pin na PIC-u...program |
|
|
mk0388 je napisal/a: |
..torej #define ki je na začetku je za pin_b0.
Koda: |
int onewire_read()
{
int count, data;
for (count=0; count<8; ++count)
{
output_low(ONE_WIRE_PIN);
delay_us( 2 ); // pull 1-wire low to initiate read time-slot.
output_float(ONE_WIRE_PIN); // now let 1-wire float high,
delay_us( 8 ); // let device state stabilise,
shift_right(&data,1,input(ONE_WIRE_PIN)); // and load result.
delay_us( 120 ); // wait until end of read slot.
}
return( data );
} |
|
Namesto #define narediš spremenljivko ustrezne velikosti in ji spreminjaš vrednost.
Še lažje je, če funkcije popraviš tako, da kot parameter vzamejo tudi številko pina.
Potem samo v zanki ponavljaš vse funkcije, ampak na različnih pinih.
Povsem enostavno. In neodvisno od prevajalnika. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding  |
|
Nazaj na vrh |
|
 |
mk0388 Član


Pridružen-a: Čet 30 Okt 2008 21:52 Prispevkov: 161 Aktiv.: 0.80 Kraj: Celje
|
Objavljeno: Ned Maj 09, 2010 9:06 am Naslov sporočila: |
|
|
Zdej sem #define stavek zamenjal z
int ONE_WIRE_PIN = PIN_B0; ( poizkušam samo z eno sondo)
...kar je po vašem enakovredno z #define. Vendar mi izpis tem. pokaže -1.2°C in se nič ne spreminja!
Če pa dam nazaj stavek z #define pa dela spet normalno. _________________ Victims - aren't we all... |
|
Nazaj na vrh |
|
 |
Highlag Član


Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 17.02 Kraj: Črnuče
|
Objavljeno: Ned Maj 09, 2010 9:37 am Naslov sporočila: |
|
|
#Define je kolikor je meni znano alias. Kar na kratko pomeni, da prevajalnik besedilo - v tvojem primeru ONE_WIRE_PIN ko naleti nanj, zamenja z PIN_B0.
Namenjeno je lažjemu branju programa.
Malo poglej kako se pravilno kliče vhode in definira spremenljivke.
Skratka če v tvojem programu (ki dela), besede ONE_WIRE_PIN zamenjaš z PIN_B0 bo ravno tako deloval, pa poglej kje ga lomiš. _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
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
|