Posts Tagged “microcontrolador”

Protocolo de Comunicação I²C

Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos.

1. Introdução

Para explorar todos os benefícios dos sistemas e dispositivos eletrônicos, os engenheiros e projetistas visam melhorar a eficiência do hardware e minimizar a complexidade dos circuitos.

Para facilitar esta árdua tarefa surgiu o protocolo de comunicação I2C.

O protocolo de comunicação em 2 sinais I2C foi originalmente desenvolvido pela Philips em meados de 1996. Atualmente este protocolo está amplamente difundido e interconecta uma ampla gama de dispositivos eletrônicos. Dentre estes encontramos vários dispositivos de controle inteligente, normalmente microcontroladores e microprocessadores assim como outros circuitos de uso geral, como drivers LCD, portas de I/O, memórias RAM e EEPROM ou conversores de dados.

Muitas vantagens podem ser atribuídas ao protocolo I2C. Destacam-se entre elas:

– Organização funcional em blocos, providenciando um simples diagrama esquemático final.
– Não há necessidade dos projetistas desenvolverem interfaces. Todos os dispositivos integram as interfaces “on-chip”, o que aumenta a agilidade no desenvolvimento.
– Endereçamento e protocolo de transferência de dados totalmente definido via software.
– Possibilidade de inclusão ou exclusão de dispositivos no barramente sem afeta-lo ou outros dispositivos conectados a este.
– Diagnóstico de falhas extremamente simples. O mal funcionamento é imediatamente detectado.
– Desenvolvimento simplificado do software através do uso de bibliotecas e módulos de software reutilizáveis.
– Facilidade no desenvolvimento de placas de circuito impresso, devido a quantidade de interconexões.

Adicionalmente, utilizando as vantagens da tecnologia CMOS na fabricação dos dispositivos, temos:
– Baixíssimo consumo de corrente.
– Alta imunidade à ruidos.
– Ampla faixa de tensões p/ alimentação.
– Ampla faixa de temperatura p/ operação.

2. Características Gerais do Barramento I2C:

– Suporta qualquer tecnologia de produção.
– Duas vias de comunicação: serial data (SDA) e serial clock (SCL), ambas bidirecionais, conectadas ao positivo da fonte de alimentação através de um resistor de pull-up. Enquanto o barramento está livre ambas as linhas ficam em nível lógico alto.
– A taxa de transferência máxima é de 100kbit/s no modo padrão (standart), ou 400kbit/s no modo rápido (fastmode).
– Informação de carry entre dispositivos conectados.
– Todo dispositivo possui um endereço único no barramento, independente de sua natureza.
– Qualquer dispositivo conectado pode operar com transmissor ou receptor. Claro que isso depende da natureza do dispositivo – um LCD não vai operar como transmissor, assim como um teclado não operará como receptor. Independente disto, qualquer dispositivo endereçado é chamado de escravo (slave).
– O número de interfaces conectadas fica dependente da capacitância máxima do barramento, que é de 400pF.

3. Definições:
– Transimiter (Transmissor): dispositivo que envia dados através do barramento.
– Receive (Receptor): dispositivo que recebe dados através do barramento.
– Master: dispositivo que inicia a comunicação, gera o sinal de clock e encerra a comunicação.
– Multi-master: vários dispositivos podem controlar o barramento, mesmo sem comprometer a mensagem. Quando isto ocorre temos vários dispositivos operando em modo maste
– Arbitrarion (Arbitrariedade) : procedimento p/ o controle do barramento em modo multi-master. Visa não corromper a transmissão dos dados e perder a sincrioia do clock.
– Sincronização: procedimento p/ sincronizar o clock de um ou mais dispositivos.

4. Comunicação:

4.1 Níveis lógicos
Como o protocolo de comunicação i2c aceita uma ampla gama de métodos de fabricação para os seus dispositivos (CMOS,NMOS,Bipolar,etc.) os níveis lógicos alto e baixo não possuem valores pré-estabelecidos, dependendo diretamente da tenção Vcc de alimentação.

4.2 Validação dos dados
O dado na linha SDA precisa ser estável durante o período ALTO do clock. A mudança entre os níveis lógicos alto e baixo só podem ser feitas enquanto a sinal de clock estiver BAIXO.

4.3 Condições Iniciais e Finais
Durante todo o processo apenas dois sinais são caracterizados como condições de START e STOP.

4.4 O procedimento de comunicação do protocolo I2C é extremamente simples. Basicamente temos 6 itens para análise:
– 1. O dispositivo master ajusta a condição inicial.
– 2. O dispositivo master envia 7 bis de endereçamento.
– 3. O dispositivo master envia o 8o bit, RW/
– 4. O dispositivo slave envia o sinal de ACK (Acknowledge)
– 5. O dispositivo master (ou slave) envia pacotes de 8 bits de dados, sempre seguidos de um sinal ACK enviado pelo dispositivo slave (ou master) confirmando a recepção.
– 6. O dispositivo master encerra a comunicação.

