rendered paste body #define usart_baudrate 9600L
#define usart_bauddivider (F_CPU / (16*usart_baudrate) - 1)
#define usart_HI(x) ((x)>>8)
#define usart_LO(x) ((x)& 0xFF)
void
init_usart(void){
UBRRL = usart_LO(usart_bauddivider);
UBRRH = usart_HI(usart_bauddivider);
UCSRA = 0;
UCSRB = 1<<RXEN |1<<TXEN |1<<RXCIE|0<<TXCIE|0<<UDRIE;
UCSRC = 1<<URSEL|1<<UCSZ0|1<<UCSZ1;
}
#define twi_baudrate 10000L
#define twi_bauddivider (F_CPU / twi_baudrate - 16) / 2
#define twi_PORT PORTC // Порт TWI (С по умолчанию)
#define twi_DDR DDRC
#define twi_SCL 0 // Биты соответствующих выводов
#define twi_SDA 1 // тоже по умолчанию
#define twi_ADC_Address 0b10010010
void
init_twi(void){
//twi_PORT |= 1<<twi_SCL|1<<twi_SDA; // Включим подтяжку на ноги
//twi_DDR &=~(1<<twi_SCL|1<<twi_SDA);
TWBR = twi_bauddivider; // Настроим битрейт
TWSR = 0x00;
ISR (USART_RXC_vect){
switch (UDR){
case 'r': TWCR = ( 1<<TWINT|
0<<TWEA |
1<<TWSTA|
0<<TWSTO|
0<<TWWC |
1<<TWEN |
1<<TWIE );
break;
case 'b': buffer_index=0;
UDR = buffer[0];
UCSRB|=(1<<UDRIE);
break;
default :
break;
}
}
ISR (USART_TXC_vect){
}
ISR (USART_UDRE_vect){ //
buffer_index ++; // Увеличиваем индекс
if(buffer_index == buffer_MAX){ // Вывели весь буффер?
UCSRB &=~(1<<UDRIE); // Запрещаем прерывание по опустошению - передача закончена
}
else{
UDR = buffer[buffer_index]; // Берем данные из буффера.
}
}
// TWI ////////////////////////////////////////////////////////////////////////
ISR(TWI_vect){ // Прерывание TWI.
switch(TWSR & 0xF8){ // Отсекаем биты прескалера и агализируем TWSR
case TW_BUS_ERROR:
{
TWCR = 0<<TWSTA|
1<<TWSTO|
1<<TWINT|
1<<TWEN|
1<<TWIE; // Go!
break;
}
case TW_START:
{
TWDR = (twi_ADC_Address & 0xFE); // Адрес слейва + запись
TWCR = ( 1<<TWINT|
0<<TWEA |
0<<TWSTA|
0<<TWSTO|
0<<TWWC |
1<<TWEN |
1<<TWIE ); // Go!
break;
}
case TW_REP_START:
{
TWDR = (twi_ADC_Address | 0x01); // Адрес слейва - чтение слейва
TWCR = ( 1<<TWINT|
0<<TWEA |
0<<TWSTA|
0<<TWSTO|
0<<TWWC |
1<<TWEN |
1<<TWIE ); // Go!
break;
}
case TW_MT_SLA_ACK: // Был послан SLA+W получили ACK
{ TWCR = ( 1<<TWINT|
0<<TWEA |
1<<TWSTA|
0<<TWSTO|
0<<TWWC |
1<<TWEN |
1<<TWIE ); // Go!
break;
}
case TW_MR_SLA_ACK: // Послали SLA+R получили АСК.
{
TWCR = ( 1<<TWINT|
1<<TWEA |
0<<TWSTA|
0<<TWSTO|
0<<TWWC |
1<<TWEN |
1<<TWIE ); // примем байт и скажем потом ACK
break;
}
case TW_MR_DATA_ACK : // Приняли байт.
{
buffer[buffer_index] = TWDR; // Забрали его из буфера
buffer_index++;
if (buffer_index <= 3) // Если остался еще один байт из тех, что мы хотели считать
{
TWCR = 0<<TWSTA|
0<<TWSTO|
1<<TWINT|
1<<TWEA|
1<<TWEN|
1<<TWIE;
}
else
{
TWCR = 0<<TWSTA|
1<<TWSTO|
1<<TWINT|
1<<TWEA|
1<<TWEN|
1<<TWIE; // следующий байт, а в ответ скажем АСК
}
break;
}
}
int
main(void)
{
init_io();
init_usart();
init_twi();
sei();
while(1){
}
return 0;
}