Professional Documents
Culture Documents
ATMEGA16
Microprocessadores e Arquitetura de
Computadores
Principais mtodos
Serial RS232
Serial RS232
TX
RX
RX
TX
Dispositivo
TX
RX
RX
TX
Dispositivo
Processador
Barramento SPI:
Serial Peripheral Interface
CLK
MISO
MOSI
CS
Dispositivo
Dispositivo
CS
CLK
MISO
MOSI
CS
Dispositivo
CS
CLK
MISO
MOSI
CS
Processador
Barramento I2C
Processador
Sensor
Memria
RTC
SDA
SCL
5
1 start bit
5, 6, 7, 8, or 9 data bits
no, even or odd parity bit
1 or 2 stop bits
UDR:
10
11
12
void init_uart(void)
{
//
//
//
//
UCSRA=0x02;
UCSRB=0x18;
UCSRC=0x86;
UBRRH = 0;
UBRRL = 0xCF;
13
void uart_putchar(char x)
{
while( ! UCSRA_UDRE );
UDR = x;
}
//******************************************************************************
//
Envia um string pela porta serial
//------------------------------------------------------------------------------
char uart_getchar()
{
while (! UCSRA_RXC )
return UDR;
}
14
Barramento I2C
15
Barramento I2C
Transferncia de dados:
a linha de dados SDA deve ficar estvel durante o perodo de clock alto
os dados somente podem mudar no estado baixo de SCL
Bit mais significativo primeiro
Ao fim de 8 bits segue o bit de ACK / NACK gerado pelo dispositivo
16
Barramento I2C
Descrio
1010 XXX
EEPROM
1001 XXX
0111 00X
1101 000
Protocolo [ write_word ]
Protocolo [ read_word ]
17
Barramento I2C
18
Barramento I2C
19
20
Registrador de Controle
21
Cdigo
//*****************************************************************************
//Inicializao da I2C
//----------------------------------------------------------------------------void i2c_init()
{
PORTC |= 3;
DDRC |= 3;
TWDR = 0xFF;
TWCR = (1<<TWEN); // Habilita "Two Wire Interface"
TWSR = 0x00;
TWBR = 72;
// Select Prescaler of 1
// SCL frequency = 16000000 / (16 + 2 * TWBR * 1) = 100 khz
22
Cdigo
//*****************************************************************************
//
Espera operao da i2c completar
//-----------------------------------------------------------------------------
void i2c_wait()
{
uint16_t count=500;
while( !( TWCR & (1<<TWINT) ) )
{
if (!--count)
return; // tratar erro
};
}
//*****************************************************************************
//
Condio de Start
//-----------------------------------------------------------------------------
void i2c_start()
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
i2c_wait();
}
//*****************************************************************************
//
Condio de Stop
//-----------------------------------------------------------------------------
void i2c_stop()
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
}
23
Cdigo
//*****************************************************************************
//
Escreve byte
//----------------------------------------------------------------------------uint8_t i2c_write(uint8_t byte)
{
TWDR = byte;
TWCR = (1<<TWINT) | (1<<TWEN);
i2c_wait();
// espera terminar a transmisso
return (TWSR & 0xF8);
// Return TWI Status Register, mask the prescaler bits (TWPS1,TWPS0)
}
//*****************************************************************************
//
Leitura de um byte
//----------------------------------------------------------------------------uint8_t i2c_read(uint8_t ack)
{
TWDR = 0x55;
if (ack)
{
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
// dummy write with ack
}
else
{
TWCR = (1<<TWINT) | (1<<TWEN);
// dummy write
}
i2c_wait();
return TWDR;
}
24