Sinais de de dados e clock em um exemplo de comunicação prática:


É importante fazer algumas observações:
1. O endereçamento default é feito com 7 bits, mas existe o modo extendido que possibilita o uso de 10 bits de endereçamento (1024 dispositivos).
2. A quantidade de pacotes de transmissão é controlada pelo dispositivo master, não possuindo um valor máximo definido. Este é um ponto importante a ser observado, pois como os dados sao transmitidos serialmente, na utilização de memórias, perde-se os limites de endereçamento que existem nos dispositivos paralelos.
3. A comunicação pode ser suspensa, simplesmente travando-se o sinal de clock. Isto pode ser útil para efetuar o tratamento de interrupções ou derivados, sem, no entanto, corromper os dados transmitidos.

5. Conclusão
Este pequeno artigo visou fazer um apanhado geral sobre o protocolo de comunicação I2C, tentando demonstrar de modo rápido e didático como funciona este método de transeferência de dados. Documentos com características técnicas mais apuradas podem ser encontrados no site da Philips Instruments ( www.philips.com ).
Aos que já conhecem e utilizaram o protocolo, já estão por dentro das
facilidades. Para os que nunca utilizaram, não deixem de experimentar. Vocês se surpreenderão com as facilidades e agilidades proporcionadas.

Sugestões ou correções no texto acima, contacte-nos através do nosso e-mail .

Roberto Paulo Dias A. Filho
roberto@eletronica.org

Read more »

Conectando 6 LEDs com Apenas 3 Pinos do Microcontrolador

Algumas vezes você precisa de mais do que o que tem. Eeu estou falando sobre os pinos do microcontrolador.

Veja bem: você tem que conectar 6 LEDs mas possui apenas três pinos do microcontrolador disponíveis. Utilizar outro microcontrolador não é sempre uma opção e outros circuitos decodificadores também não.

Esta é uma dica simples de como fazer isso. Conecte os diodos LED ao microcontrolador dessa forma:

 

Agora veja: se você setar o pino um para “1” e o segundo para “0” (deixando o pino 3 no estado de alta impedância, como entrada) então você somente vai acender um LED. Você pode ligar dois leds ao mesmo tempo setando o terceiro pino para o estado “1” ou “0”, dependendo de qual LED adicional você pretende acender.
Se você precisar ligar todos os LEDs ao mesmo tempo, precisará mudar o estado dos pinos em uma freqüência mais alta para evitar a sensação dos LEDs piscando.

Com esse método você pode ligar até doze LEDs com apenas 4 pinos. Este é um método conveniente para ser utilizado com LEDs bicolores, quando dois LEDs são colocados no mesmo encapsulamento, mas em diferentes direções.

Este é um exemplo de código em C para o ARV-GCC de como controlar os LEDs. No exemplo, os LEDs estão conectados na porta B, entre os pinos 0 e 2.

Fragmento da função de controle:


unsigned char leds;           // Os bits são os estados dos leds
void LEDs_refresh(void)
{
static unsigned char state;   // Taxa de atualização atual
OFF();                      // Coloca todos os pinos em alta impedância (entrada)
switch (state)
{
   default:
      CLR_0();                  // Coloca o pino 0 baixo
        if (leds &  1) {SET_1();} // Coloca o pino 1 alto para o led 1
        if (leds &  2) {SET_2();} // Coloca o pino 2 alto para o led 2
        state=1;                  // próximo estado
       break;
  case 1:
       CLR_1();                  // Coloca o pino 0 baixo
        if (leds &  4) {SET_0();} // Coloca o pino 0 alto para o led 3
        if (leds &  8 ) {SET_2();} // Coloca o pino 2 alto para o led 4
       state=2;                  //próximo estado
       break;
    case 2:
       CLR_2();                  // Coloca o pino 2 em nível baixo
       if (leds & 16) {SET_0();} // Coloca o pino 0 alto para o LED 5
       if (leds & 32) {SET_1();} // Coloca o pino 1 alto para o LED 6
       state=0;                 // Próximo estado
       break;
}//end switch
}
Esta função deve ser chamada com freqüência para evitar deixar visível a piscada dos LEDs. O melhor é utilizar a interrupção do timer.

O código completo do projeto está na caixa abaixo para download.

Anexos

Read more »

STM32 Primer

O STM32 Primer é um kit de demostração/desenvolvimento fabricado pela Raisonance. Focado nos microcontroladores com núcleo ARM Cortex desenvolvidos pela ST Microelectronics, este kit oferece um hardware bastante interessante para conhecer os recursos oferecidos pelo microcontrolador.

