sexta-feira, 24 de abril de 2015

Controlando o Angulo de disparo dos Triacs com ARM

Neste projeto, meu aluno de pós-graduação na Unisal de Campinas, o Eng. Carlos Noel, escreve um firmware para controlar o ângulo de disparo de uma senóide através de um tiristor (Triac) para  a placa Launchpad Tiva, com o microcontrolador TM4C123G.

O Firmware foi escrito para o compilador uVision KEIL, versão 4.7.4  (arquivo MDK474) e testado em uma Placa Launchpad Tiva da Texas.

O controle de ângulo de disparo foi testado e o screenshot da tela do osciloscópio é mostrado a seguir:
Tela do scope mostrando o disparo do tiristor com ângulo de 135 graus.

Neste link (abaixo) o firmware completo. Para abrir, instale o compilador Keil uVision, versão 4.7.4, na versão gratuita:

domingo, 19 de abril de 2015

Duas ótimas Apostilas sobre ARM Cortex M4

Aqui neste link, duas ótimas apostilas baseadas na Placa Tiva TM4C123G da Texas (microcontrolador ARM Cortex M4).

A primeira, em português, de autoria do colega Stéfano Andrade de Souza, de Juiz de Fora-MG e a segunda de autoria da TTO - Techincal Training Organization, escrita em inglês:

2 Apostilas sobre ARM



domingo, 12 de abril de 2015

Projeto para Monitoramento de Temperatura usando a Tiva

Projeto que faz o Monitoramento de Temperatura a partir de um sensor com LM35, usando a placa Tiva Launchpad da Texas.  Projeto dos alunos Alvaro Schiavolin Jr. e Thiago Brunetto Baradel, do Curso de pós-graduação em Eletrônica Embarcada da Unisal - Campinas

Link consertado

Usando uma interface SPI para ler dados a partir de um SD card

Alguns alunos me pediram um exemplo de código em C, escrito para o compilador Keil uVision, capaz de se comunicar utilizando uma interface SPI na placa Tiva Launchpad da Texas, que utiliza o microcontrolador TM4C123G.

Então, aqui vai o exemplo,extraído do livro do prof. Jonathan Valvano.
Como usar sua Tiva Launchpad para implementar uma Interface SPI e ler dados a partir de um cartão SD card.  Projeto completo, aqui:
Link para o Projeto de Interface SPI

quinta-feira, 2 de abril de 2015

Usando os registradores que manipulam os PORTs no Arduino

A Placa do Arduino UNO tem a seguinte Pinagem (os quadradinhos em rosa mostram os numeros dos pinos adotados pelos fabricantes de Arduino):


Sabemos que o coração do Arduino é o chip Microcontrolador ATmega328 fabricado pela ATMEL.
Este chip, que é quem efetivamente manda nesta placa, tem a seguinte  pinagem, com seus 3 PORTs (B, C e D):


Os registradores de PORT permitem de manipulação mais rápida dos pinos de  I/O do microcontrolador em uma placa Arduino.
Ao invés de usar DigitalWrite( ) e DigitalRead( ), é vantajoso usar diretamente os registradores DDRx, PORTx e PINx.
 Os chips usados ​​na placa Arduino (o ATmega8 e ATmega168) tem três PORTS:

PORT B (pino digital de 8 a 13)
PORT C (pinos de entrada analógica)
PORT D (pinos digitais 0-7)
Cada PORT é controlada por três registradores, para os quais também são definidas variáveis ​​na linguagem Arduino.

O registrador DDR, determina se o pino é uma entrada ou saída.

O registrador PORT  controla se o pino está em nivel alto (1) ou em nivel baixo (0),
e o registrador PIN lê o estado dos pinos definidos como entrada usando-se a função pinMode ().

Os pin-outs dos chips ATMega8, ATmega168 e ATmega328 mostram os PORTS.

O chip mais moderno ATmega328P (que equipa o Arduino UNO) segue a mesma pinagem do ATMega168.

Os registradores DDR e PORT podem ser tanto de escrita e leitura.

Registradores PIN são apenas para leitura.

PORTD está mapeado no Arduino para os pinos digitais 0-7
-------------------------------------------------------
PORTD mapeia os pinos 0 até 7 da placa do Arduino;

