LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: Njay em 05 de Julho de 2009, 13:10

Título: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Njay em 05 de Julho de 2009, 13:10
Acabei de escrever uma nova parte do micro-tutorial de AVR. É sobre as entradas/saídas digitais, que é uma coisa básica, mas explica de um modo geral como funcionam os tipos de configuração que se pode fazer num pino GPIO. Um GPIO é um conceito, e logo aplicável a qualquer microcontrolador. Atirem comentários, sugestões, críticas, tomates podres virtuais, estejam à vontade :)

GPIO - General Purpose Input/Output (http://forum.electronicapt.com/index.php/topic,1561.msg16551.html#msg16551) (actualizado! obrigado pela dica _metRo!)

Actualização: Fica aqui um link para uma versão em PDF das 2 partes do tutorial, porque faltam algumas imagens no original e já não tenho mais paciência para andar atrás dos tipos do imageshack para corrigirem os problemas:
Micro Tutorial AVR - Njay (http://embeddeddreams.com/users/njay/Micro%20Tutorial%20AVR%20-%20Njay.pdf)
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: metRo_ em 05 de Julho de 2009, 15:06
1)
Citar
Um pino entra no 4ª modo quando o respectivo periférico é activado, pelo que não vamos debruçar-nos aqui sobre isso.

4º em vez de 4ª.

2)
Citar
PORTB |= _BV(PB1) é um "OU" (OR) do registo PORTB com o valor _BV(PB1); isto tem o efeito de colocar a 1 apenas o bit 1 de DDRB.

Não percebi porque é que usas-te um OU em vez de um AND

3)
Utilizando a linguagem do Arduino seria:

Citar
pinMode(1, INPUT);    
digitalWrite(1, HIGH);


O tutorial está excelente, já li tudo e para além disto não tenho mais anda a apontar, explicas-te tudo muito bem.
Vou começar a seguir os teus tutoriais e ler os que já fizes-te.
Parabéns e Obrigado :)
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: Njay em 05 de Julho de 2009, 15:18
1)
Citar
Um pino entra no 4ª modo quando o respectivo periférico é activado, pelo que não vamos debruçar-nos aqui sobre isso.

4º em vez de 4ª.
Ok, corrigido!

2)
Citar
PORTB |= _BV(PB1) é um "OU" (OR) do registo PORTB com o valor _BV(PB1); isto tem o efeito de colocar a 1 apenas o bit 1 de DDRB.

Não percebi porque é que usas-te um OU em vez de um AND
Porque é suposto pôr o bit a 1 e não a 0.

3) Utilizando a linguagem do Arduino seria:

Citar
pinMode(1, INPUT);    
digitalWrite(1, HIGH);
Sim, mas o tutorial não é sobre Arduino.

O tutorial está excelente, já li tudo e para além disto não tenho mais anda a apontar, explicas-te tudo muito bem.
Vou começar a seguir os teus tutoriais e ler os que já fizes-te.
Parabéns e Obrigado :)

Obrigado eu :)

p.s. Escreve-se "usaste", "explicaste" e "fizeste".
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: metRo_ em 05 de Julho de 2009, 15:22
obrigado pelas correcções  :-\

Eu sei que não era sobre Arduino. Exacto já percebi o OU, se fosse AND e lá estivesse um 0 ia dar 0.
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: msr em 05 de Julho de 2009, 15:27
Aqui vai mais uma pecuinhísse :P
Citar
GPIOs na architectura AVR

Esta teve piada! eheh

Ainda ontem estive a ler qq coisa a este respeito mas em relação aos PICs. Por agora nao tenho tempo de ler com a atenção que gostaria, mas mais tarde o farei de certeza, até para perceber eventuais diferenças entre os PICs e AVR.
Obrigado Njay!
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: Njay em 05 de Julho de 2009, 15:32
Aqui vai mais uma pecuinhísse :P
Citar
GPIOs na architectura AVR

Esta teve piada! eheh

Pois... sabes o que é não sabes? Hábito de escrever em inglês  :-\. Obrigado, vou já alterar.
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: TigPT em 05 de Julho de 2009, 17:28
Muito bom njay, só li na diagonal mas gostei... vou meter nos favoritos para depois ler mais atentamente!
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: Sérgio_Sena em 05 de Julho de 2009, 20:39
Grande NJAY, é sempre bom ver esse excelente trabalho!
Continua, está óptimo!

um abraço, Sena


Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: dio123 em 05 de Julho de 2009, 21:55
parabens pelo o excelente trabalho, pois está muito bom na apesentação e conteudo
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: Tyran em 05 de Julho de 2009, 22:07
Muito bom ;)

