Tag Archive for AVR

AVR Testador de Componentes

 

posted by Wagner Lipnharski @ 6:29pmFriday 8 March 2013.

Recentemente na Alemanha um colega desenvolveu um testador de transistores, usando um AtMega8 e seis resistores.  Ele media o ganho e polarização e indicava num LCD.  Semanas foram passando e ele percebeu que poderia também medir resistores, diodos, tensões, e inclusive capacitores.

A coisa cresceu e chamou a atenção de muita gente boa em software e hardware.  Foi criado um thread no forum alemão, e muita gente palpitou e a coisa evoluiu.  Como foi feito na modalidade “open source”, alguns outros colegas aproveitaram e fizeram as suas próprias alterações e implementações.  Surgindo então algumas diferentes versões na net.

Como não poderia deixar de ser, os chineses copiaram a idéia, produziram PCBs montados e os vendem no eBay por valor em torno de $15, o que no fundo é bom e barato.
Abaixo, fotos copiadas do eBay e da net, só para fins ilustrativos, o usuário montou a plaquinha do testador embaixo do LCD, e pode-se ver o teste do resistor de 10 ohms, ligado aos pinos 3 e 1 do conector de teste.
Acima e abaixo, a plaquinha visível, onde dá para ver todos os componentes usados, incluindo transistores que fazer o power on e auto power off após um certo de tempo de inatividade.  Esses componentes de controle de power podem ser eliminados, desde que se use uma chavinha on/off para desconectar a bateria de 9V.
O diagrama desse testador é bem simples, veja a imagem abaixo e o link para o arquivo PDF do diagrama expandido.  Veja que o lado esquerdo contém os transistores e componentes da seção de power on/off que podem ser eliminadas, coisa que explicarei mais a frente.

 

Clique aqui para diagrama expandido.

 

Esse final de semana continuo esse blog, postando versão de software mais moderna com mais funções, e mudanças no circuito, a permitir melhores e mais poderosas funções.  Aguarde.

AtMega128 vs At89s8252 firmware

Pois é, estou desenvolvendo um firmware para uma máquina nova, usando o AtMega128 (Atmel) 16MHz com 256kBytes SRAM externa, 1MB Eeprom externa, etc, mas cada nova rotina deve ser testada, e para isso tem que gravar a Flash do AtMega toda vez… tá bom, a flash dele suporta 10 mil regravações, mas é um saco pensar nisso.   O AtMega128 que estou usando é um TQFP64 soldado na placa de teste, tá bom, é só dessoldar e meter outro, mas, é um saco pensar nisso.

Na época do 8051, usava-se eprom externa, que beleza.  Tinha que apagar, gravar, os cambal, demorava mais, até um dia eu fazer uma engenhoca com SRAM e um código minusculo em eprom.  Na verdade fiz um bootloader, na época que nem se pensava nesse nome.  O código mínimo fazia o 8051 rodar a UART na velocidade mais alta possível aceita pelo PC e esse despejava o novo código a rodar via serial, o 8051 recebia, gravava na SRAM externa e ao final ele mesmo virava um flip-flop e substituia a eprom pela SRAM e o novo código entrava no ar.   Muito rápido e funcional.

Não dá para fazer isso com os AtMega, exceto com um novo chip AVR32 que permite rodar código de memória externa.

A grande vantagem de usar o AtMega128, com 128kBytes de Flash, é que me deixa respirar.   Escrevendo tudo em assembly, é claro, pois *não existe* nenhuma outra linguagem de programação que se possa considerar séria… rsrs… eu sempre me preocupo em reduzir código, reutilizar código, se o mesmo trecho será usado mais de uma vez – passa a ser subrotina, etc e tal.  Essa “neura” consome tempo, e sempre se pensa em fazer um grande código com uma memória flash minuscula.  Não é à toa que tudo o que eu já escrevi na vida, e tem coisa muito complexa, nunca passou de 7kBytes.   Mas agora, com 128kBytes de flash à disposição, eu respiro e a coisa mudou de cor e cheiro, agora eu não mais me preocupo em economizar espaço, nem de Flash, nem de SRAM, e agora eu deito e rolo, me preocupo sim com velocidade de processamento, e tenho medido tudo para garantir que nada mantenha o AtMega ocupado fora do razoável.

Para ter uma idéia, ainda estou na dúvida sobre controlar os displays de sete segmentos, 20 no total, com refresh de 100Hz do AtMega, usando chips 74HC595 e transistores, ou o Max7219, que faz o serviço de refresh sozinho, mas, a rotina do refresh para o HC595 toma só 3.5 microsegundos. Isso é nada, certo?  Simples, eu não faço o bit-bang de mandar bit a bit, eu uso o dispositivo interno do AtMega chamado SPI, é um tipo de serial que pode transmitir a velocidades altíssimas, de no máximo Clock/2, ou seja, 16MHz/2 = 8Mbps, eu soco o byte no registrador da SPI e ela faz o serviço sujo.  Ou seja, 3.5us a cada 10ms, é um overhead de somente 0.035%, com isso garanto que o AtMega estará 99.965% do tempo livre para outras coisas.

