Fórum témák
» Több friss téma |
Fórum » Szoftveres I2C PIC18F4550 és DS1621 között
Témaindító: gyengus, idő: Jan 27, 2008
Témakörök:
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!
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.
Hogyan lassítsam le?
Jut eszembe MPLAB C18 fordítót használok.
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
Idézet: „Mivel az ICD2 szinkron busz” ez csak egy elírás volt, mert az ujjad már teljesen ráállt
Máshonnan nem tudod belinkelni? Esetleg csak a szükséges fájlokat? NOD32 szerint NewHeur_PE vírus van benne.
Pl. így:
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.
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.
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
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?
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ő.
A0-A2. Én a DS1621 cím bemeneteire gondoltam.
É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 .
Megnéztem az első hozzászólásodnál feltett kódot. A DS1621 init részében ezt írod
Idézet: 0x02 helyett írj 0x01-et! Úgy mennie kell. „byte_out(0x02); // 00000010 configba írás (folyamatos mérés) -ben”
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.
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!
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
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.
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.
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
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.
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
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
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
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
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).
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.
|
Bejelentkezés
Hirdetés |