Fórum témák

» Több friss téma
Fórum » I2C assembly kód 16F877-hez
 
Témaindító: cassis, idő: Jún 30, 2009
Témakörök:
Lapozás: OK   2 / 4
(#) Deta válasza Hp41C hozzászólására (») Nov 13, 2009 / 1
 
Szia!

DS 1621 I2C-n. Felrakom ide, hátha jól jön valakinek.

Szia

temp.asm
    
(#) Hp41C válasza Deta hozzászólására (») Nov 13, 2009 /
 
Szia!

A nagyobb kapacitású EEPromok kezelése ettől csak annyiban tér el, hogy a slave cím után két byte-ot kell beírni (írás és olvasási parancsnál), hogy a memória rekeszt megcímezzük.

Egy érdekesség:
16F886-nál a SSPCON regiszter CKP bitje nem használt az I2C master módjában, de nekem a kommunikáció hibásan futott, amikor 1-re állítottam.

Szia
(#) Deta válasza Hp41C hozzászólására (») Nov 15, 2009 /
 
Szia!

Én csak a 16F877-tel próbálkozom. Ehhez van meg a demo panelom, igy mig ki nem növöm nem akarok másikkal kisérletezni, annak ellenére, hogy sokan írták, van már ennél jóval okosabb, könnyebben programozható,stb.!
Igazából több helyről, pl. a lakásban, fóliában, veremben, ill. a kint levő hőmérsékletet szeretném vele mérni, esetleg úgy, hogy pl. egy napra vissza is lehessen keresni. Ez az II2C megoldás jó megoldásnak látszik, mert két szál madzagra fel lehet többet fűzni, és csak a cím módositásával bár melyik olvasható, csak a távolság, ami áthidalható, nagyon rövid.
Jelenleg azt gondolom kivitelezhetőnek, hogy minden mérőponton a DS 1621-et a helyszinen kiolvasom egy PIC-el, és soros vonalon egy központ folyamarosan begyüjti az adatokat. Viszont ezen még van időm rágódni!

Szia!
(#) szSzilard hozzászólása Dec 12, 2009 /
 
Sziasztok!

Meg tudnátok mondani, hogy egy áramkörön belül tudnám- e használni az i2c és spi buszt?(PIC18F4550) Természetesen felváltva.

Köszönöm.
(#) Hp41C válasza szSzilard hozzászólására (») Dec 12, 2009 / 1
 
Szia!

Ha jól értem az a kérdés, hogy egy 18F4550 -nel szeretnél mind a kétféle kommunikációvan kapcsolatot kialakítani további áramkörökkel.

Sajnos ugyan az az egység kezeli a kétféle kommunikációt a kontrollerben. Ettől még lehetne felváltva használni a két fajtát. Az SPI eszköz nem figyeli az adat és az órajel vonalakat, ha a SS bemenete nem aktív, tőle is lehetne felváltva használni. Az I2C eszközökön azonban nincs harmadik - chip kiválasztó - jel, mindig figyelik a két vonalat. Miattuk így nem lehet felváltva használni a két kommunikációt.

Van megoldás: Az MSSI-vel kezeld az SPI áramköröket és programból - más lábakon - kezeld az I2C eszközöket.

16F628-hoz írtam már programozott I2C kezelést.

Szia
(#) potyo válasza Hp41C hozzászólására (») Dec 13, 2009 /
 
Én az SPI-t kezelném szoftverből, mert az egyszerűbb és gyorsabb is, kevesebb szoftveridőt használ el.
(#) szSzilard válasza Hp41C hozzászólására (») Dec 13, 2009 /
 
Szia!

Az órajel demultiplexálásával nem tudom kiválasztani a kommunikációs csatornát?

Köszönöm.
(#) Hp41C válasza szSzilard hozzászólására (») Dec 13, 2009 /
 
Szia!

Sajnos mind a SCLK mind a SDA vonalat meg kellene kapuzni külső átamkörrel (SDA lefutó éle, amikor a SCLK magas => START, SDA felfutó éle, amikor a SCLK magas => STOP). Ráadásul az SDA vonal kétirányú.

Szia
(#) potyo válasza Hp41C hozzászólására (») Dec 13, 2009 /
 
Mondjuk analóg kapcsolóval (74HC4066) meg lehet oldani viszonylag egyszerűen, ha épp muszáj De ha meg lehet oldani szoftverből, akkor inkább abból csinálnám, azért van a mikrokontroller, hogy ami hardvert ki lehet váltani, azt kiváltsuk vele.
(#) icserny válasza Hp41C hozzászólására (») Dec 14, 2009 /
 
A PCA9515A I2C bus repeater is használható a leválasztásra (van neki egy engedélyező bemenete).
(#) Hp41C válasza icserny hozzászólására (») Dec 14, 2009 /
 
Szia!

Sajnos az említett típus majdnem annyiba kerül (~500 nettó), mint a kontroller... Ha nem kell a 3.3V - 5V konverzió akkor, a PCA9510 is megteszi (~200 nettó), de még ennek az ára is összemérhető a kontrollerével.

Szia
(#) pppsss hozzászólása Márc 13, 2010 /
 
Sziasztok!

Most ismerkedem az I2C kommunikációval, és az AN976-ost alapul véve , azt módosítottam úgy hogy csupán byte írás és byte olvasás legyen, a végén összehasonlítással, majd egy-egy LED jelezné a meg ill. nem megfelelőséget.
Itt aztán elekadtam mert a szimulátorban /Protel/ folyamatosan a hibás LED világít és nem tudok rájönni hogy hol lehet a hiba ! Az MPLAB-ban látszólak jól működik ha én módosítom a regisztereket, nem tudom lehet-e máshogyan ezt szimulálni. Megépítettem próbapanelon gondolván hogy majd a PicKit2 Logic Tool-jával megmérem a jeleket /a 4,7 k-s lehúzó ellenállásokat kiszedtem a bemenetről/, hátha sikerül megoldanom a problémát de egyszerűen nem tudom pl. az SSPBUF-ba mi kerül stb. stb. !
Kérlek benneteket hogy fussátok át a kódomat hátha valami kopasz hibát vétettem benne !
Előre is köszi mindenkinek !
PS.

AN976_PS.asm
    
(#) Hp41C válasza pppsss hozzászólására (») Márc 13, 2010 /
 
Szia!

Az SCL és SDA vonalakon van felhúzó ellenállás a pic Vcc tápjához?

Szia
(#) pppsss válasza Hp41C hozzászólására (») Márc 13, 2010 /
 
Szia ! Természetesen van. Kipróbáltam több értékkel is:2,2-4,7-10 kohm-os ellenállásokkal is. Az eredmény ugyan az.
PS.
(#) Hp41C válasza pppsss hozzászólására (») Márc 13, 2010 /
 
Szia!

Az itt leírt kódom megy PCF8583-mal (1 byte word address), az eepromokhoz 2 byte word address kell....

- Mekkora a pic órajele, jó-e a beállítás?
- Milyen eepromot kezelsz?
- Milyen szintek vannak az A2, A1, A0 lábain?
- Milyen szint van a WP lábon?

Szia
(#) dcsabi hozzászólása Márc 14, 2010 /
 
A PCF8583-hoz én is tudok ajánlani egy jól bevált rutint...
I2C_HW_uni_rut
Kb 10 "projektben" müködik kisebb módosításokkal...
(#) pppsss válasza Hp41C hozzászólására (») Márc 14, 2010 /
 
Szia!

Először is köszönöm a segítséget, a válaszok a kérdéseidre sorban:
-4 MHz-es az órajel, a beállítás jó
-24LC256 az eeprom típusa
-az A1, A2, A3, és a WP láb és GND-re van kötve

Odáig már eljutottam a Protelben, hogy minden rendesen működik az írás folyamán végig, az olvasásnál is egészen addig amíg az SSPCON2 regiszter RCEN bitjét 1-be állítom, innentől csupa egyest olvas be az SSPBUF-ba, nem értem mitől lehet !
(#) Hp41C válasza pppsss hozzászólására (») Márc 14, 2010 /
 
Szia!

Az I2C kiolvasó rutinod működik, a jelalak szerint a jó (0xAA) értéket olvassa ki és a kiolvasási képen az RD1 áll 1-re az összehasonlítás után...

Szia
(#) pppsss válasza Hp41C hozzászólására (») Márc 14, 2010 /
 
Szia!

Az igaz, hogy a jelalakok a valóban helyes működést ábrázolják, de a regiszterek értékei /SSPBUF=11111111, datai=11111111, PORTD=00000001/ nem egyeznek ezekkel, ja és a valóságban is a hibás működés tapasztalható.
Van esetleg tipped hogy a PicKit2-vel hogyan tudnám megmérni ezeket a jeleket, vagy a regiszterek értékeit kiolvasni működés közben ?
(#) Hp41C válasza pppsss hozzászólására (») Márc 14, 2010 /
 
Szia!

A PicKit2 "Logic Analizer" módjában fel tudod venni a tényleges jelalakokat. A Tools / Logic Tools / Analyzer...

Szia
(#) cassis válasza Hp41C hozzászólására (») Máj 11, 2010 /
 
ugyan már kihalt a topic, de talán még jól jöhet valakinek miként tudja használni a pickit2 -t Logic Analizer módban.

leírás itt
(#) attila066 hozzászólása Jún 6, 2010 /
 
Sziasztok szeretnék kérdezni az I2C témával kapcsolatban, mert kicsit fent akadtam Általatok mutatott programok segítségével olyan kommunikációt írtam, ami két különböző típusú pic közt zajlik le. Az egyik 16f74 -es (eléggé buta masterre nem igazán lehet alkalmazni, csak szoftveresen, hiányzik az sspcon2 regisztere) a másik 16f877A (ez a master míg a 74 es a slave). A program annyiból áll, tesztelés végett, a master folyamatosan csak elkezdi a kommunikációt, megcímzi a slave-t, ack-t ellenőriz, leálltja a kommunikációt ,és ezt tovább a végtelenségig Illetve ha a slave nem küldött vissza ACK-t akkor a masteren kigyullad egy led , a led akkor alszik ki ha kapott ack-t. Lényegében jól működik a rendszer, attól az apróbb hibától eltekintve hogy kb. 20másodpercenként kigyullad a ledem, tehát valamiért hosszabb időnként egy pillanatra nem ack-z a slave. Az probléma lehet, hogy nekem a felhúzó ellenállásaim , 4,7 k ohm osak? Esetleg lehet hogy kipróbálom 1,8 k val is mindjárt. A másik ami még érdekelne, Ha a slave egységéről lehúzom a tápegységet, akkor eléggé furcsán viselkedik ,nem ég a masteren a ACK vesztés led. Azaz a táp lehúzásánál egy pillanatra felvillan, aztán kialszik. De ha ezekután a panelról lehúzom magát az I2c vezetéket kigyullad a led, ha visszadugom újra elalszik.. Segítségeteket előre is köszönöm!

ui. Úgy teszteltem hogy az i2c vonalat megbontottam azaz lehúztam az egyik egységről, illetve hogy a slave-t reseteltem. Ekkor működik az ACK veszteség jelzése.
(#) attila066 hozzászólása Jún 6, 2010 /
 
Sajnos 2k, val is fentáll az időleges ack- veszteség Semmi ötletem
(#) attila066 hozzászólása Jún 6, 2010 /
 
a meghülyülésre közben rájöttem apukám segítségével, elmagyarázta hogy belül egy ic lába hogy néz ki.. És rájöttem hogy ha egy egységről lehúzom a tápot ne várjam azt hogy lényegében úgy működjön mintha ott sem lenne, mert az i2c visszatáplál neki feszültséget az ic-nek és hibás működést generál. Az még nem oldódott meg hogy időnként nem kap ack-t. Az micsoda hogy átírom a master címzését tehát hogy másik címet küldjön ki, és akkor is úgy néz ki hogy foadja a slave? Na jó megyek átnézem a slave programját..
(#) Hp41C válasza attila066 hozzászólására (») Jún 6, 2010 /
 
Szia!

Az I2C buszon több slave is lehet... Az jelenti szerintem, hogy ne csak a 16F74 slave-vel kommunikáljon, hanem egy másik címen is. Ez a másik cím nem fog válaszolni, mert nincs ott az eszköz, ekkor biztosan nem szabad ACK-t kapni...

- Két ciklus között kivárod-e a minimális időt? A 16F74-ben is program fut, lehet, hogy bizonyos helyzetekben nincs elég ideje a végrehajtásra...
(#) attila066 válasza Hp41C hozzászólására (») Jún 6, 2010 /
 
Hogy érted a minimális időt? a 74-es csak felvan konfigurálva 7bites Slave-nak és elvileg ha megkapja a címét le ack-zna automatikusan ugye, amúgy meg egy végtelen ciklusban forog semmi,goto semmi. Fogalmam sincs hogy egy kamu címmel hívok akkor miért kapok ack-t??-amikor a slave címe tök más . Ha lenne egy kis időd szívesen mellékelem mind a két programot.
(#) Hp41C válasza attila066 hozzászólására (») Jún 6, 2010 /
 
Szia!

Szerintem a SSPIF bitet törölni kell és az SSPBUF regisztert ki kell olvasni mielőttc a következő adat megérkezik. A 16F74 adatlapján a Figure 9-6 szerint nem ad automatinusan ACK-t, ha SSPOV bit ráfutást jelez....

A csak címzésből álló adatátvitel nem szabványos, egy adatot mindenképen át kellene vinni, utána stop helyzetet előállítani. A logika csak a stop után kerül alaphelyzetbe..
(#) attila066 válasza Hp41C hozzászólására (») Jún 6, 2010 /
 
Szia! Én ez alapján indultam ki 9.3.1 "When an address is matched, or the data transfer after
an address match is received, the hardware automatically
will generate the Acknowledge (ACK) pulse, and
then load the SSPBUF register with the received value
currently in the SSPSR register." vagyis ha címegyezés van illetve címegyezés után adat jön, a hardver automatikusan generál egy ack-t. Én ezt szerettem volna kihasználni és erre írtam masterban egy olyan programot hogy start-address-stop.Az egészben az a furcsa hogy vissza ack-z a masternek. Utólagosan beleírtam a te feltételeidet is, de a helyzet változatlan, hiába hogy átmegyek másik címre, ugyanígy vissza ack-z. A cím 1010000-után még küldök egy 01010101-et is. Mostmár a slave főciklusa így néz ki:
I2C_MAIN
BANKSEL PORTC
BSF PORTC,1 ;VISSZAJELZŐ LED, ELJUTOTT-E MÁR IDÁIG
BANKSEL PIR1
BCF PIR1,SSPIF
BANKSEL SSPCON
BCF SSPCON,SSPOV
BANKSEL SSPBUF
CLRF SSPBUF
GOTO I2C_MAIN

De mint mondtam vissza ack-z e nélkül is a slave.
(#) Hp41C válasza attila066 hozzászólására (») Jún 6, 2010 / 1
 
Szia!

Ha még olvasol tovább, ott írják, hogy nincs ACK, ha BF=1 vagy SSPOV=1... Megfordítamám:
  1. I2C_MAIN
  2.  banksel PORTC
  3.  bsf PORTC,1
  4.  banksel SSPBUF
  5.  movf SSPBUF,w ; ez nem ír az SSPBUF-ba, törli a BF-t
  6.  banksel SSPCON
  7.  bcf SSPCON,SSPOV
  8.  banksel PIR1
  9.  bcf PIR1,SSPIF
  10.  goto  I2C_MAIN
(#) attila066 válasza Hp41C hozzászólására (») Jún 6, 2010 /
 
Szia!
Igazad van a TABLE 9-2: - mégjobban rámutat erre. Valamiért ezt eddig figyelmen kívül hagytam. Beprogramoztam azzal amit írtál, és működésben ugyanúgy viselkedik, lényegében bármilyen címet adhatok a slave-nak mindegyikre vissza ack-z:S Nem tudom hogy mi lehet a hiba. Köszönöm szépen az eddigi segítséged is. Esetleg még azt tudnám elképzelni hogy a 74 beállításai rosszak..

SETUP_I2C_SLAVE
BANKSEL SSPCON ; BANK0
MOVLW B'00100110' ;SCL,SDA INPUT- 7BITES SLAVE
MOVWF SSPCON
BANKSEL SSPADD
MOVLW B'10100000'
MOVWF SSPADD
BANKSEL PIE1
BCF PIE1,SSPIE
BANKSEL INTCON
BCF INTCON,PEIE
BCF INTCON,GIE
BANKSEL PIR1
BCF PIR1,SSPIF
BANKSEL SSPCON
Következő: »»   2 / 4
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