Então, com a nova liberdade de flash do AtMega128, hoje eu entendo porque muita gente não gosta de Assembly e prefere C, pois não precisa se preocupar muito com a maneira que o código final ficará, o tamanho dele, a performance, etc.  É mais fácil, mais livre e menos preocupante.

Agora, veja só.   Esse novo firmware que estou escrevendo, parti do scratch, reescrevendo algo que foi escrito para o At89S8252, um 8051 da Atmel, em 1997.  Já está 98% pronto, escrevi em torno de 5 mil linhas de código em assembly e comentários, em menos de 2 semanas, e está ocupando menos de 5kBytes de código, contra os 7k do 8051.

É estranho, que mesmo não me preocupando em economizar espaço, o que escrevo hoje fica menor que o anterior, e então penso, ou o mesmo tipo de código para o 8051 ocupa mais memória que os AVRs, ou depois de 16 anos eu aprendi naturalmente a escrever de forma mais produtiva e inteligente.  Creio que ambos.

O custo de um AtMega128 compensa, pois passa-se a ter 6 e meia portas de 8 bits, (mais de 50 pinos de I/O), 8 ADCs, alguns podendo ser programados para entrada complementar, duas USARTs, PWM de pancada, 128k de Flash, 4k de SRAM interna, 4k de eeprom interna e permite usar SRAM ou I/Os externos como o 8051 o fazia, e acessa-se esses I/Os ou memória externa como uma extensão da interna, maravilha, além de uma carrada de outros dispositivos internos disponíveis.  Ou seja, o AtMega128 vem carregado com tudo que pode, exceto USB e Ethernet.

Eu iniciei nos AVRs brincando com o At90S2313, depois passei para o AtMega8 e naturalmente sai matando o AtMega128.

Tudo bem que uma série de novos chips da concorrência rodam a mais de 50MHz e possuem muita flash, principalmente os novos ARMs da vida.

Mas é muito gostoso trabalhar com um AVR rodando a 16MHz (16 MIPS) e ver a coisa zunir bits à torto e direito.

AVRibe, o protótipo fácil.

Olha só, eu faço muito teste em breadboard, desse tipo abaixo, barra simples, dupla, tripla, o que precisar.  Já fiz muita coisa nesses boards, digital, analógica, e principalmente com microcontroladores.

Mas sempre que uso um microcontrolador, comumente um AVR (Atmel) tipo At90S2313 ou AtMega8, ou AtMega48 ou AtMega88, é um tal de espeta o chip e liga todos os fios e conector enjambrado para fazer a conexão com a gravação ISP, antes de qualquer outra coisa.  Precisava algo mais prático.
Então resolvi fazer uma plaquinha “esperta” de desenvolvimento, que dou o nome de “AVRibe” (averibe) que contenha todo o necessário para o AVR rodar mesmo sem o uso do breadboard, e a idéia é espetar a “AVRibe” no breadboard só mesmo para ter os pinos de I/O e tensões ali disponíveis.
Ficou muito bom e recomendo algo assim para todos.
No do At90S2313 até instalei um segundo jumper de seleção de 5V e 3V, e para gerar os 3V soldei ao AVRibe uma bateria CR123A de 3V e que dura uma eternidade.   Eu quase não uso 3V, mas os displays de Celular da Nokia, tipo 3310, e alguns outros chips, como memória serial, etc, usam 3V e é um saco, então preparei o AVRibe do 2313 para tal.
Na plaquinha tem o soquete para o microcontrolador, cristal, regulador de 5V (7805), jumper de power, referência de 2.5V, LEDs indicativos e conector macho para o jack de uma simples fontezinha 9V 500mA.  Claro que não podia faltar os 6 pinos do conector ISP para conectar o gravador USBASP.
No AVRibe abaixo, com o AtMega8, a construção foi a mesma do At90S2313, porém sem a bateria de 3V, mas contendo jack de power, regulador 7805, uma referência de 2.5V (LM385-2V5), botão de reset e jumper de power (servindo como switch), capacitores, bobininha de filtro para o AVCC, etc.  Note que eu uso barrinha de pinos na parte de baixo, para espetar no breadboard, e uso dois pinos a mais, um de cada lado, para também levar o 2.5V de referência e o segundo para reforçar o terra, e obviamente 6 pinos para o ISP de gravação via USBASP.
Com certeza absoluta eu deveria ter feito isso há muito tempo atrás.
Ah sim, essa coisa branca enrolada nos fios coloridos, é a própria capa do cabinho de onde os fios foram retirados, que foi cortada helicoidalmente com uma tesolurinha, como descascar uma laranja… fica bom para juntar os fios, não fica?