Ir ao conteúdo
  • Cadastre-se

Tutorial de programação Basic para AVR's


Posts recomendados

Aphawk, tenho umas sujestões... Você poderia colocar no tutorial, exemplo de comunicação I2C com um RTC, serial e também um de conversão analógica digital (se você julgar necessário, é claro), estou meio sem tempo, mas vou tirar uns 40 minutos por dia, ai nas férias arregasso tudo.

No esquema do primeiro projeto, os leds estão ligados no portc0 e portc5, mas no programa configura eles para o portc.1 e portc.0, uma dúvida, simulei o circuito aqui no proteus e ele roda certinho, os leds piscam, mas ficou lento, o que pode estar errado? Configuração dos fuses, tem que configurá-los no proteus?

Aphawk, você é professor?

Valeu ai, muito obrigado.

Link para o comentário
Compartilhar em outros sites

Test man,

Eu vou fazer algo simples para ilustrar o uso de conversor D/A tipo R/2R, só para dar uma ideia de como se faz, ok ?

E na sequência, vou também colocar um exemplo com uma memória flash serial I2C e visualizar nos displays de 7 segmentos e converter o valor para analógico no R/2R. Vou colocar um transistor com um LED na saída do R/2R, assim poderemos ver a variação de brilho de acordo com a variação da tensão de saida do conversor.

Quanto ao exemplo que voce falou, no tutorial, realmente eu comí bola .... o desenho está errado, vou alterar o tutorial ainda hoje. Ou altero o desenho, ou altero o programa e os comentários....Tá vendo o porque que eu não faço um livro ????? Preciso de um revisor ..... é muito difícil quem escreve achar os próprios erros ! Aliás, o que aconteceu foi o seguinte, durante os testes, acabei ligando errado o pino do AVR, e foi ligado para o terra em vez de ir ao Led. Com isso , danifiquei o pino de saída do AVR, e ele não funcionava mais, acabei mudando o LED para um outro pino e corrigí o programa, mas acabei mantendo o pino errado no desenho...

Não sou professor não, alguns amigos aqui no CDH tiram um sarro e me chamam de mestre, mas sou um simples engenheiro, e como hoje a eletrônica é um hobby para mim, não custa passar o que aprendí a quem se interessa.

Vou colocar esses 2 exemplos que voce me pediu até a semana que vem, ok ?

Um abraço !

Paulo

Link para o comentário
Compartilhar em outros sites

Valeu, meu amigo !

Sempre gostei de ensinar, mas da minha maneira pessoal, tentando fazer o leitor entender um pouco de todo o projeto junto, tento dar a visão de conjunto. Acho que só assim se aprende a projetar alguma coisa,

Já está feita a correção no tutorial, e os novos experimentos devo terminar até domingo, ok ?

Aliás, acho que vou fazer melhor, tem uma dúvida que quase sempre o pessoal me pergunta no outro tutorial sobre os PIC´s, que é como usar o LM35 para medir as temperaturas, e como tem uns truques para isso, acho que vou fazer um único projeto com tudo isso, um termômetro que grava a temperatura na memória serial I2C a cada minuto, e depois apresenta uma tensão de saída proporcional à temperatura no conversor digital-analógico R/2R, tipo 0 a 5 volts para temperaturas entre 0 e 50 graus. Vou implementar também uma saída para controlar algo externo, tipo um aquecedor, e outra saida para um resfriador, a finalidade é tentar manter a temperatura controlada. Só que neste caso talvez só fique pronto depois de domingo, afinal pretendo viajar sábado e só brincar no protoboard no domingo.... Mas, como sempre, depende do tempo, e pelo frio e garoa que está, num sei não....

Quanto ao PROTEUS, não espere exatidão na temporização, afinal ele é um EMULADOR. Os tempos sempre vão ser bem maiores do que deveriam.

Bons estudos !

Paulo

Link para o comentário
Compartilhar em outros sites

Mestre Paulo,

Sobre o assunto de sair processando sinais com AVR, eis aqui de onde eu tirei a base da bagaça toda, achei la no AVR freaks,

Creio que esteja de fácil assimilação:

http://instruct1.cit.cornell.edu/courses/ee476/Math/avrDSP.htm

Qualquer duvida a respeito do algoritmo estou a disposição.

