Fórum témák

» Több friss téma
Fórum » I2C AVR-ek között
 
Témaindító: Slope, idő: Szept 6, 2007
Lapozás: OK   1 / 1
(#) Slope hozzászólása Szept 6, 2007 /
 
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!
(#) Gory válasza Slope hozzászólására (») Szept 6, 2007 /
 
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.
(#) Slope válasza Gory hozzászólására (») Szept 6, 2007 /
 
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?
(#) Slope válasza Slope hozzászólására (») Szept 6, 2007 /
 
Na SPI kilőve... rosz helyen van a mega128-on

A port foglalt, és hardver okokból nem tudom szabaddá tenni...
(#) Gory válasza Slope hozzászólására (») Szept 7, 2007 / 4
 
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?
(#) Lúd-fi hozzászólása Szept 20, 2010 /
 
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. Át tudná valaki írni a mellékelt programomat úgy, hogy egy tömb adatait küldje kifelé? Kéremszépenlégyszíves!
MT és SR üzemmódot használtam és a LED-ek, csak tesztelés célját szolgálták.
(#) nrg válasza Slope hozzászólására (») Szept 20, 2010 /
 
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..
(#) nrg válasza nrg hozzászólására (») Szept 20, 2010 /
 
Helyesbítve (sorry) :

  1. // i2c_TimeOut 0-ba írását követően ISR-ből bizonyos idő múlva beáll 1-be
  2.  
  3. void i2cStart( void ) {
  4.     i2c_TimeOut=0;
  5.     TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);  
  6.     while (!((TWCR & (1<<TWINT)) | i2c_TimeOut));
  7. }                            
  8.  
  9. void i2cStop( void ) {
  10.     TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
  11. }                                          
  12.  
  13. void i2cWrite( uint8_t data ) {
  14.     i2c_TimeOut = 0;
  15.     TWDR = data;
  16.     TWCR = (1<<TWINT) | (1<<TWEN);
  17.     while (!((TWCR & (1<<TWINT)) | i2c_TimeOut));
  18. }
  19.  
  20. unsigned char i2cRead( uint8_t ack ) {
  21.     i2c_TimeOut = 0;
  22.     if (ack > 0)
  23.         TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
  24.     else
  25.         TWCR = (1<<TWINT) | (1<<TWEN);
  26.     while (!((TWCR & (1<<TWINT)) | i2c_TimeOut));
  27.     if (i2c_TimeOut) {
  28.         return 0;
  29.         }
  30.     else
  31.         return TWDR;
  32. }
Következő: »»   1 / 1
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