Fórum témák

» Több friss téma
Fórum » Szoftveres I2C PIC18F4550 és DS1621 között
Lapozás: OK   1 / 2
(#) gyengus hozzászólása Jan 27, 2008 /
 
Sziasztok!

PIC18F4550 + cdc firmware-el hőmérsékletkijelzős órával próbálkozok. A hőérzékelést DS1621-el szeretném megvalósítani.
A Microchip AN997-ből szedtem ki a szoftveres i2chez szükséges függvényeket (ez egy i2cs eeprom író/olvasó pl).
A hőmérsékletkiolvasást a DS1621 adatlapja alapján írtam meg (ld DS1621.c/h). A 9. oldalon lévő idődiagrammok és a lejjebb lévő pl alapján látszólag stimmel, viszont binárisan: 11111111-at olvas folyamatosan.
A PIC 20MHz-s kvarcról megy (ha jól tudom, belül a PLL miatt 48MHz-en ketyeg). A DS1621 adatlap 100 és 400kHz-es órajelet említ a busznak.
A kérdésem az, hogy mit csináljak? Tegyek valamilyen várakozást az i2c-t kezelő függvényekbe? De hova és mennyit?

Előre is köszönöm a segítséget!
(#) potyo válasza gyengus hozzászólására (») Jan 27, 2008 /
 
A 100kHz és a 400kHz az csak egy maximális érték. Mivel az ICD2 szinkron busz, lassítsd le a kommunikáció sebességét mondjuk 1kHz-re, és nézd meg úgy is.
(#) gyengus válasza potyo hozzászólására (») Jan 27, 2008 /
 
Hogyan lassítsam le?
Jut eszembe MPLAB C18 fordítót használok.
(#) potyo válasza potyo hozzászólására (») Jan 27, 2008 /
 
Itt is van egy példaprogi, igaz HiTech féle C-re készült, de érdemes összehasonlítani a te kódodat vele, hogy biztos rendben van-e minden: http://www.microchipc.com/sourcecode/PIC_Hi-Tech_C_Mike_Pearces_I2C...es.zip
(#) MPi-c válasza potyo hozzászólására (») Jan 27, 2008 /
 
Idézet:
„Mivel az ICD2 szinkron busz”

ez csak egy elírás volt, mert az ujjad már teljesen ráállt
(#) gyengus válasza potyo hozzászólására (») Jan 27, 2008 /
 
Máshonnan nem tudod belinkelni? Esetleg csak a szükséges fájlokat? NOD32 szerint NewHeur_PE vírus van benne.
(#) potyo válasza gyengus hozzászólására (») Jan 27, 2008 /
 
Pl. így:

  1. void bit_out(unsigned char data)
  2. {
  3.     SCL = 0;                        // Ensure SCL is low
  4.     if (data & 0x80)                // Check if next bit is high
  5.     {
  6.         SDA_TRIS = 1;               // Release SDA to be pulled high
  7.     }
  8.     else
  9.     {
  10.         SDA_TRIS = 0;               // Configure SDA as an output
  11.         SDA = 0;                    // Pull SDA low
  12.     }
  13.         for (j=128;j;j--);
  14.     SCL = 1;                        // Pull SCL high to clock bit
  15.         for (j=128;j;j--);
  16.     SCL = 0;                        // Pull SCL low for next bit
  17. } // end bit_out(unsigned char data)



  1. void bit_in(unsigned char *data)
  2. {
  3.     SCL = 0;                        // Ensure SCL is low
  4.     SDA_TRIS = 1;                   // Configure SDA as an input
  5.         for (j=128;j;j--);
  6.     SCL = 1;                        // Bring SCL high to begin transfer
  7.     *data &= 0xFE;                  // Assume next bit is low
  8.     if (SDA)                        // Check if SDA is high
  9.     {
  10.         *data |= 0x01;              // If high, set next bit
  11.     }
  12.         for (j=128;j;j--);
  13.     SCL = 0;                        // Bring SCL low again
  14. } // end bit_in(unsigned char *data)



Nem néztem szimulátorban, de ez így ránézésre nagyjából 1MHz környéki órajelet generált. Így most le lesz lassítva kb. 30kHz-re, de szimulátorral meg lehet nézni, hogy pontosan mennyi volt és mennyi most.
(#) potyo válasza MPi-c hozzászólására (») Jan 27, 2008 /
 
Miért, szerinted nem az?
(#) gyengus válasza gyengus hozzászólására (») Jan 27, 2008 /
 
Megoldottam a leszedését, átnézem.
(#) gyengus válasza potyo hozzászólására (») Jan 27, 2008 /
 
Köszi, kipróbálom.
(#) potyo válasza gyengus hozzászólására (») Jan 27, 2008 /
 
Szerintem téved a NOD32 (nálam is jelezte). Tiltsd le a NOD-ot, majd töröld a két exe fájlt, ami a zipben van. A többi fájl tiszta szövegfájl, azok biztosan tiszták.
(#) gyengus válasza potyo hozzászólására (») Jan 27, 2008 /
 
Kipróbáltam 128-al és 256-al, annyi változott, hogy a lassítás miatt a kijelző vibrál. Továbbra is 11111111-at olvas.
Beraktam fv-be és a bstart és bstop fv-ekbe is:

void bstart(void)
{
SDA_TRIS = 1; // Ensure SDA is high
SCL = 1; // Ensure SCL is high
SDA_TRIS = 0; // Configure SDA as an output
i2cdelay(256);
SDA = 0; // Pull SDA low
SCL = 0; // Pull SCL low
i2cdelay(256);

} // end bstart(void)

void bstop(void)
{
SCL = 0; // Ensure SCL is low
SDA_TRIS = 0; // Configure SDA as an output
SDA = 0; // Ensure SDA low
i2cdelay(256);
SCL = 1; // Pull SCL high
SDA_TRIS = 1; // Allow SDA to be pulled high
i2cdelay(256);
} // end bstop(void)

Amúgy nem értem amit belinkeltél. Sokkal bonyolultabb, mint a Microchip-es verzió. Utóbbiban a megjegyzésben 10MHz-es PIC órajelet emleget.

Szerk.: miért nem jó a kód gomb? inkább kiszedtem
(#) MPi-c válasza gyengus hozzászólására (») Jan 27, 2008 /
 
Elektromosan minden rendben van? Az SDA, SCL vonalakat felhúztad ellenállással a + tápra? Jók az ellenállás értékek? Az A0-A2 lábakon is megfelelő szintek vannak?
(#) gyengus válasza MPi-c hozzászólására (») Jan 27, 2008 /
 
SDA és SCL fel van húzva 4,7kOhmos ellenállással.
A0-A2? Nem arra van kötve, hanem SDA - C0, SCL - C1
Az 5V-ot megkapja az érzékelő.
(#) MPi-c válasza gyengus hozzászólására (») Jan 27, 2008 /
 
A0-A2. Én a DS1621 cím bemeneteire gondoltam.
(#) gyengus válasza MPi-c hozzászólására (») Jan 27, 2008 /
 
Értem, azok földön vannak.
De most próbaképp visszaraktam a régi kódot, azt átnéztem, találtam benne néhány hibát és most 26 fokot ír ki.
Régebben az MPLCAB C18-ban lévő szoftveres megvalósítással próbálkoztam. De akkor miért nem volt jó?
Úgy nézem, stimmel a hőmérsékleti értkék .
(#) MPi-c válasza gyengus hozzászólására (») Jan 27, 2008 / 4
 
Megnéztem az első hozzászólásodnál feltett kódot. A DS1621 init részében ezt írod
Idézet:
„byte_out(0x02); // 00000010 configba írás (folyamatos mérés)
-ben”
0x02 helyett írj 0x01-et! Úgy mennie kell.
(#) gyengus válasza MPi-c hozzászólására (») Jan 27, 2008 /
 
0x01 esetén csak start convert t parancsra kezdi a mérést, az adatlap példájában volt 0x02, de próbáltam 0x00-al is.
De inkább maradok az első megoldásnál. Ezzel úgy tűnik, műxik, még hasonlítom a méréseit a DS18S20-éival. Csak azt nem értem, h régen, miért nem működött? Biztos, próbáltam a jelenlegi variációt. Talán kontakthibás volt.
Fél fokot viszont még egyszer se írt. Elég gyorsan reagál a hőmérsékletváltozásra (kinyitottam az ablakot), de csak fokonként változott a kiírás.
(#) gyengus válasza gyengus hozzászólására (») Jan 28, 2008 /
 
Sikerült javítani a fél fok hiányát.
Tegnap óta sokat figyeltem hőmérőt, általában többet mutat a DS18S20-nál (direkt egymás mellé tettem őket), pl: 23,31 vs 24.
Én rontottam el valamit vagy valamelyik pontatlan?
Mellékelem a forrást, hátha valakinek még jól jön.
A pontot szét lehet osztani? Adnék mindkettőtöknek.
Köszönöm szépen a segítségeteket!
(#) fidelcastro válasza gyengus hozzászólására (») Jan 31, 2008 /
 
Hi Gyengus!
Segítségedet szeretném kérni!
Én is egy ilyesmi hőmérővel próbálkozom, és az a problémám hogy nem tudom kiolvasni a DS1621-ből a félfokot tartalmazó bájtot. Mindig FF-et tud csak kiolvasni. Én assembly-ben írom a progit. A pic hardveres i2c-jét használom.
Én így csináltam: (vázlatosan)
i2c start
cím írásra
0xaa (read temperature)
i2c stop
i2c start
cím olvasásra
i2c olvasás (HI bájt) ezt mindig kiolvassa rendesen
i2c olvasás (LO bájt) erre mindig 0xff-et olvas
i2c stop
(#) gyengus válasza fidelcastro hozzászólására (») Feb 1, 2008 /
 
Hali!

Sztem, így próbáld meg:
i2c start
cím írásra
ack
0xaa (read temperature)
ack
i2c restart
cím olvasásra
ack
i2c olvasás (HI bájt) ezt mindig kiolvassa rendesen
ack
i2c olvasás (LO bájt) erre mindig 0xff-et olvas
nack
i2c stop
De a ds1621 adatlapjában van 1 teljes oldal idődiagram félékkel, azokból jól meg lehet érteni, mit/mikor kell küldeni/fogadni.
(#) fidelcastro válasza gyengus hozzászólására (») Feb 1, 2008 /
 
Hali!
Kösz a segítséget, de már megoldódott a probléma!
Nekem a ds1621 adatlapja nem volt teljesen egyértelmű a két bájt kiolvasása terén, de a ds1624 adatlapjában megtaláltam amit hiányoltam.
(#) kistinka hozzászólása Ápr 26, 2008 /
 
Sziasztok. PICBasic-be irok programokat de a DS1631 (elvileg ua. mint a 1621es) az istenért se sikerül kiolasomnom. AZ I2C-t használhatom bármilyen lábon elvileg, mert a Basic tud szoftveres I2C-t.
vagy inkább használjam a PIC I2C lábait, és állitsam be az ehhez tartozó regisztereket? tudna vki segiteni?
16F877em van.
Üdv
(#) gyengus válasza kistinka hozzászólására (») Ápr 26, 2008 /
 
Hali!
Adatlap szerint kompatibilisek egymással. 1621-et próbáltad, azzal működik? Basichez nem értek, C18-ban 18f4550-re írtam szoftveres i2c-t. Sztem basicben is működnie kéne a szoftveres i2c-nek.
(#) tibiiii00 hozzászólása Nov 1, 2009 /
 
Hali midenkinek!
én csak most tanulgatom az i2c-t
ds1621 és PIC16f877 közt
és elég jól haladok vele viszont
kiolvasáskor az első bájtot megkapom
és utána kellene egy ACK-ot küldenem a DS1621 ugye?
majd a következő bájt érkezése után pedig egy NACK kellene ha jól értem. Ezeket assemblyben hogy kell megoldani?

próbáltam az ACK-ot így:

BANKSEL SSPCON2 ; BANK1
BCF SSPCON2,ACKDT ;ACKEN BIT ALACSONYRA ÁLLÍTÁSÁVAL ACK JEL KERÜL KÜLDÉSRE
BSF SSPCON2,ACKEN ;KIKÜLDI AZ ACK JELET
BTFSC SSPCON2,ACKEN ;UGRIK, HA 0
GOTO $-1 ;HW TÖRLI AUTOMATIKUSAN. LÁSD REGISZTER LEIRASABAN.
BANKSEL SSPCON ; BANK0


viszont ezután a 2. bájt ugyanaz mint az első
pedig az nem lehet.
Mi lehet a gond?
hogy lehet ezt megoldani?

válaszokat előre is köszi
üdv.: tibiiii00
(#) Mate78 válasza tibiiii00 hozzászólására (») Nov 1, 2009 /
 
Az ACK küldés jónak tűnik.NACK-ot akkor kell küldened, ha már nem akarsz több adatot fogadni a slave -től.Utána jön egy stop.

üdv
(#) tibiiii00 válasza Mate78 hozzászólására (») Nov 1, 2009 /
 
kösz a választ
de sajna nem működik
mert a 2. bájtra is ugyan az mint az elsőre
pedig az vagy 00000000 vagy 10000000 lehet
na agyalok rajta még kicsit
(#) balogpepe hozzászólása Nov 15, 2010 /
 
Sziasztok!

Arra a kérdésre keresem a választ, hogy ugyanazok a DS1621 szenzorok miért működnek pc-ről akár 30 méter vezetéken, és miért nem működnek piccel csak 30 cm-ig? Sajna vettem egy csomó ilyet, hogy majd a ház fűtését ezzel vezéreljem, eddig pcről olvastam őket, csak most ért a meglepetés
(#) icserny válasza balogpepe hozzászólására (») Nov 15, 2010 /
 
Nem tudom, hogy nem az-e a probléma, hogy a PIC-nek esetleg magasabb a billenési szintje. Vagy kis árammal hajtja meg a vezetékeket (lassú a felfutás).
(#) balogpepe válasza icserny hozzászólására (») Nov 15, 2010 /
 
Hát igen, ilyenkor szkóp nélkül nehéz boldogulni. A pc-s megoldást ezen oldal alapján csináltam. Azzal próbálkoztam, hogy a pic-en e felhúzó ellenállásokat kicseréltem 2k-ra az eredeti 4,7k helyett,de nem segített. A másik érdekesség, hogy ugyanezzel a piccel ugyanezen a vezetéken 1-wire (DS1820B) viszont működik 4,7k ellenállással is.
Következő: »»   1 / 2
Bejelentkezés

Belépés

Hirdetés
XDT.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