Fórum témák
» Több friss téma |
Sziasztok!
Adott két AVR, amelyek között I2C kommunikációt kéne megvalósítanom. Egy ATtiny2313 lenne a szolga, és egy ATmega128 a mester. Vagyis a tiny generál valami 8 bites adatot, amit a mega128-nak kellene kiolvasnia (amikor a PC odaér) A mega128 nem használhat megszakítást, prioritási okokból. Ezért nem használhatok USART-ot sem, pedig az már jól működött (míg be nem tettem a program többi részét). Az ötleteket előre is köszönöm!
Csak egy tipp. Használj SPI-t mert az gyorsabb. Én már csináltam pont Atmega128 és Tiny2313 közt. Csak a chip selectet szoftverből kell megvalósítani.
Ok ez is felvetődött, de a lábakkal is spórolnom kellene. Ezért jó lenne két lábat használni.
Viszont a 2313 fele nem kéne kommunikálni, szóval elég lenne egy CLK, meg egy DO. Ezt eddig csak szoftveresen csináltam. Menne ez a hardveres USI-val is?
Na SPI kilőve... rosz helyen van a mega128-on
![]() A port foglalt, és hardver okokból nem tudom szabaddá tenni...
Hát akkor két lehetőség maradt. Szoftverből megcsinálni az SPI-t vagy marad az I2C. Sajnos nem emlákszem azt hardverből támogatja-e a mega. Azzal mi a gond, amiért nem megy?
Sziasztok!
Na jó, feladtam. Nem szokásom utánajárás és gondolkodás nélkül fórumba kérdezni, de most kénytelen vagyok. Adott két Atmega644 (pont ez volt kéznél) mcu. Szándékom egyszerű: tömb adatait I2C-n átküldeni a-ból b-be. Amikor egy adatcsomagot szeretnék átküldeni, az rendben van (legalábbis működik) ... amint a mellékelt file-ok mutatják. De én nem egy csomagot, hanem többet szeretnék átküldeni. Próbáltam mindenféle ésszerűnek tűnő ACK várásos, ciklusos programokkal, de egyszerűen nem jutottam tovább. ![]() ![]() MT és SR üzemmódot használtam és a LED-ek, csak tesztelés célját szolgálták.
A mega128-al meg tudod oldani megszakítás nélkül is a I2C kommunikációt. Ezzel csak az a gond, hogy amíg kommunikálsz feltartja a program futását, de ha ez nem gond, mert gyorsan (> 100kHz) és rövid adatmennyiségig kommunikálsz, akkor a megoldás, hogy kiadod a Start parancsot úgy, hogy beírod a TWI status regiszterébe a START bitet. Aztán while() ciklusokkal figyeled a TWI Interrupt Flag-jét, amikor jelez, hogy interrupt lenne, akkor kiolvasod a TWI Status biteket és ennek megfelelően kezdődhet a ciklus előröl. Valahogy így gondltam:
Folytatás..
Helyesbítve (sorry) :
|
Bejelentkezés
Hirdetés |