I2C Slave

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
pkedvessy
Tranzisztorgyógyász
Hozzászólások: 198
Csatlakozott: 2006. január 1. vasárnap, 7:00

I2C Slave

Hozzászólás Szerző: pkedvessy »

Az alábbi probléma megoldásában kérném a segítségetek!
Hogyan lehetne egy I2C slave eszközt készíteni tiny2313-al?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

I2Cslave library-t kell megvenni a bascmhoz 5 Eur. A www.mcselec.com oldalon van. Itthon nincs forgalmazója:(.

Ahogy olvasgattam, nem az igazi. Minden órajelkor a I2C buszon lefut a chipen 1 megszakítás:(. Így csak szinte a portbillegetésre van lehetőség.

SPI busz nem jó? Az SPIsave részt lehet könnyen implementálni. Az ATTINY2313-ban ez sincsen, így erre a chipre nem járható út.

Vagy ha 1-2 parancsot kell átadni, akkor mehet soros kommunikáció is. Vagy nagyobb távra jó még a RS485 busz is.
Avatar
pkedvessy
Tranzisztorgyógyász
Hozzászólások: 198
Csatlakozott: 2006. január 1. vasárnap, 7:00

Hozzászólás Szerző: pkedvessy »

Értem, köszi!
Akkor marad a soros komunikáció...
lajostoth

Hozzászólás Szerző: lajostoth »

Vendég

Hozzászólás Szerző: Vendég »

Én is szerettem volna összekötni két AVR-t i2c buszon, de miután elolvastam, hogy működik és milyen feltételek mellett, gyorsan letettem róla. Most rs232 porton keresztül beszélget a két chip , több kevesebb sikerrel. van már ily témában valakinek tapasztalata?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Chipek összekötése:
- 2 chip esetén
soros szokott lenni (de ekkor az eltérés nem lehet 1%nál nagyobb, azzaz mindkettő kvarcról kell járjon)
~5-6 m


- több chip nagyobb sebesség:
SPI buszon át, ChipSelecttel
~nyákméret

-több chip kisebb sebesség, de nagy! (~1km!) távolság:
RS485 hardverrel

- több chip közepes sebesség
I2C buszra fűzve a chipeket I2C slaveként használva.

- több chip kis sebesség
rádiós átvitel SPI porton (1...64kbit, max 50m)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Bascom mintaprogi:

SPISoftSlave.bas a samples alatt. Nagysebességű soros adatátvitel....

I2C helyett ez is hasznalhato...
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Hozzászólás Szerző: Atesz »

Kicsit OFF:

Nézegettem az SPI de nem mélyrehatóan. Jól értelmeztem, hogy ahhoz is kell az egyik megszak? INT0 vagy INT1?
A két proci két külön nyákon van és kb 1,5 méter vezeték köti össze őket. Ezesetben az SPI már nem jöhet szób , ugye?
Soros kommunikácót használok. Az egyik procin van kvarc (16MHz), (Mega32) , a másik procin nincs kvarc (belső osc., 8MHz) , (Mega8).
Az adat átviteli sebesség 250000 BAUD (kettőszázötvenezer)!
Még nem tökéletes. De megy. Lehet hogy a Mega8-ra is kellene tennem kvarcot?

Üdv!
Atesz
Robert-

Hozzászólás Szerző: Robert- »

Ez a sebesség kicsit (nagyon) magas. Ekkora soros átvitelnél (ami ráadásul nem órajelhez kötött mint a SPI/I2C) mindenképp kvarcpontosság kell!

Marha nagy mázlid van hogy megy. A főfokfüggés miatt is nagy szerencse....


1,5méter az I2C esetén még csak-csak, de SPIre nem merném feltenni...
Mihez kell ilyen vad sebesség?
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Hozzászólás Szerző: Atesz »

:D :D
Vad sebesség?
Nem kell, csak kibróbáltam. Említettem, hogy építettem már régen, egy disco lámpát, és az DMX512 protokollon keresztül komminikált, és az a szabvány ekkora (250000BAUD) sebességgel megy. Gondoltam, kipróbálom.
:D :D
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

I2C slave tesztelve...
Mega8 az áldozat...

A Bascom mintaprogramok közül az I2CSlave került használatra.
A Tiny2313ra írt példa a i2cslave_pcf8574.bas.

A Tiny2313 szoftver alapon működik. Felejtős, mert _minden_ élre megszakítást generál, azzaz a chip erőforásait lefoglalja:(.

Mega8 esetén a hardveres TWI (I2C) nem visz el processzor teljesítményt, csak amikor adat jön/megy a buszon. Gyakorlatilag a chipnek _van_ energiája a normál működéshez. Nagyon jól kezelhető.
Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00

Hozzászólás Szerző: Atesz »

Megvetted a rutint? :?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Igen.

Borítékos sorsjegyként. Leleveleztem és ajánlott levélként kiutazott az euró borítékban... A nyomtatott levelezésünk mellett...

Sztem érdemes... Szemezek még 1-2 rutinkönyvtárral...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

I2C Slave TWI módban.
A mintaprogi:

Kód: Egész kijelölése

$regfile = "M8def.dat"                                      ' the chip we use
$crystal = 8000000                                          ' crystal oscillator value
'$baud = 19200                                               ' baud rate

'Változók a rutinban
'Twi
'twi_btw
'twi_btr


Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim I As Byte

Dim Goread As Byte
Goread = 0
Dim Gowrite As Byte
Gowrite = 0

Config Twislave = &HF0 , Btr = 2 , Bitrate = 100000
'                   ^--- slave address
'                         ^---------- 2 bytes to receive
'                                     ^--- bitrate is 100 KHz


'The variables  Twi , Twi_btr and Twi_btw are created by the compiler. These are all bytes
'The TWI interrupt is enabled but you need to enabled the global interrupt

'as you might need other interrupts as well, you need to enable them manual

Enable Interrupts

'this is just an empty loop but you could perform other tasks there
Do
  nop
Loop
End

'A master can send or receive bytes.
'A master protocol can also send some bytes, then receive some bytes
'The master and slave must match.

'the following labels are called from the library
Twi_stop_rstart_received:
'  Print #1 , "Master sent stop or repeated start"
Return


Twi_addressed_goread:
Incr Goread
'  Print #1 , "We were addressed and master will send data"
'  Print #1 , "Goread:" ; Goread
Return


Twi_addressed_gowrite:
'   Incr Gowrite
'   Print #1 , "We were addressed and master will read data"
'   Print #1 , "Gowrite" ; Gowrite
Return


'this label is called when the master sends data and the slave has received the byte
'the variable TWI holds the received value
Twi_gotdata:
'   Print #1 , "received : " ; Twi ; " byte no : " ; Twi_btw
   Select Case Twi_btw
     Case 1 : Twi = 1                                       ' first byte
     Case 2 : Twi = 2                                       'you can set another port here for example
   End Select
Return


'this label is called when the master receives data and needs a byte
'the variable twi_btr is a byte variable that holds the index of the needed byte
'so when sending multiple bytes from an array, twi_btr can be used for the index
Twi_master_needs_byte:
'  Print #1 , "Master needs byte : " ; Twi_btr
  Select Case Twi_btr                                       'twi_btw - number of data
    Case 1 : Twi = 13                                       ' first byte
    Case 2 : Twi = 14                                       ' send second byte
  End Select
Return

'when the mast has all bytes received this label will be called
Twi_master_need_nomore_byte:
'  Print #1 , "Master does not need anymore bytes"
Return

Fontos:
Twi változó tartalmazza az adott lépésben vett/küldött byte-t.
Az egyes részrutinokban (Twi_...) ne időzzön sokat a chip.
Pl. a belső 8 MHz órajel eletén, 100 kHz-s busz esetén gond lehet...
Az adatlap a Chip órajele/16 lehet a TWI max. sebessége.
Érdemes a programban a Watchdog-ot bekapcsolni! Ekkor, ha netán végtelen rutinba kerül az időtúllépés miatt a program, akkor sem fagy le! Az újraindulás és inicializálás a TWI továbbműködését eredményezi.
De törekedni kell, hogy ez ne következzen be!


Ha a chipben futásidejű változtatás szükséges, akkor a cím a TWAR regiszter átírásával megváltoztatható. Azzaz ha EEPROMba van letárolva, akkor a program eleje így néz ki:

Kód: Egész kijelölése

Config Twislave = &HF2 , Btr = 3 , Bitrate = 100000
'                   ^--- slave address
'                         ^---------- 2 bytes to receive
'                                     ^--- bitrate is 100 KHz

Dim Cim As Byte                                             'Uj cim Alap:&HF2
Readeeprom Cim , 4
If Cim <> &HFF Then Twar = Cim
Ekkor az EEPROM 4-es címén tárolt érték lesz a I2CSlave chip címe.
Fontos! Az I2C cím csak páros szám lehet! A TWAR regiszter 0. bitje: 0!
Avatar
HPMaster
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2008. március 10. hétfő, 6:00

Re: I2C Slave

Hozzászólás Szerző: HPMaster »

Üdv Urak!

Xmega128A1 procit szeretnék TWI Slave-ként használni. A kérdés az, hogy meg lehet-e játszani valahogy azt, hogy az egyébként több I2C Slave procit magában foglaló címcsoport egy darab AVR-ben kerüljön felhasználásra?

Konkrétan:
Van mondjuk 5 darab slave-ként működő procim és ezeknek a feladatait szeretném include-olni egy Xmegába. Hogyan tudom (ha tudom egyáltalán) elkapni a különböző slave címen működő prociknak küldött parancsokat?
Válasz küldése