Abs.

Link para o comentário
Compartilhar em outros sites

Alguem ai por favor da uma ajuda..

Bom estou utilizando o bascom pra realizar a leitura de uma anemômetro, até ai super fácil a conversão de analógico pra digital mais fácil impossível.

Porém preciso pegar esse dado e realizar um tratametno matemático nele e hj quando fui faze isso .. supresa ... o bascom me deu um baile.

Vou explicar o que eu fiz..

temos um conversor de 10bit, porém não preciso disso tudo então simplesmente trunquei os dois bits menos significativos, e joguei isos numa variavel, porém na hora de tratar matematicamente esse conteúdo o bascom não me deixa usar funções tipo w=(x/255)*5 ele ja acusa erro de sintaxe, certo fomos ao modo lusitano, passo por passo , w=x/255 , ok, w=w*5, ok sintaxe ok, porém na hora q verifico o conteudo de w ele me retorna NAN.

Passei horas hoje tentando descobrir o que ta acontecendo e nenhuma resposta.

Por favor alguem da um help ai.

valeu

Rodrigo

PS. top usando o ATMEGA8

Link para o comentário
Compartilhar em outros sites

Vamos lá :

Declare a variável que vai receber o valor do ADC como Long, assim voce pode fazer até numeros fracionários nas contas.

Após a sua leitura do ADC, divida ela por 4, e é a mesma coisa que truncar os 2 bits LSB. Mas lembre que agora sua escala vai de 0 até 255 !

Nas contas, lembre-se da regra de ouro :

APENAS UMA OPERAÇÃO MATEMÁTICA EM CADA LINHA !

Em vez de w=(x/255)*5 , ( supondo que w e x sejam Long ! )

Faça w = x/255 E na próxima linha : w =w*5

Já ví que voce tentou isto, não sei o porque não deu certo. Mude essas variáveis para o tipo Long, ok ?

Se voce já fez isso tudo, pode ser problema de STACK , voce teria de mudar o stack do programa caso use estruturas do tipo subrotina chamando outra subrotina.

Veja se dá certo agora, senão poste o seu programa e eu vou simular para ver onde está o erro.

Um abraço.

Paulo

Link para o comentário
Compartilhar em outros sites

APENAS UMA OPERAÇÃO MATEMÁTICA EM CADA LINHA !

Paulo

Paulo, mestre dos magos, isso se aplica também a linguagem C, fiz um programa que uma equação não me dava a resposta certa de jeito algum, sendo que ele estava certa, bem como a declaração de variáveis, e em uma mesma linha, tinha cerca de 6 operações... Deve ser por isso né, por isso que eu sempre digo ESSE FÓRUM É ÓTIMO.

Link para o comentário
Compartilhar em outros sites

Pois é, Test man, eu também sofrí uma barbaridade com isso, a gente se acostuma e acha que os compiladores são iguais às calculadoras HP !!!!!

Já tive erros desse tipo, tanto no Bascom, como no PSI, e demorei pacas para achar, e era exatamente isso que estava acontecendo !

A grande vantagem do BASCOM é que os AVR´s possuem MUITO mais RAM do que os PIC´s, e quase sempre declaro todas as variáveis ( que serão envolvidas em qualquer tipo de conta ) como LONG, ganho um bom tempo na depuração !

Valeu pelo comentário, realmente não sabia que o C também tem esses problemas, vai ajudar muita gente !

Paulo

Link para o comentário
Compartilhar em outros sites

uhnn infelizmente so poderei realizar o teste segunda feira no laboratorio, mas ja adiantando algumas coisa, eu ja tinha feito isso, apenas uma operação por linha porém ainda continuavca com o erro mas eu tinha declarado como double e não me lembro agora se declarei todas como double, mas segunda assim q fazer o teste eu posto aqui os resultados.

valeu Paulo brigadão.

Link para o comentário
Compartilhar em outros sites

Valeu, Playmobil,

Olha, no manual do BASCOM diz que o próprio compilador se encarrega de converter os dados de um tipo de variável para outro tipo, quando voce faz algum cálculo com tipos diferentes... mas comigo não deu certo, por mais de uma vez.

Faz o teste, e se continuar estranho, poste o programa que eu tento rodar aqui comigo ok ?

