LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Chuckytuh em 17 de Julho de 2012, 22:29

Título: Atmega324a e avrdude
Enviado por: Chuckytuh em 17 de Julho de 2012, 22:29
Olá pessoal, aproveito este tópico também para me apresentar visto que é o primeiro post no fórum.

Sou o João Gonçalves de Barcelos e sou programador. Estudo actualmente no curso de Desenvolvimento de Jogos Digitais no Instituto Politécnico do Cávado e do Ave.

Falando do que interessa!

Adquiri recentemente dois avrs : atmega324a e o 1284a com o intuito de os programar com a biblioteca do arduino.
Na verdade, o que realmente quero é fazer o seguinte módulo de bateria electrónica:http://microdrum.altervista.org/blog/info/ (http://microdrum.altervista.org/blog/info/). O autor usa um arduino uno mas como adquiri estes avrs por samples a ideia era usa-los para fazer um port desse projecto para utilizar a comunicação por usb com a biblioteca V-USB (http://www.obdev.at/products/vusb/index.html (http://www.obdev.at/products/vusb/index.html)) em vez de usar a comunicação em série virtualizada por usb (tal como acontece no arduino).

Adquiri no ebay um programador USBTiny mas já lá vai quase um mês e ainda nao chegou pelo que comecei à procura de soluções alternativas..a primeira tentativa foi um programador para a porta paralela, o BSD, mas não tive sucesso (nem o avr reconhecia lol). A segunda tentativa foi um programador DAPA (tal como está presente no website do arduino) e que está a funcionar mas mal...

Um dos problemas que encontrei foi que na versão do avrdude que vem com o winavr não vem no ficheiro conf os dados sobre um atmega324a nem atmega324pa mas após alguma pesquisa reparei que na nova versão do avrdude.conf já tem lá as configs para o atmega324pa.

Ao dar uma vista de olhos pela datasheet do avr não consigo entender quais as diferenças entre o modelo 324a e o modelo 324pa ou mesmo do 324p...

Enfim...ao executar o avrdude com os argumentos -c dapa -P lpt1 - p m324pa o resultado é de que o device signature do avr não correspende ao device signature do m324pa. Inicialmente não tinha reparado que a leitura do device signature era errada, isto é, de cada vez que executo o avrdude ele dá valores random para o device signature mas por vezes lá sai um 0x1e9515 (o DS correcto para o modelo atmega324a).

Uma vez que nao descobri quais as diferenças entre o 324a e o 324pa meti o argumento -F para ignorar a verificação do device signature e de seguida ele returna um warning a dizer que não consegue ler correctamente os lfuse e por vezes os hfuse e salta fora da execução..

Uma vez que estou já a perder o amor ao avr lol forcei a escrita de um programa (um simples led blink) para o avr com recurso ao argumento -u e o esquesito é que ele escreve 100% do .hex no avr mas no passo da verificação dos bits que foram flashados fazendo a comparaçao com o .hex do pc, ele falha dizendo que em determinada posiçao os valores diferem...

Na minha inocência lá liguei o led à porta especificada e qual é o meu espanto? O led está a "piscar" tal como foi programado para tal -.-'

Ora as minhas questão são as seguintes:


Nota: Estou a iniciar-me no mundo da programação de avrs e o background que tenho de electrónica resume-se a 1 ano e meio de um curso universitário do qual desisti precisamente por causa da electrónica (maldita falta de interesse..se fosse hoje!).

Peço desculpa pelo tópico longo :)

Cumprimentos!
João Gonçalves

Título: Re: Atmega324a e avrdude
Enviado por: senso em 17 de Julho de 2012, 22:45
A diferença entre os modelos A e PA é que o P significa Picopower, o micro-controlador é totalmente igual ao antecessor, tendo a unica diferença de consumir menos.

O arduino tanto quanto sei não suporta nativamente esses micros, e para o 324 nem sei se existe sequer um core para o puderes usar com o IDE do Arduino.
Das poucas coisas que funcionam praticamente em toda a familia AVR é acesso a pinos e portos que é sempre igual, excepto nos atmegas, dai o programa ter funcionado, porque registos de configuração da UART são diferentes, tens mais timers, podem ter mais modos de funcionamento, podes ter mais que uma UART, ao forçares o avrdude a ignorar a assinatura do chip é uma roleta russa e nem sempre funciona ou pode funcionar erraticamente devido a tabelas de interrupções diferentes e outras coisas.

Convem sempre usar o avrdude mais recente, assim como o compilador mais recente, pois os bugs vão sendo corrigidos e vai sendo adicionado suporte para mais chips, se bem que esses são bem velhinhos.