O microcontrolador central deste kit é o STM32F103RB1, fabricado pela ST Microelectronics com núcleo ARM Cortex M3. Além dos tradicionais LEDs, push-button e buzzer, o kit conta com um display colorido de 128×128 pixel, um acelerômetro de 3 eixos com dois níveis de sensibilidade (  LIS3LV02DL, +-2g/+-6g ), um conjunto de duas pilhas recarregáveis e uma porta USB “device”, disponível para o programador (além da porta “debugger” utilizado pelo gravador/debugger). Na placa também está disponível o local para a montagem de um transmissor/receptor infra-vermelho, mas no kit que temos em mãos este componente não foi soldado. Pontos de conexão com os pinos do microntrolador também estão disponíveis na PCI, facilitando a adição de algum hardware futuro a ser utilizado. Vale ressaltar que a alimentação do conjunto é feita por baterias recarregáveis via porta USB, também já soldadas na PCI.

Todo o conjunto é acondicionado em uma caixa de acrílico circular, que possui um cordão para prender no pescoço, facilitando o transporte durante os testes.



O CD que acompanha o produto trás a IDE da própria Raisonance, o Ride7, prontinho para compilar e debugar a aplicação sem nenhuma configuração extra. Basicamente você instala o aplicativo e pluga o Primer. Após o processo do Windows de detecção do dispositivo USB você pode simplesmente acionar os botões de “Make” e “Start Debugger Session” para começar a depurar o seu aplicativo.

Dois exemplos de “Alô Mundo” são disponibilizados, com o intuito básico de piscar os LEDs da placa. A diferença entre os dois está na utilização ou não do CircleOS, um sistema operacional desenvolvido para facilitar a escrita de aplicativos para a plataforma, que não possui requerimentos de tempo real.

Com o intuito básico de conhecer a API do CircleOS nós escrevemos uma aplicação simples, para capturar os dados do acelerômetro e plotar na tela o resultado dos 3 eixos: X, Y e Z.
As rotinas disponibilizadas pelo CircleOS tornam o acesso ao hardware trivial. Basicamente nós utilizamos as seguintes rotinas:

Display:
1. LCD_SetBackLightOn(): Liga o backlight do display;
2. DRAW_Clear(): Limpa o display;
3. DRAW_Line( x, y, x1, y1, RGB_RED ): desenha uma linha vermelha entre os pontos (x,y) e (x1,y1).
4. DRAW_DisplayString( x,y,”Txt”,3 ): escreve a string de comprimento 3 “Txt” iniciando no ponto (x,y).

Botão:
1. BUTTON_GetState(): captura o estado do botão;

Led:
1. LED_Set ( LED_GREEN, LED_OFF): desliga o led verde;

Acelerômetro:
1. tMEMS_Info *memsInfo = MEMS_GetInfo(): a estrutura tMEMS_Info possui os dados informados pelo acelerômetro e é retornada pela função MEMS_GetInfo.

O código desta pequena aplicação está anexo. A partir da referência de 1G da gravidade, foi simples calcular a posição para plotar o eixo Z (barra azul sobre a linha indicativa do eixo X significa 1G sobre o eixo Z). A cruz vermelha aponta para o centro do gráfico quando os eixos X e Y estão em 0G. A inclinação do acelerômetro provoca alterações nos 3 eixos em virtude da aceleração da gravidade, como pode ser visto no aplicativo executando:


>



Como nós utilizamos o CircleOS, o gerenciador padrão do sistema operacional continua operacional. Ao iniciar basta selecionar a aplicação em um menu que ela começa a executar.


Um dos pontos fracos do kit é exatamente o fato de possuir apenas um botão para interação com o usuário. No CircleOS o acelerômetro foi utilizado como elemento para navegação entre os menus. A idéia é interessante, mas a implementação ficou a desejar. Leva algum tempo até você acostumar a controlar o menu pela inclinação do dispositivo e fazer isso dentro de um veículo em movimento diminui razoalvelmente o grau de precisão.

Nós efetuamos alguns testes adicionais, como atualizar o sistema operacional CircleOS para a última versão, executar sem o CircleOS e também instalar o FreeRTOS no dispositivo (já existe um port para ele). Nenhum problema foi encontrado, todos os recursos funcionaram da forma esperada.

Conclusão

No geral o kit STM32 Primer é uma alternativa muito interessante para quem deseja aprender mais sobre os microcontroladores STM32 da ST Microelectronics. Segundo o fabricante ele é compatível com 20 chips desta família, tornando-o bastante versátil. O hardware oferecido é extremamente útil para desenvolver e testar aplicações, ao permitir mobilidade e versatilidade na apresentação de informações aos usuários. Se você pretende trabalhar com esta plataforma ou precisa de um dispositivo que agregue as características deste kit para a sua aplicação, vale a pena utilizá-lo.

Read more »