I2C mezi atmega16 a attiny2313

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#31 Příspěvek od vasek125 »

Jak vlastně ovlivňuje tato frekvence "provozuschopnost" procesoru? Ten procesor pak stíhá méně práce nebo to na to nemá vliv, když se používají zabudované funkce pro USI/TWI?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#32 Příspěvek od Andrea »

vasek125 píše:Jak vlastně ovlivňuje tato frekvence "provozuschopnost" procesoru? Ten procesor pak stíhá méně práce nebo to na to nemá vliv, když se používají zabudované funkce pro USI/TWI?

Vzhledem k tomu, že vysílání a příjem je dělán sekvenčně s čekáním, tj. procesor je po celou dobu vysílání/příjmu zaneprázdněný, tak při vyšších rychlostech se spotřebuje méně času procesoru, protože operace vyslání/příjmu proběhne rychleji.
Uživatelský avatar
vasek125
Příspěvky: 132
Registrován: 13 říj 2005, 00:00

#33 Příspěvek od vasek125 »

Tak po bajtech to jede hezky. Jak se dá přenášet text? V kódu pro i2c master je
messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.

messageBuf[1] = TWI_CMD_MASTER_WRITE; // The first byte is used for commands.

messageBuf[2] = 'A'; // The second byte is used for the data.
messageBuf[3] = 'C';
messageBuf[4] = 'T';
messageBuf[5] = 'I';
messageBuf[6] = 'V';
messageBuf[7] = 'E';

TWI_Start_Transceiver_With_Data( messageBuf, 8 );

Takto to šlo zkompilovat bez problémů. Otázka zní: přenese se to a bude to na slave čitelné? Dále jak to mám na slave přečíst? Takto to nefunguje:

temp = USI_TWI_Receive_Byte();
if (temp=="ACTIVE") { bitSet (PORTB, 0); }

Nejspíš porovnávám neporovnatelné datové typy a umístění v paměti. Zde je funkce starající se o příjem:
unsigned char USI_TWI_Receive_Byte( void )

{

unsigned char tmptail;

unsigned char tmpRxTail; // Temporary variable to store volatile

tmpRxTail = TWI_RxTail; // Not necessary, but prevents warnings

while ( TWI_RxHead == tmpRxTail );

tmptail = ( TWI_RxTail + 1 ) & TWI_RX_BUFFER_MASK; // Calculate buffer index

TWI_RxTail = tmptail; // Store new index

return TWI_RxBuf[tmptail]; // Return data from the buffer.

}

Jak mám ten text "ACTIVE" přečíst?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#34 Příspěvek od Andrea »

vasek125 píše:temp = USI_TWI_Receive_Byte();
if (temp=="ACTIVE") { bitSet (PORTB, 0); }

Nejspíš porovnávám neporovnatelné datové typy a umístění v paměti. Zde je funkce starající se o příjem:
unsigned char USI_TWI_Receive_Byte( void )

Porovnáváš unsigned char s řetězcem (což je asi pointer na char, nevím, v C neumím :oops: ), USI_TWI_Receive_Byte, jak už název napovídá, vrací jen jeden byte. Takže si budeš muset napsat fci, která bude postupně číst znaky z USI a porovnávat je s řetězcem. Nebo si uprav ty funkce pro USI_TWI, aby vracely přijatý řetězec, když přijde Stop.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“