Ir ao conteúdo
  • Cadastre-se

Tutorial de programação Basic para AVR's


Posts recomendados

Mestre Paulo, dando continuidade ao assunto do analisador de espectro tenho novidades,

estou montando aqui uma FFT simples com AVR de 8 pontos e um sample de 4KSPS, creio que na proxima semana termino o algoritmo e ja posto aqui juntamente com uma explicação simples sobre o metodo butterfly para ajudar o velho mestre, o que ja posso ir adiantando é que a coisa nao é estão complexo quanto parece, o problema é que as explicações nao vem para todos entenderem acho isso um baita preconceito com quem quer aprender.

Aguardem!

Abs.

Link para o comentário
Compartilhar em outros sites

Opa Felipe, agradeço muito mesmo o seu esforço em tentar explicar para todos nós ( especialmente o burro velho empacado aqui .... ) como é esse algoritmo do FFT !!!!

Realmente eu lí mais de dez textos explicativos na Internet, e não consegui entender como implementar o algoritmo !!!

Nem é questão de entender a matemática, a qual nem cabe aqui discutirmos tantas equações complexas, mas simplesmente implementar o programa baseado em um algoritmo !

Aguardo o seu post, e muito obrigado mesmo !!!!!

Paulo

Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Pessoal,

Acabei de atualizar o Tutorial com o projeto de um Frequencímetro até 50 Mhz, bem simples, mas bem preciso e fácil de ser feito, com o software em Basic e todos os comentários explicando o funcionamento.

Se quiserem baixar, o link já está atualizado.

Apenas para dar um pouco de água na boca... segue o esquema em anexo.

Um abraço e bons usos.

Paulo

post-464954-1388495721321_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Grande paulo,

venho mais uma vez com mais um problema...

Estou tentando fazer a comunicação de um dispositivo com o pc pela serial...

porém, não sei porque cargas d'agua, não esta funcionando ja fucei em tudo que é canto e nada, abaixo mando o codigo do que estou fazendo, é coisa simples so pra testar a comunicação, mas mesmo assim nao vai, ja comsegui receber mandando do mC a 9600 e recebendo a 1200.

Desde já obrigado

$regfile = "m8def.dat"

$crystal = 10000000

$hwstack = 32

$swstack = 10

$framesize = 40

$baud = 4800

Dim O As Byte

Config Adc = Single , Prescaler = Auto

Open "comb.2:4800,8,n,1" For Output As #1

Open "comb.1:4800,8,n,1" For Input As #2

Start Adc

Do

O = Getadc(0)

Print #1 , O

Loop

Link para o comentário
Compartilhar em outros sites

Playmobil,

Ué, cade as definições de hardware, os pinos que serão Inputs, e os pinos que serão Outputs ?

Creio que falta isso. Tente isto aqui :

$regfile = "m8def.dat"
$crystal = 10000000
$hwstack = 32
$swstack = 10
$framesize = 40
$baud = 4800

[B]Config Portb = Input
Config Portb.2 = Output[/B]

Dim O As [B]WORD[/B]
Config Adc = Single , Prescaler = Auto
Open "comb.2:4800,8,n,1" For Output As #1
Open "comb.1:4800,8,n,1" For Input As #2
Start Adc
Do
O = Getadc(0)
[B]Print #1 , O ; " "
Waitms 250[/B]
Loop
[B]End[/B]

voce está usando um cristal externo, verifique se programou os Fuses de acordo.

Paulo

Link para o comentário
Compartilhar em outros sites

Paulo,

Quanto a definir os pinos o proprio bascom no seu exemplo não usa, e também quando eu defini a COM eu tb ja define quem é output e quem é input, até porque se você não usar os pinos padrão RX TX do mC você tem q definir input e output.

Quanto ao crystal, o atmega8 vai ate 16Mhz, se não me engano o atemga8L vai ate 8Mhz.

Mas irei dar uma olhada agora de manhã e ja repasso o que eu consegui.

Mais uma vez obrigado

Paulo,

Fiz as alterações que você sugeriu, e mesmo assim recebo sempre o mesmo caractere não importa o que eu coloque no adc sempre recebo no pc a mesma coisa, eu simceramente não sei mais o que fazer.

