I2C Slave
I2C Slave
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?
Hogyan lehetne egy I2C slave eszközt készíteni tiny2313-al?
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.
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.
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)
- 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)
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
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
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?
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?
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ő.
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ő.
I2C Slave TWI módban.
A mintaprogi:
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:
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!
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
Fontos! Az I2C cím csak páros szám lehet! A TWAR regiszter 0. bitje: 0!
Re: I2C Slave
Ü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?
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?