Quanto ao USBasp, é normal demorar a chegar, afinal vem de barco da China, dai ser tão barato, e atenção que se tiver o firmware antigo muito possivelmente só te programa até 64Kb de Flash devido a um "bug" no código do programador.
Título: Re: Atmega324a e avrdude
Enviado por: Njay em 17 de Julho de 2012, 22:45
Valores random geralmente quer dizer problemas "fisicos" de comunicação. O cabo do programador paralelo, desde a ficha no PC até aos pinos do AVR não pode ser comprido (convém ter menos de 40cm e quanto mais curto melhor), e os contactos têm que estar "firmes". Se puderes usar o cabo que descrevo neste artigo, melhor: Micro Tutorial AVR - Njay.pdf (http://embeddeddreams.com/users/njay/Micro%20Tutorial%20AVR%20-%20Njay.pdf)
Título: Re: Atmega324a e avrdude
Enviado por: senso em 17 de Julho de 2012, 22:48
Isso e a frequência de programação tem de ser no máximo de 1/8 da frequência a que o micro está a correr, como os Fuses originais metem o micro a correr do oscilador interno que é de 8Mhz e que tambem tem ligado o divisor de clock por 8, a velocidade máxima de programação é de 125Khz, e aconselho-te sériamente a instalares o AvrStudio 6, e usar uma toolchain barata, isso e usar o PonyProg para programares os chips usando o teu programador por porta paralela, pois tem coisas uteis como GUI para configurar os fuses e alguns extras.
Título: Re: Atmega324a e avrdude
Enviado por: Njay em 17 de Julho de 2012, 22:50
A opção -i abranda o passo do avrdude (por exemplo "-i 50").
Título: Re: Atmega324a e avrdude
Enviado por: Chuckytuh em 18 de Julho de 2012, 02:41
A diferença entre os modelos A e PA é que o P significa Picopower, o micro-controlador é totalmente igual ao antecessor, tendo a unica diferença de consumir menos.

Ok, muito obrigado por esta informação!

O arduino tanto quanto sei não suporta nativamente esses micros, e para o 324 nem sei se existe sequer um core para o puderes usar com o IDE do Arduino.

Compreendo que possivelmente não seja nativamente suportado contudo, pelo que percebi do que é o arduino, não posso usar a biblioteca arduino por exemplo no AVR Studio?

... avrdude a ignorar a assinatura do chip é uma roleta russa e nem sempre funciona ou pode funcionar erraticamente devido a tabelas de interrupções diferentes e outras coisas.

Tenho perfeita noção disto contudo, julgando eu que a diferença entre o atmega324a e o pa nao era nenhuma (pelo menos a nível de registos, etc) não me preocupei e forcei o -F.. Já o uso do -u confesso que foi mesmo naquela de "vamos la ver no que isto dá" lol.

Quanto ao USBasp, é normal demorar a chegar, afinal vem de barco da China, dai ser tão barato, e atenção que se tiver o firmware antigo muito possivelmente só te programa até 64Kb de Flash devido a um "bug" no código do programador.

Obrigado pela dica!:)

Valores random geralmente quer dizer problemas "fisicos" de comunicação. O cabo do programador paralelo, desde a ficha no PC até aos pinos do AVR não pode ser comprido (convém ter menos de 40cm e quanto mais curto melhor), e os contactos têm que estar "firmes". Se puderes usar o cabo que descrevo neste artigo, melhor: Micro Tutorial AVR - Njay.pdf (http://embeddeddreams.com/users/njay/Micro%20Tutorial%20AVR%20-%20Njay.pdf)

Eu julguei inicialmente que se devia a algum tipo de variação de tensão ou algo do género mas após vários testes com o multimetro cheguei a conclusão que, à partida, estaria tudo correctamente colocado/soldado.. mas o problema persiste. Após umas pesquisas fui deparar-me com um tópico no fórum avrfreaks onde um sujeito indicava para ligar directo o MISO ao MOSI do cabo e ver se o valor de retorno na execução do avrdude com -vvv daria algo como: bitbang_cmd() [AC 53 00 00] [AC 53 00 00] e realmente dava, ou seja, o que sai do MOSI é o que é lido no MISO portanto não deverá ser problemas do cabo...

Isso e a frequência de programação tem de ser no máximo de 1/8 da frequência a que o micro está a correr, como os Fuses originais metem o micro a correr do oscilador interno que é de 8Mhz e que tambem tem ligado o divisor de clock por 8, a velocidade máxima de programação é de 125Khz, e aconselho-te sériamente a instalares o AvrStudio 6, e usar uma toolchain barata, isso e usar o PonyProg para programares os chips usando o teu programador por porta paralela, pois tem coisas uteis como GUI para configurar os fuses e alguns extras.

Uma vez que estou a usar a versão DAPA para o programador por porta paralela não tive sucesso com o ponyprog pois este não tem (ou tem e eu é que nao soube ver?) suporte para DAPA :/

O que estava a usar era mesmo o winavr com o programmes notepad e a fazer uso do makefile gerado pelo mkfile que vem com o winavr..

A opção -i abranda o passo do avrdude (por exemplo "-i 50").

Hoje já n ao tenho acesso ao pc com a porta paralela mas manha vou experimentar tb isso :)