Um abraço.

Paulo

Link para o comentário
Compartilhar em outros sites

Sim isso mesmo se voce declara x como integer e c como byte e atribui x a c ele automaticamente faz a conversão retirando os menos significativos, uso isso isso no adc declarei w como byte e fiz w=getadc.

o adc é de 10 bits mas ele automaticamente joga pra 8 bits.

facilita e muito isso.

Link para o comentário
Compartilhar em outros sites

Sim isso mesmo se voce declara x como integer e c como byte e atribui x a c ele automaticamente faz a conversão retirando os menos significativos, uso isso isso no adc declarei w como byte e fiz w=getadc.

o adc é de 10 bits mas ele automaticamente joga pra 8 bits.

facilita e muito isso.

Opa .... tem certeza disto ?

No Bascom os Integer vão de -32768 a +32767 .... nao sei como ele irá atribuir um número negativo a um byte.

Isto veio do manual do Bascom :

In BASCOM-AVR when you perform operations on variables they all must be of the same data type.

long = long1 * long2 ' for example

The assigned variables data type determines what kind of math is performed.

For example when you assign a long, long math will be used.

If you try to store the result of a LONG into a byte, only the LSB of the LONG will be stored into the BYTE.

Byte = LONG

When LONG = 256 , it will not fit into a BYTE. The result will be 256 AND 255 = 0.

Of course you are free to use different data types. The correct result is only guaranteed when you are using data types of the same kind or that result always can fit into the target data type.

Eu mesmo já testei de Long para Word, e de Long para Byte, ambas funcionaram.

No caso que voce citou :

w=getadc onde w é do tipo byte

Pode acontecer a mesma coisa do exemplo do Long=256 virar 0 em uma variável tipo Byte.

Se o valor do ADC for 512, também pode acontecer ser w=0.

Me parece que para que a sua expressão w=getadc funcione, o valor retornado deve ser menor do que 255.

Acho que o que é garantido mesmo é isto, que também tirei do manual :

SINGLE CONVERSION

When you want to convert a SINGLE into a byte, word, integer or long the compiler will automatic convert the values when the source string is of the SINGLE data type.

integer = single

You can also convert a byte, word, integer or long into a SINGLE by assigning this variable to a SINGLE.

single = long

Pelo menos eu já usei eem um programa e funcionou direitinho ....

Bom, vai saber se realmente funciona sempre .....o jeito é evitar usar estas conversões, se for possível !

Manda bala nos testes e informa a gente !

Paulo

Link para o comentário
Compartilhar em outros sites

Então Paulo essa função que eu usei w=getadc com w sendo byte, funcionou perfeitamente, coloquei na entrada o valor max do adc e ocorreu tudo como eu queria, gravei no uc e coloquei pra roda deu tudo certo, não houve erro de nenhum tipo. mas bom vou fazer o que voce me falou trabalha w como long pra evitar erros.

valeu

Link para o comentário
Compartilhar em outros sites

Pessoal, fiz um controlador de temperatura para aquário, com memória do valor de setup, e alarme em caso da temperatura demorar muito para subir, usando como sensor um LM35 .

Estou fazendo o Upload do novo Tutorial, lá está o circuito completo ( menos a fonte de 5 volts .... ) e o código fonte comentado em Basic.

Aproveitei e expliquei como funciona uma rotina para cancelar ruidos induzidos vIa 60 Hz, e mostrei o uso de um amplificador de sinais para baixa tensão de alimentação.

Bons usos !

Paulo

Link para o comentário
Compartilhar em outros sites

Aproveitei e expliquei como funciona uma rotina para cancelar ruidos induzidos vIa 60 Hz, e mostrei o uso de um amplificador de sinais para baixa tensão de alimentação

.

Noise cancelling, isso me interessa, pode ser ate portugol, vou correr e pegar meu exemplar da apostila =D

Abs.

Link para o comentário
Compartilhar em outros sites

Felipe, é uma técnica simples e objetiva, para uso em ruidos induzidos pela rede elétrica de 60 Hz !

No caso em questão, como tenho de medir variações de 10 milivolts, e usando um cabo coaxial de mais de 1 metro, cai que nen uma luva.