Fiz uns testes alterando a velocidade do cristal e a cada velocidade do cristal que eu colocava recebia um caracter diferente, mas ainda assim não era o caracter que eu estava esperando.

Sendo assim fico na duvida preciso de uma velocidade de cristal certa pra cada baudrate? isso seria estranho, vou tenta coloca um cristal externo pra ver o que acontece.

Link para o comentário
Compartilhar em outros sites

Ué ... não entendi ...

Se no seu programa voce definiu o cristal como 10 Mhz, voce só poderia estar usando um cristal EXTERNO !!!!!!!!!!!!

O clock interno no Atmega pode ser 1 Mhz, ou 8 Mhz, mas nunca 10 Mhz !

Porisso que te perguntei sobre os FUSES !!!!

Se voce está usando o clock interno, programa os FUSES no Atmega para gera 8 Mhz, e declare no programa $crystal = 8000000 !

Se for usar um cristal externo, também tem de programar os FUSES de acordo com o cristal utilizado, e declarar a velocidade correta no programa.

O Bascom gera o baud rate a partir da frequência declarada do cristal no programa, que TEM DE COINCIDIR COM O CRISTAL !!!!

Caso contrário voce vai ficar doido mesmo .....

Modifique e veja se agora vai, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

Grande Paulo,

deu certo hehe, agora ta funcionandno to recebendo e mandado dados para o mC, agora veio outra dúvida.

Estou tentao armazenar dados na eeprom e depois ler esses dados mas infelizmente o conteudo que o mC esta me mostrando não condiz com o que foi gravado na eeprom, mais uma vez por favor da uma olhada no código:

$regfile = "m8def.dat"

$crystal = 8000000

$hwstack = 32

$swstack = 10

$framesize = 40

$baud = 9600

Dim C As Byte

Dim D As Byte

Dim T As Byte

Dim O As Byte *aqui eu deixei como byte pois so quero 8bits

não preciso dos 10bits do A/D seria o mesmo

que definir como word e dividir por 4

Config Adc = Single , Prescaler = Auto

Config Portb.1 = Input

Config Portb.2 = Output

Open "comb.2:9600,8,n,1" For Output As #1

Open "comb.1:9600,8,n,1" For Input As #2

Start Adc

$eeprom

Label1:

$data

C = 0

T = 0

Do

Input #2 , T

Loop Until T <> 0

Do

O = Getadc(0)

Print #1 , O

Print #1 , T

Waitms 250

Writeeeprom O , Label1

C = C + 1

Loop Until C = 10

Do

Readeeprom D , Label1

Print #1 , D

Waitms 250

C = C - 1

Loop Until C = 0

Mais uma vez obrigado

Link para o comentário
Compartilhar em outros sites

Eu tava estranhando a sua dificuldade, pois RS232 é mais fácil que empurrar bêbado em descida ....

Bom, pelo seu código, voce está querendo armazenar 10 leituras então por que que não reservou 10 endereços na EEprom ??????

Vou te dar uma excelente dica : baixe o Help do Bascom, verifique os exemplos que tem nos comandos Basic, relativos à escritas e leituras em EEPROM, sua resposta está lá !

Seu programa está invadindo áreas que não foram reservadas, porisso o erro !

Repare que nos exemplos são especificados os N bytes para serem guardados os valores, ou seja, voce precisa reservar eles ANTES de usar, pois o compilador utiliza isto para alocar a área exata de EEPROM.

Modifique seu programa para esses 10 bytes no seu caso, que deve funcionar, ok ?

Um abraço !

Paulo

Opa, achei algo estranho :

Do
O = Getadc(0)
Print #1 , O
Print #1 , T
Waitms 250
Writeeeprom O , Label1
C = C + 1
Loop Until C = 10


Do
Readeeprom D , Label1
Print #1 , D
Waitms 250
C = C - 1
Loop Until C = 0

O que que a variável C tem a ver com os seus dados na EEprom ???????????

Tudo está se referindo SEMPRE para o endereço definido em Label1, como isso nunca muda, sempre está vindo o valor mantido em Label1 .... mude isto, indexando o byte A PARTIR de label1 , ok ?

Link para o comentário
Compartilhar em outros sites

Paulo,