Obrigado pelas respostas!
Título: Re: Atmega324a e avrdude
Enviado por: Njay em 18 de Julho de 2012, 03:02
Citar
Após umas pesquisas fui deparar-me com um tópico no fórum avrfreaks onde um sujeito indicava para ligar directo o MISO ao MOSI do cabo e ver se o valor de retorno na execução do avrdude com -vvv daria algo como: bitbang_cmd() [AC 53 00 00] [AC 53 00 00] e realmente dava, ou seja, o que sai do MOSI é o que é lido no MISO portanto não deverá ser problemas do cabo...

Ainda assim podes ter problemas. O problema dos cabos compridos é que o sinal ao variar (mesmo) muito depressa cria reflexões no próprio cabo, e se o fosses ver ao osciloscópio verias oscilações nos pinos do arduino. Ele, sendo hw, interpreta essas oscilações, quando na linha de clock, como vários ciclos seguidos de clock, e a partir daí fica tudo "baralhado" pois o PC só fez um ciclo e o AVR já interpretou 2 ou mais. Isto é pior quanto maior for a frequência de clock do AVR, pois ele faz amostragens mais frequentes com maiores frequências e "apanha" oscilações mais curtas do sinal.
Quando é o PC a ler como no caso do loopback que referes, as reflexões no cabo não causam problemas, pois o sw no PC não lê o clock (o PC é master nesta ligação), e ainda vai esperar algum tempo após a transição de clock para "ler" o que responde o chip (no MISO).
Título: Re: Atmega324a e avrdude
Enviado por: Chuckytuh em 18 de Julho de 2012, 03:38
Ainda assim podes ter problemas. O problema dos cabos compridos é que o sinal ao variar (mesmo) muito depressa cria reflexões no próprio cabo, e se o fosses ver ao osciloscópio verias oscilações nos pinos do arduino. Ele, sendo hw, interpreta essas oscilações, quando na linha de clock, como vários ciclos seguidos de clock, e a partir daí fica tudo "baralhado" pois o PC só fez um ciclo e o AVR já interpretou 2 ou mais. Isto é pior quanto maior for a frequência de clock do AVR, pois ele faz amostragens mais frequentes com maiores frequências e "apanha" oscilações mais curtas do sinal.
Quando é o PC a ler como no caso do loopback que referes, as reflexões no cabo não causam problemas, pois o sw no PC não lê o clock (o PC é master nesta ligação), e ainda vai esperar algum tempo após a transição de clock para "ler" o que responde o chip (no MISO).

Hmm, estou a entender. Bom o cabo não tem mais do que 10cm se bem que eu tenho as resistências na breadboard e não imediatamente dentro da caixa do conector lpt, não sei se isto faz alguma diferença considerável...

Portanto ao usar o argumento -i no avrdude posso reduzir a frequencia de escrita/leitura na porta lpt? Julgava que o argumento -B servia para esse efeito mas como sou bastante leigo nesta materia não sei ao certo..

Estou a ver que realmente a melhor opção é meter as maos num arduino uno e não me chatear mais, se bem que nao era o tipo de solução que pretendia! A minha ideia era mesmo tentar pegar no projecto do microdrum que referi antes e alterá-lo por forma a não usar a comunicação virtualizada por série mas sim ser plug and play com usb usando o v-usb mas estou a ter tantos problemas para programar apenas um simples programa de"blink" neste atmega324a que já começo a desistir lol.

Tenho também em mãos um atmega 1284a mas o resultado é o mesmo :/

Acho que vou tentar novamente o método do programador BSD a ver se tenho algum sucesso :)


Título: Re: Atmega324a e avrdude
Enviado por: Chuckytuh em 18 de Julho de 2012, 05:22
Comprei um ATmega328 com o Arduino Optiboot (Uno) da inmotion.pt.. Tenho acesso a um arduino de um amigo e sempre posso usa-lo para programar este avr e depois uso o avr sozinho para o módulo de bateria que quero construir contudo ainda tenho que arranjar uma solução  para conseguir programar estes avrs que tenho aqui (atmega324a/1284a) mas acho que vou esperar pelo USBTiny que deve estar para chegar (assim espero <.<)
Título: Re: Atmega324a e avrdude
Enviado por: iyahdub em 18 de Julho de 2012, 12:28
Tb tenho aqui um USBTiny pocket programmer, que me deram, novinho ainda selado, ja que andava a procura de um...mas win 7 e de gesso.
tive que o instalar no win32 OS que ainda tenho no meus estudio de gravacao,para poder onstala-lo correctamente. Mas ainda ao o testei aparte de atraves do IDE do Arduino.