You are on page 1of 24

Comunicao Serial

ATMEGA16
Microprocessadores e Arquitetura de
Computadores

Prof. Vilson R. Mognon

Principais mtodos

Serial RS232

SPI: Serial Peripheral Interface

I2C: Inter-Intergrated Circuit

Serial RS232

Comunicao ponto a ponto


Linhas de TX e RX cruzadas
Assncrona - sem clock (necessidade de negociao de velocidade)
Multi-dispositivos possvel com uso de mais portas

TX
RX

RX
TX

Dispositivo

TX
RX

RX
TX

Dispositivo

Processador

Barramento SPI:
Serial Peripheral Interface

Comunicao Mestre Escravo


Comunicao Sncrona
Possibilidade de vrios dispositivos
Linhas de MISO, MOSI, CLK comuns para todos os dispositivos
Linha de CS individual para cada dispositivo
CLK
MISO
MOSI
CS

CLK
MISO
MOSI
CS

Dispositivo

Dispositivo

CS

CLK
MISO
MOSI
CS

Dispositivo

CS

CLK
MISO
MOSI
CS

Processador

Barramento I2C

Sncrona linha de clock


Comunicao Mestre Escravo
Possibilidade de vrios dispositivos conectados no mesmo barramento
Linhas de SDA e SCL comuns com todos os dispositivos
Seleo do dispositivo atravs de endereamento lgico
Resistores de pull-up no barramento (Sadas em coletor/dreno aberto)
VCC

Processador

Sensor

Memria

RTC

SDA
SCL
5

Porta Serial USART


Formato do Frame

1 start bit
5, 6, 7, 8, or 9 data bits
no, even or odd parity bit
1 or 2 stop bits

UDR:

Registrador de Recepo (leitura)


Transmisso (escrita)
6

Porta Serial USART


Configurao

RXC : Flag de recepo completa


TXC : Flag de transmisso completa
UDRE: Flag de indicao de buffer vazio

Somente deve-se escrever em UDR com este flag setado

U2X: Dobra velocidade de transmisso


MPCM: Comunicao multi-processador
FE: Frame error
DOR: Data OverRun
PE: Parity Error
7

Porta Serial USART


Configurao

RXEN : Habilita recepo


RXEN : Habilita transmisso
UCSZ2 : Configura nmero de bits no frame
RXCIE: Habilita interrupo de recepo
TXCIE: Habilita interrupo de transmisso
UDRIE: Habilita interrupo de buffer livre
RXB8 e TXB8: nono bit de dado

Porta Serial USART


Configurao

URSEL : Deve ser escrito 1 quando acessando UCSRC


UMSEL : Seleciona modo: (0) assncrono e (1) sncrono
UPM1:0 : Seleciona paridade

USBS : Configura stop-bit: (0) 1 stop-bit e (1) 2 stop-bits


UCPOL : seleciona borda do clock em comunicao sncrona,
9

Porta Serial USART


Configurao

UCSZ1:0 : Configura nmero de bits no frame

10

Porta Serial USART


Velocidade

URSEL : Deve ser 0 quando na escrita de UBRRH

UBRRH : UBRRL = Juntos formam o registrador UBRR, utilizado


para configurar a velocidade de comunicao serial, segundo a
equao determinada pelo bit U2X =>

11

Porta Serial USART


Velocidade

12

Porta Serial USART


Cdigo
//******************************************************************************
//
Inicializa UART - comunicao com o PC, baud = 9600
//------------------------------------------------------------------------------

void init_uart(void)
{
//
//
//
//

Communication Parameters: 8 Data, 1 Stop, No Parity


USART Receiver: On
USART Transmitter: On
USART Mode: Asynchronous

UCSRA=0x02;
UCSRB=0x18;
UCSRC=0x86;

UBRRH = 0;
UBRRL = 0xCF;

// USART Baud Rate: 9600

13

Porta Serial USART


Cdigo
//******************************************************************************
//
Envia um caracter pela porta serial
//------------------------------------------------------------------------------

void uart_putchar(char x)
{
while( ! UCSRA_UDRE );
UDR = x;
}

// trava enquanto buffer tx est cheio


// transmite aps buffer livre

//******************************************************************************
//
Envia um string pela porta serial
//------------------------------------------------------------------------------

void uart_string(char * ptr)


{
while( *ptr)
{
uart_putchar(*ptr++);
}
}
//******************************************************************************
//
Recebe um caracter pela porta serial
//------------------------------------------------------------------------------

char uart_getchar()
{
while (! UCSRA_RXC )
return UDR;
}

// trava enquanto no h byte recebido


// retorna valor

14

Barramento I2C

Incio e fim da transmisso pelo mestre do barramento


START - uma transio de AltoBaixo na linha SDA enquanto SCK alta
STOP - uma transio de BaixoAlto na linha SDA enquanto SCK alta

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

Seleo do dispositivo da comunicao pelo endereo escravo de 7 bits


Endereo Escravo

Descrio

1010 XXX

EEPROM

1001 XXX

Sensor de temperature - TMP100

0111 00X

Universal LCD driver for low multiplex rates

1101 000

Real Time Clock DS1307

Protocolo [ write_word ]

Protocolo [ read_word ]

17

Barramento I2C

Exemplo com TMP100 - Configurao

18

Barramento I2C

Exemplo com TMP100 Leitura da temperatura

19

I2C = TWI no Atmega


Registradores de configurao

Configurao da velocidade (padro = 100kbps ou 400kbps):


TWBR : valor de 8 bits
TWPS : valor de 2 bits no registrator de status

20

Registrador de Controle

TWCR : registrador de controle


TWINT = Flag de interrupo
TWEA = Enable Acknowledge
TWSTA = Start
TWSTO = Stop
TWWC = Write Collision Bit
TWEN = Enable TWI
TWIE = Interrupt Enable

21

Cdigo
//*****************************************************************************
//Inicializao da I2C
//----------------------------------------------------------------------------void i2c_init()
{
PORTC |= 3;
DDRC |= 3;

// SDA e SCL como nvel alto


// SDA e SCL como sada

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

You might also like