então na verdade estou planejando usar toda a eeprom, pra armazenar os dados,

digo irei deixar o mC rodando e certa hora vou la e pego esses dados.

Eu dei uma olhada no help mas em todos os exemplos que eu vi ele ja da o tamanho e já coloca previamente os dados na eeprom.

Eu quero deixar isso em aberto, pode ser que use toda a eeprom, pode ser que use quase toda, não se consegui te passar corretamente o que quero fazer.

Resumidamente a quantidade de dados que será armazenada é aleatória.

Bom quanto a variável C é so um contador.

Até mais,

Rodrigo

Link para o comentário
Compartilhar em outros sites

Ué ... estão define TODA A EEPROM :

Dim buffer(511) As ERAM Byte

DIM b as Byte

DIM i as byte

para ler :

i= 124

b=buffer(i) -> b tem o conteúdo da posição 124 da EEPROM !

para gravar :

i=124

b=adc(0)

buffer(i)=b -> agora, a leitura do ADC está na posição 124 da EEPROM !

Detalhe : sempre tem de usar uma variável comum para ler e gravar dados na EEPROM, ou seja, não pode usar diretamente em nenhuma outra operação, nem fazer contas com ela, nem mostrar no display, nada !!!!!

Primeiro sempre passe o valor da EEPROM para uma variável comum. Lembre sempre disso, ajuda a procurar agulhas num palheiro !

O tamanho da EEPROM muda conforme o AVR, ok ?

Eu percebí que a variável C era só um contador, mas também percebí que o seu programa de ler e escrever na memória EEPROM ignorava totalmente a variável C !!!! Porisso que eu falei aquela observação.

Modifique e teste, ok ?

Paulo

Link para o comentário
Compartilhar em outros sites

ok consegui ler e escreve na memoria sem problemas mas agora estou com um informação de erro fora das linha de código do programa.

erroh.th.jpg

Uploaded with ImageShack.us

sendo que eu não uso essas labels em nenhum lugar tentei degubar isso mas

não consegui descobrir de onde está vindo.

e mais uma vez obrigado

Paulo,

Já achei de onde vinha o erro.

valeu

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Boas,

Sou um novato em AVR, entrei agora novamente na faculdade (passados 10 anos) para finalizar o meu curso e qual o meu espanto quando o professor me disse que agora teria que fazer um projecto no AVR ATMEGA168 em vez do micro 8051.

Precisava da vossa ajuda, existe algum tutorial em C para AVR ? Onde posso encontrar um compilador C para o ATMEGA168 ?

O meu muito obrigado pela vossa ajuda.

Helder Matos

Link para o comentário
Compartilhar em outros sites

Oi Helder,

O compilador C que a turma usa para AVR é o WINAVR, é free !!!! , e um tutorial que já ví recomendarem é este aqui :

http://winavr.scienceprog.com/

Infelizmente em C não posso te ajudar nada, mas tem muita gente aqui no Fórum que é fera em C e AVR. Faça um post no Fórum principal, e veja se aparece alguém para te ajudar, ok ?

Agora, não se assuste com os AVR's, eles são muito mais poderosos que os 8051 que voce conheceu, e incluem um montão de hardware dentro deles por um custo x benefício imbatível.

Boa sorte !

Paulo

Link para o comentário
Compartilhar em outros sites

Paulo, da uma mão aqui ..

bom estou gravando na eeprom, e depois quero ler bom segui o que você me falou outra hora

Dim buffer(511) As* ERAM* Byte

DIM b as word

DIM i as word

DIM c as word

para ler :

i= 124

b=buffer(i) -> b tem o conteúdo da posição 124 da EEPROM !

para gravar :

i=124

b=adc(0)

buffer(i)=b -> agora, a leitura do ADC está na posição 124 da EEPROM !

e estou fazendo assim logico depois de declarar tudo

para gravar

i=0

c=0

do

O=getadc(0)

buffer(i)=O

Inc i

Inc c

loop until c = 511

agora para ler

i=0

c=0

do

b=buffer(i)

inc i

inc c

loop until c=i

to fazendo algo de errado?

porque para escrever ta ok

agora pra ler ele ta caindo num loop infinito

da um help ai

Link para o comentário
Compartilhar em outros sites