Já agora na parte do _BV( x) podias dar a macro mesmo: #define _BV(bit) (1 << (bit))
Eu até gosto mais de usar (1 << x) lol

E já agora também que se escrever 1's nos PIN faz o toggle ao PORT

cumpzz e continuação de bom trabalho :)
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: metRo_ em 25 de Outubro de 2009, 00:27
Njay podes actualizar o link?
Título: Re:GPIOs explicados - e aplicados ao AVR em C
Enviado por: StarRider em 27 de Novembro de 2009, 13:38
Citação de: metRo_

Citar
PORTB |= _BV(PB1) é um "OU" (OR) do registo PORTB com o valor _BV(PB1); isto tem o efeito de colocar a 1 apenas o bit 1 de DDRB.

Utilizando a linguagem do Arduino seria:

pinMode(1, INPUT);     
digitalWrite(1, HIGH);


A diferença é que:
PORTB |= 0x80
resulta num máximo de 2 ciclos do clock e 2 bytes de código

Enquanto que:
pinMode(1, INPUT);     
digitalWrite(1, HIGH);
resulta em pelo menos uns 40 ciclos do clock e outros uns 40 bytes de código (ou lá perto).

Agora junta muitos exemplos destes e vais ver que no final usar a tal "linguagem do Arduino"  só leva a
mais código e menor performance do AVR.

A "linguagem do Arduino" , sendo não mais que um conjunto de funções de alto nível , serve somente
para abstrair o utilizador do hardware, de resto não tem qualquer outra vantagem.

O mais interessante é que com um qualquer outro  compilador de C e com o hardware do Arduino é
possível fazer realizar exactamente as mesmas tarefas muito mais rápido e com muito menos código.

Abraços
Paulo A.
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: tr3s em 27 de Novembro de 2009, 15:08
Exacto StarRider estás correcto em relação ao facto da "linguagem" promovida pela comunidade Arduino tirar pouco rendimento da arquitectura AVR e levar a mais bytes de código e menos eficiência.

Contudo o objectivo da comunidade Arduino é introduzir a electrónica e programação a pessoas que nunca tenham tocado nesta área, isto é, cativar mais "mentes" para estas áreas (Electrónica, programação, robotica). O Arduino sendo uma plataforma para iniciados, justifica-se o facto de eles terem feito estas bibliotecas que facilitam o uso de todos os periféricos, GPIOs, etc. do microcontrolador AVR.

Na minha opinião, para um iniciante não há nada melhor do que ja ter a "papinha toda feita" em funções destas :P. Até para alguém com experiência, para testar alguma coisa rapidamente estas funções são bastante úteis!
Quando já estamos bem "ambientados" com a plataforma, concordo perfeitamente que se comece a estudar e fazer os possíveis para descer um pouco de nível e começar a programar usando  estes "pequenos truques".

Relembro mais uma vez que este tutorial não é sobre Arduino (embora aplicável) mas sim sobre a arquitectura AVR. ;)
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: beirao em 30 de Julho de 2010, 17:23

Tendo em conta o tutorial do Njay, estava a tentar programar em AVR, com a placa que asena me vendeu: http://lusorobotica.com/index.php?topic=2586.0 (http://lusorobotica.com/index.php?topic=2586.0)

Mas não tou a conseguir :/ instalei o ISP que vem na disquete e o stk300 application builder... instalei tmbem o winAVR.. acho que não tou a configurar bem o application builder.. alguem já trabalhou com esta placa ou que perceba disto?
 (njay deves ser o mais indicado...:p)
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Njay em 30 de Julho de 2010, 23:28
Nunca trabalhei com essa placa nem com esse tal de "application builder". Mas isso não trás manual? Se não trouxer encontras na net, acho que está disponível para download. Se é uma placa de programação por porta paralela não deves poder usar cabos maiores que uns 40-50cm (já contando com possíveis cabos extensores).
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: beirao em 31 de Julho de 2010, 11:06
Nunca trabalhei com essa placa nem com esse tal de "application builder". Mas isso não trás manual? Se não trouxer encontras na net, acho que está disponível para download. Se é uma placa de programação por porta paralela não deves poder usar cabos maiores que uns 40-50cm (já contando com possíveis cabos extensores).

a questão é que o manual está muito fraquinho... mas vou ver se consigo encontrar informação sobre o software..
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: senso em 01 de Agosto de 2010, 00:23
Supostamente se usares a ultima versão do winAvr e do AvrStudio ele devia ter os drivers todos certinhos para essa placa trabalhar sem problemas com o AvrStudio e até detectar a placa automaticamente no momento da programação penso eu, nisso não tenho a certeza, estás a selecionar essa mesma placa quando crias um projecto novo no AvrStudio?
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: beirao em 01 de Agosto de 2010, 11:59
Supostamente se usares a ultima versão do winAvr e do AvrStudio ele devia ter os drivers todos certinhos para essa placa trabalhar sem problemas com o AvrStudio e até detectar a placa automaticamente no momento da programação penso eu, nisso não tenho a certeza, estás a selecionar essa mesma placa quando crias um projecto novo no AvrStudio?

