Stránka 3 z 3
Napsal: 20 čer 2009, 12:39
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?
Napsal: 20 čer 2009, 12:58
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.
Napsal: 20 čer 2009, 15:03
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?
Napsal: 20 čer 2009, 15:25
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

), 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.