Bom eu vou palpitar aqui. Nao uso Basic porém é bem intuitivo pelo visto hehe. Na sua funçao:


i=0
c=0
do
b=buffer(i)
inc i
inc c
loop until c=i

Supondo que com o comando INC voce incremente a variavel em 1....

Por que raios voce quer parar quando c = i???

Eu nao sei quando ele avalia se deve parar ou nao...

Mas na minha visao ele deveria rodar esse look apenas uma vez supondo que ele sempre avalie no final do loop.

Considerendo i e c começando do 0 ... voce incrementa os dois e avalia se sao iguais hahaha.

No basic nao se pode usar FOR ?

Um abs

Link para o comentário
Compartilhar em outros sites

nossa, pra você ver o quanto atordoado eu to eu nem tinha reparado nisso,

mas se tudo der certo depois eu repasso o programa aqui, se alguem achar útil.

Outra dúvida alguem sabe com implementar uma interrupção pera serial, quando ele tiver gravando na eeprom se vier uma interrupção pela serial ele para de faze a conversão a/d.

Link para o comentário
Compartilhar em outros sites

Outra dúvida alguem sabe com implementar uma interrupção pera serial, quando ele tiver gravando na eeprom se vier uma interrupção pela serial ele para de faze a conversão a/d.

Nossa, agora ferrou .... misturou A/D, serial e gravação Eprom .... :confused:

Bom, pelo que entendí, voce está preocupado em perder alguma coisa.

Explique melhor qual é a sua dúvida, se é perder o valor do conversor A/D, ou perder o valor do dado recebido via serial. A gravação na Eprom não tem problema de ser perdida, ok ?

Lembre-se , sempre podemos habilitar ou desabilitar as interrupts na hora em que quisermos, com isso podemos controlar bastante cada processo.

Paulo

Link para o comentário
Compartilhar em outros sites

é a seguinte ..

o mc ta la fazendo a conversao a/d em modo power ADCnoise...

que deixa a eepron o a/d e as interrupcoes ligadas pelo q eu entendi..

quero implementa uma interrupção pela serial para ele parar de realizar a conversao e

reinicializar o sistema, porque atulamente eu to ligando e desligando ele na hora q eu quero para a conversao.

Uma boa parte disso ja está implementada.. já coloquei o mc pra "conversa" com um software q eu fiz no pc,

eu mando um dado e ela começa a conversao, com um intervalo de tempo q eu escolho pelo software.

o problema ta ai .. eu quero para a conversao via software, e reiniciar o sistema pra pode pega os dados

q o mc armazeno na memoria eepron.

se quiser eu posto o código do mc aqui pra você dar uma olhada.

valeu te mais

Link para o comentário
Compartilhar em outros sites

O que voce quer é isto :

O seu programa fica normalmente fazendo a conversão do A/D e guardando elas na memória , e quando voce receber um determinado byte voce que que páre de fazer as conversões e vá para uma rotina que vai te enviar esses bytes pela serial, ok ?

Basta implementar a comunicação serial e ficar observando sempre a cada conversão A/D se tem algum dado recebido via serial; se tiver, veja se é o dado correto que voce está esperando, e se for, simplesmente sai do loop do A/D e vai para a rotina de TX serial, ok ?

Veja se é isso e eu posto o esqueleto do negócio !

Paulo

Link para o comentário
Compartilhar em outros sites

Bom paulo é +- isso, porém tem o detalhe de ele estar operando em modo ADCnoise, com isso a comunicação pela serial fica desabilitada ( ja testei e fica mesmo), pelo o que o datasheet do atmega8 fala so fica habilidata a interrupção pera serial e é isso que eu queria fazer usar a interrupção para para ele mas, como funciona essa interrupção, o que eu tenho que manda na serial para ativar a interrupçãoe e ele parar de fazer a conversão.

até mais

Link para o comentário
Compartilhar em outros sites

Opa, opa vamos com calma

o TWI: é interrupção por modulo I2C ou seja ela não tem nada a ver com a serial, é um outro modulo que serve para se comunicar com perfifericos e outros CI,

Posso ate postar um exemplo, mas preciso que você me confirme se vai usar a I2C mesmo.

Abs.

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!