A questão é que com a placa vem o AVR ISP para instalar.. e depois no avrstudio nao me dá a possibilidade de escolher esse programador.. penso que vem daí...
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Cynary em 06 de Setembro de 2010, 23:25
Estive a ver agora o teu tutorial, e achei muito útil. Finalmente consegui perceber o que significam e como utilizar os registos para as GPIOs. Vais expandir o tutorial com mais artigos? Se sim, fico à espera de mais ;)
PS: Usaste alguma placa programadora no teu tutorial, ou basta ligar directamente à porta de paralela?
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Njay em 06 de Setembro de 2010, 23:54
Usei o programador que lá está no próprio tutorial...
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Cynary em 07 de Setembro de 2010, 05:32
Não percebi bem :S
O circuito de programador que tens no tutorial, aparenta ter um intermédio entre a porta paralela e o arduino.
A minha questão é se é uma placa separada (p. ex. http://loja.lusorobotica.com/128-pololu-usb-avr-programmer.html (http://loja.lusorobotica.com/128-pololu-usb-avr-programmer.html)) ou se está lá apenas para simplificar, e tudo o que temos de fazer é montar aquele circuito, e ligar ao PC/AVR.
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Njay em 07 de Setembro de 2010, 10:51
O circuito de programador que tens no tutorial, aparenta ter um intermédio entre a porta paralela e o arduino.

Exacto. De um lado está a ficha (DB25) para ligar à porta paralela do PC e do outro está aquela ficha branca pequena de 6 pinos para ligar ao AVR.
Montei o circuitinho dentro daquela ficha de porta paralela e assim fica um "cabo programador". Mas o circuito que lá está é tão simples que quase pode ser montado numa matriz de contactos; o problema é que o condensador do circuito e a resistência que lhe está próxima têm que estar fisicamente junto ao PC.
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: senso em 07 de Setembro de 2010, 12:43
Se tiveres uma porta serial tambem é facil de fazer um programador só com um cabo, se só tiveres usb é que tens de comprar um programador estilo esse da polulu.
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: Cynary em 07 de Setembro de 2010, 14:12
Obrigado pela explicação aos dois, estava a fazer uma confusão demasiado grande xD.
Mais umas questões: No caso de se usar uma portá de série, há a restrição de não se poder usar um conversor USB também?
O que encontrei para fazer um com a porta série foi o seguinte:
http://www.serasidis.gr/circuits/avrprog/avrprog.htm (http://www.serasidis.gr/circuits/avrprog/avrprog.htm)
Mas não especifica essa restrição (caso não exista, conhecem algum em que estejam explicadas as configurações do avrdude?).

Obrigado pelo vosso tempo.
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: senso em 07 de Setembro de 2010, 14:35
Não é de todo fiavel usar um conversor usb-serial para fazer um programador, e é por isso que por usb são sempre placas com um micro-controlador no meio para garantir que tudo funciona.
Título: Re: GPIOs explicados - e aplicados ao AVR em C
Enviado por: iyahdub em 10 de Julho de 2012, 18:35
Sim senhora, bom tutorial( eu tenho andado a fazer uns, so para me ajudar a memorizar a maneira de AVR GCC, que nao sao supostos ser completos)...Mas o teu esta muito bom.
Mas talvez devesses ter explicado sem a Macro _BV primeiro, introduzindo depois, a macro e o seu funcionamento, ja que assim talvez nao seja tao facil entender o real funcionamento.
O senso tb tem prai um tutorial bem perto do que fiz ( muito mais completo que o meu, como seria de esperar dele lol).

PS- Para quem nao souber, a macro_BV ( que quer dizer  Bit Value ), vem definida em <avr/sfr_defs.h> na biblioteca avr-libc, apesar de ja estar incluida por deferencia em <avr/io.h> ( ver http://www.nongnu.org/avr-libc/user-manual/index.html (http://www.nongnu.org/avr-libc/user-manual/index.html) para informacao detalhada).
a macro e definida assim :
Código: [Seleccione]
#define _BV(x)   (1 << x)
que nos permite fazer coisas como

Código: [Seleccione]
PORTC |= _BV(0);  // carregar somente bit 0 .
PORTC &= ~(_BV(1));  // apagar somente bit 1 .
PORTC ^= _BV(7);  // inverter somente o bit 7 - muda para 1 se for 0, e vice versa.