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 

Več sond DS1820 na posamezen pin na PIC-u...program
Pojdi na stran 1, 2  Naslednja
 
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
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Čet Maj 06, 2010 10:24 pm    Naslov sporočila:  Več sond DS1820 na posamezen pin na PIC-u...program Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.02
Kraj: Črnuče

PrispevekObjavljeno: Čet Maj 06, 2010 10:49 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
aly
Član
Član



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

PrispevekObjavljeno: Čet Maj 06, 2010 11:54 pm    Naslov sporočila:   Odgovori s citatom

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 Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Pet Maj 07, 2010 6:24 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
NUFAN
Član
Član



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

PrispevekObjavljeno: Pet Maj 07, 2010 8:51 pm    Naslov sporočila:   Odgovori s citatom

mk0388 je napisal/a:
-Ker če crkne ena, ne boš vedu kira je crknala(pri onewire)
Odvisno od programerja Wink

mk0388 je napisal/a:
-Ker branje 64-bitov rabi veliko časa(Ta "unikat" koda)
Odvisno koliko je to zate veliko? Shocked
_________________
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: Pet Maj 07, 2010 10:06 pm    Naslov sporočila:   Odgovori s citatom

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 Anxious

_________________
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
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Sob Maj 08, 2010 10:13 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
woops
Član
Član



Pridružen-a: Sre 03 Mar 2010 23:23
Prispevkov: 19
Aktiv.: 0.10
Kraj: Ljubljana

PrispevekObjavljeno: Sob Maj 08, 2010 10:52 am    Naslov sporočila:  Več sond DS1820 na PIC Odgovori s citatom

Pozdravljeni! Smile

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 Smile
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
woops
Član
Član



Pridružen-a: Sre 03 Mar 2010 23:23
Prispevkov: 19
Aktiv.: 0.10
Kraj: Ljubljana

PrispevekObjavljeno: Sob Maj 08, 2010 10:55 am    Naslov sporočila:   Odgovori s citatom

Še primer (stran: 198 - one wire protocol): http://www.mikroe.com/eng/downloads/get/853/mikroc_manual.pdf
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Sob Maj 08, 2010 11:14 am    Naslov sporočila:   Odgovori s citatom

Načeloma, bi lahko spreminjal naslov ONE_WIRE_PIN, boš pa verjetno moral vsakič narediti potem še OneWireReset.
Preizkusi Wink

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 Wink

P.S.: Sem prevajal in preizkušal za PIC, ki nima B porta .... lahko seveda uporabiš drugi port kot A Wink


Nazadnje urejal/a bungee Sob Maj 08, 2010 11:18 am; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
bungee
Član
Član



Pridružen-a: Pon 07 Mar 2005 18:49
Prispevkov: 1479
Aktiv.: 6.24
Kraj: Ljubljana

PrispevekObjavljeno: Sob Maj 08, 2010 11:16 am    Naslov sporočila:   Odgovori s citatom

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 Wink
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Majster
Član
Član



Pridružen-a: Sob 14 Nov 2009 1:05
Prispevkov: 344
Aktiv.: 1.81
Kraj: Majšperk

PrispevekObjavljeno: Sob Maj 08, 2010 10:42 pm    Naslov sporočila:   Odgovori s citatom

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 Wink

_________________
Smith & Wesson — the original point and click interface.
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: Sob Maj 08, 2010 11:01 pm    Naslov sporočila:  Re: Več sond DS1820 na posamezen pin na PIC-u...program Odgovori s citatom

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 Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
mk0388
Član
Član



Pridružen-a: Čet 30 Okt 2008 21:52
Prispevkov: 161
Aktiv.: 0.80
Kraj: Celje

PrispevekObjavljeno: Ned Maj 09, 2010 9:06 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Highlag
Član
Član



Pridružen-a: Pet 23 Jan 2004 20:42
Prispevkov: 4034
Aktiv.: 17.02
Kraj: Črnuče

PrispevekObjavljeno: Ned Maj 09, 2010 9:37 am    Naslov sporočila:   Odgovori s citatom

#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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
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
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
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: 495 dni


Powered by phpBB © 2001, 2005 phpBB Group