Isso é um método que desenvolví quando trabalhava com instrumentação, em 1985 .... veio meio de estalo, quando usamos um APPLE II para fazer o log das leituras dos conversores A/D e fizemos uma plotagem na tela, o resultado era uma variação nítidamente senoidal, com período igualzinho à da frequência de 60 Hz, daí que veio o estalo !

Como dica, quanto maior for a quantidade de leituras, melhor é a precisão, se quiser , em vez de 8 leituras, use umas 16 , se tiver precisão na temporização, na estatística seu resultado será cada vez melhor.

Bons usos !

Paulo

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Opa , valeu paulo to de volta pra da o feedback, bom funcionou o que você me falou, porém agora não irei mais implementar o processamento no uC, vou deixar isso pro pc faze.

Mas agora tenho outra dúvida, tava dando uma olhada nos modos SLEEP, e achei um interessante já que estou usando o adc e quero minimizar o consumo de energia, você saberia me dizer se durante o modo sleep "ADC Noise Reduction Mode", ele consergue gravar na eepron sem sair do modo?

Link para o comentário
Compartilhar em outros sites

  • 4 semanas depois...

Mestres Paulo e Felipe....

Atendendo as sugestões e conselhos dos amados mestre (KKKK), estou migrando pro's AVR. Ainda seguindo os pareceres de você's, vou adquirir o kit de desenvolvimento da microgenius para o ATMEGA16 e recomeçar a batalha do inicio. Tinha previsto essa migração um pouco mais adiante quando tivesse explorado mais profundamente os recursos dos PICs porém tornei a baixar o tutorial atualizado dos AVR's e seguir em frente, mesmo que pulando etapas no PIC, porém pelo nível dos integrantes do forum e principalmente pelo apoio que tenho obtido de todos resolvi enfrentar a fera (os AVR's).

Logo, logo vou ter um montão de dúvidas e perguntas sobre os esses bichinhos que parecem uma centopeia mas que dão uma alegria grande quando a gente consegue fazer eles obedecerem.

Um abraço a todos...

IAS

Link para o comentário
Compartilhar em outros sites

Playmobil,

Legal, menos um problema. Eu ví um programa na Internet, que fazia a comunicação serial e já guardava em uma planilha de Excel, o fonte tava em VB, mas deve ser bem fácil de modificar para o seu uso. Só não me lembro aonde que encontrei,acho que foi no AVRFreaks, vou tentar achar de novo e te falo.

IAS,

Sábia decisão ! Embora eu ainda não esteja afiado como gostaria no Bascom, conte comigo para ajudar o que voce não entender, ok ?

Felipe,

Mais uma vez, meu amigo, obrigado pelo seu apoio ao Fórum !!! Saiba que no hardware e nas soluções de programas e idéias voce faz uma ajuda inestimável para todos nós ! Conto com voce também aqui para ajudarmos ao pessoal interessado em aprender.

Ah, aproveitando esta conversa, vou comprar 4 PGA's em DIP, se quiser te passo até duas peças. Tenho até amanhã para colocar pedido, comprei um monte de coisa interessante na SPARKFUN e na NCK ( sensores de corrente tanto de alta como de baixa, sensores de luminosidade, sensor de pressão, sensor de umidade, detetor de luminosidade com filtro RGB, CI que aprende qualquer código IR via controle remoto e tem uma saída quando recebe esse código, rotary switchs, mais um monte de coisinhas, ) e até um daqueles DSO nano para mim. Só ainda não definí a compra os pot digitais, é difícil achar eles em formato DIP ou PDIP para uso nos protoboards.... achei da XICOR, mas achar eles em algum distribuidor que venda pequena quantidade tá complicado !

Qualquer coisa me fala ok ?

Um abraço a todos !

Paulo

Link para o comentário
Compartilhar em outros sites

Felipe,

Ainda não sei o valor final aqui, pois como está vindo com um monte de outras pecas, vou calcular pelo total. Mas vai ser o custo na Mouser, mais o frete que eles cobram para entregar em Miami, e mais algum custo pequeno para chegar aqui na importação. Comprando 4 peças, o custo FOB sai em torno de US$ 10 se não me engano, vou ver o frete e te passo tudo junto.

Vou comprar de qualquer jeito, sem compromisso nenhum ok ?

Um abraço.

Paulo

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...