DDRD - Port D Data Direction Register - leitura/escrita
PORTD - Port D Data Register - Leitura/escrita
PIND - Port D Input Pins Register - somente leitura
-------------------------------------------------------
PORTB mapeia os pinos 8 até 13. Os dois bits mais altos (6 e 7) mapeiam os pinos do cristal e não são utilizaveis (uma vez que já tem um cristal de quartzo de 16MHz ligados a eles).

DDRB - Port B Data Direction Register - leitura/escrita
PORTB - Port B Data Register - leitura/escrita
PINB - Port B Input Pins Register - somente leitura
-------------------------------------------------------
PORTC mapeia os pinos ANALOGICOS 0 até 5.
Pins 6 e 7 somente são acessiveis no Arduino Mini

DDRC - Port C Data Direction Register - leitura/escrita
PORTC - Port C Data Register - leitura/escrita
PINC - Port C Input Pins Register - somente leitura

Cada bit destes registradores correspondem a um único pino do chip.

Por exemplo, o bit mais baixo (bit 0) de DDRB, PORTB, e PINB refere-se ao pino PB0 (pino digital 8).


Para um mapeamento completo dos números de pinos do Arduino para PORTs e bits, consulte o diagrama para o chip em questão: ATmega8, ATmega168. (Note que alguns bits de um PORT  pode ser usado para outros fins diferentes de I/O).
Seja cuidadoso para evitar de mudar os valores dos bits dos registradores correspondente a eles.

Exemplos:

Referindo-se aos pinos do diagrama acima, os registradores PORTD controlam pinos digitais de 0 até 7 do Arduino.

Você deve observar, no entanto, que os pinos 0 e 1 são utilizados para comunicação serial para programação e depuração do Arduino.
Deve-se evitar mudar os registradores que controlam estes pinos, a menos que seja necessário para as funções de entrada e saída serial.
Esteja ciente de que mudanças na configuração destes pinos pode interferir com o download do programa ou de depuração.

DDRD é o registrador de controle de direção para PortD (pinos digitais 0-7 do Arduino).
Neste registrador de controle, os bits definem as entradas ou saídas, por exemplo:

DDRD = B11111110;            // Define pinos 1-7 como saídas, o pino 0 como entrada.

DDRD = DDRD | B11111100;  //  Este modo é mais seguro, uma vez que define os pinos 2-7 como saídas
                                                  //  Sem alterar o valor dos pinos 0 e 1, que são RX e TX, usados na                                                            // comunicação serial


PORTD é o registrador que controla o estado das saídas.

 Por exemplo;

PORTD = B10101000;             // Ajusta os pinos digitais 7,5 e 3 com nivel ALTO

Você medirá 5 volts nestes pinos somente se tais pinos foram definidos como saídas usando o registrador DDRD ou a função pinMode( ).

PIND é o registro de entrada. Ele vai ler todos os pinos de entrada digitais ao mesmo tempo.



-------------------------------------
Por que usar a manipulação de PORT no Arduino ?

 Aqui estão alguns dos aspectos positivos de acessar diretamente os registradores que controlam os PORTs:

Você pode precisar de ser capaz de comutar pinos muito rapidamente, ou seja, dentro de frações de um microssegundo.
 Se você olhar para o código-fonte em lib / metas / arduino / wiring.c, você vai ver que digitalRead( ) e digitalWrite( ) utilizam cada um cerca de uma dúzia de linhas de código, que são compilados em muito poucas instruções de máquina.
Cada instrução de máquina requer um ciclo do clock de 16MHz, o que pode adicionar delays indesejáveis em aplicações sensíveis ao tempo.
O acesso direto ao PORT pode fazer o mesmo trabalho em um número bem menor de ciclos de clock.
Às vezes pode ser necessário definir vários pinos de saída, exatamente no mesmo tempo.
 Chamando digitalWrite (10, HIGH); seguido por digitalWrite (11, HIGH); fará com que o pino 10 vá para o nível alto vários microssegundos antes pino 11, o que pode confundir certos circuitos digitais externos sensíveis ao tempo de borda de subida.
Alternativamente, você pode setar os dois pinos em nivel alto, exatamente ao mesmo tempo no tempo usando PORTB | = B1100;
Se você estiver com pouca memória de programa, você pode usar esses truques para tornar seu código menor.
Ela exige muito menos bytes de código compilado para escrever simultaneamente um grupo de pinos de hardware ao mesmo tempo através dos registradores de portas do que gastaria usando um loop "for" para definir cada pino separadamente.
 Em alguns casos, isso pode fazer a diferença entre o seu programa caber na memória flash do microcontrolador utilizado no Arduino.