segunda-feira, 11 de julho de 2016

Forma simples para gravar o Arduíno ATMEGA8
 sem o Boot.

alvaroluiz@live.com
http://alvaroluiz.tech/Alvaro_2/Arduino/AlvaroLuiz_Digital.html

Estou alguns anos fazendo projetos com AVR, tanto em assembler como C, lá por volta do ano 2002, não tinha muita coisa aqui no Brasil, então desenvolvi meu próprio barramento SPI para gravar o AVR, e também fiz um software para PC no DOS na ocasião para gravar um arquivo HEX no AT90S2313 que é o mesmo núcleo AVR. 


As coisas evoluíram e a ATMEL cresceu com a família AVR, eu resolvi aderir a essa técnica, mas como já tinha o meu próprio barramento SPI (Meu Padrão) resolvi mante-lo, fazendo adaptadores.



Passei para gravar no soft Poney, depois fui para AVR910, mas com a chegada do USB, comprei o chinês PROGISP 172, que uso até hoje. 

Desenvolvo o software ASM ou C no ASTUDIO4, depois gravo o AVR via ProgIsp172. 


Resolvi ir para o ARDUINO, por ser agora mundial e muito rico em software, ótima biblioteca publica isto tudo gratuito, veja no http://arduino.cc. Ficará surpreso com tantas informações e artigos disponíveis. 




Resolvi fazer a forma mais simples do Arduíno com o ATMEGA8, que funciona muito bem. 


 Faço o software no IDE do ARDUINO ou Astudio4, compilo vejo se está tudo certo vou no Sketch ->Exportar Binário Compilado ou (Ctrl+Alt+s) criará na pasta do projeto (de trabalho), o arquivo com este carrego o gravador PROGISP172 ou qualquer outro e gravo o ATMEGA, não precisa do boot porque grava via SPI. 



O Arduíno tem 14 Pinos de I/O e 6 AnalogInput. O led green ligado no D13 como no Arduino. O próprio VCC do Conector “Meu Padrão” USB, alimenta o ATMEGA. Poderá ser ATMEGA8, 168 ou 328 tipo P. Principal vantagem deste circuito é que atende o ATMEGA 8/168/328 tipo P (dual in line) com o ASTUDIO4/5/6/7 da ATMEL (tanto assembler como C), WINAVR da GCC e o ARDUINO. Tudo isto de um hardware muito simples de poucos componentes. Realmente na minha opinião, o que vale a pena no ARDUINO é sua rica BIBLIOTECA, com inúmeras funções, que auxilia desenvolvimento, matemática, shift-registers, código mais simples, aceita o padrão GCC. Ex: posso escrever: 




           digitalWrite(13, HIGH); 

ou 
           PORTB |= 1<<5;
ou
           PORTB = 0x20;  // 0b00100000
     
 Mistura de ASTUDIO com ARDUINO.



Circuito eletrônico. 

Pode ser ligado uma fonte externa de 5 VCC o diodo para separar as alimentações, ou externa da USB, se tirar o diodo 1n400x poderá causar problemas, pois a alimentação USB irá para fonte externa, poderá ter um dreno de corrente não esperado.
Lembrar que se for usar o SCI (serial) do monitor serial do ARDUINO deverá ser cristal de 16MHz, se for ATMEGA8 deverá ser o  ATMEGA8-16PI. Pode ser que seja necessário um pullup para D0(RXD), ou seja, um resistor de 1K a 4K7 do pino 2 ao VCC, o mesmo poderá ser necessário para o RESET pino1.




Observe que pode operar com ou sem cristal, se não necessitar de  precisão de tempo como comunicação serial, poderia ser utilizado o RC interno do chip, acertando os fusíveis conforme desenho acima à direita, quando usarmos cristal se for 16MHz deverá ser o ATMEGA8-16PI, outros tipos só operam no máximo com 8MHz.
Cuidado porque uma vez ajustado fusível para cristal externo, sem ele não funcionará na gravação SPI, será necessário colocar qualquer cristal e programar novamente os fusíveis para o chip operar.
  ---------------------------------------------------------------------------------------------
O exemplo abaixo meio complexo envolve prévios conhecimentos, mas coloquei este para destacar o que falei no parágrafo anterior. 

A seguir um sketch feito para no STUDIO4, foi passado para o ARDUINO com pequenas modificações, 

setup() 
loop()                // mas não mudou muito e o compilador ARDUINO aceitou. 


Veja que foi ativado a interrupt (ISR) do timer1. 

ISR (TIMER1_OVF_vect) {
 
Este sketch é só um esboço de ensaios e estudos, não tem objetivo funcional, 
ativa ISR TIMER1 que o LED ligado na saída 13 (PORTB5) em 100Hz. A frequência realmente é 200Hz por causa do Excluse OR divide por 2.

PORTB ^= _BV(ledPin); 

Interessante que fiz uma mistura do ASTUDIO4, WINAVR e ARDUINO e tudo ficou bem. 

Este ensaio me convenceu que vale a pena o ARDUINO, não vou perder nada e tenho que estudar somente configurações e montagens do sketch. Observe que só mudou setup() e loop().





Curiosidade: Dois estudantes da Universidade Norueguesa de Tecnologia e Ciência Alf-Egil Bogen e Vegard Wollan desenvolveram um microcontrolador RISC  (AVR) com memória de programação flash. A ATMEL em 1997 comprou a idéia e lançou o primeiro produto AVR o AT90S1200, foi um sucesso, é o núcleo AVR de hoje.

avr-gcc. gcc é o GNU Compiler Collection.
Chama-se de avr-gcc toolchain o conjunto da ferramentas envolvidas na geração do HEX a partir dos fontes em C.
Se você usa Windows, baixe e instale o WinAvr. Se você usa GNU/Linux, aqui tem alguns links. Para os usuários Mac, o site da ladyada tem um tutorial (o site também tem tutoriais para Windows e Linux).

Alguns links sobre o avr-gcc toolchain:

http://www.nongnu.org/avr/
http://www.nongnu.org/avr-libc/
http://www.gnu.org/software/binutils/
http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC
http://www.avrfreaks.net/wiki/index.php/Documentation:AVR_GCC/AVR_GCC_Tool_Collection
  




Um exemplo simples feito para ensaio deste.


Podemos também apresentar uma formar Mais Simples só que sem cristal com RC interno no máximo de 8MHz.


 A seguir aprensento a função dos pinos de programação ISP. Observar que quando ele for programado com cristal externo, para ser reprogramado ele deverá ter pulsos XTAL1 ou ligar um cristal de qualquer valor nos pinos XTAL 1 e  2.  Se foi programdo na última vez com RC interno não haverá necessidade.





Foram tiradas as ligações para simplificar o desenho, mas tem-se que ligar o todos os 6 pinos do conector a direita. VCC com pino 7, GND com pinos 8 e 22. MOSI->pino 17, SCK->pino 19, RST->Pino1, MISO->18. 

Ideia para PCI