Go Down

Topic: Acionar portas digitais simultaneamente (Read 3263 times) previous topic - next topic

jacksonrb

Pessoal, boa tarde.
Estou iniciando meus trabalhos com o Arduino e ja esbarrei numa dificuldade.
Tenho a necessidade de criar uma variavel (provavelmente seja uma variavel) para executar a ação de HIGH ou LOW simultaneamente em mais de uma porta. Ja li sobre acessar portas diretamente (PORTx) e funcionou, ate que precisei usar portas de dois blocos diferentes (ex.: PORTE e PORTG), entao acho que nao estou conseguindo trabalhar com operadores mesmo.

Supondo os exemplos abaixo, quais minhas opções para fazer os cenarios funcioarem?
cenário 1:
byte led1 = 1
byte led2 = 2
digitalWrite ("o que", HIGH) para ligar ambos os leds?

e no caso de acessar diretamente:
Se o led1 esta no PORTE, por exemplo: PORTE = B00000001
e o led2 esta no PORTG: PORTG = B00110000

Ja busquei sobre soma de variaveis, array, etc.. mas ta tudo muito nebuloso ainda.
Desde já agradeço qualquer ajuda
Jackson - jacksonrb@gmail.com

HugoPT

#1
Oct 27, 2012, 04:36 pm Last Edit: Oct 27, 2012, 04:40 pm by HugoPT Reason: 1
a funcao digitalWrite (x, HIGH) é uma funçao interna que como ela diz seta um pino a High ou low.Como tal é individual nao podes la colocar mais que um pino na mesma instruçao, mas se colocares algo assim penso que te resolve o problema
Code: [Select]

digitalWrite (1, HIGH);//Seta o pino 1 a High
digitalWrite (2, HIGH);//Seta o pino 2 a High

O tempo de execucao de uma instruçao seguida da  outra sera quase o mesmo.
Caso queiras mesmo reunir isso em apenas uma instruçao (mas vai bater no mesmo) tens de fazer uma funçao usando os registos das Portas
(DDRX e PORTX) para assim poderes dizer a direçao dos pinos(saidas ou entradas) e depois seta-los ou desligados ou ler o valor logico neles(PINX)

Contudo pergunto te tens mesmo a necessidade temporal de os ativar com tanta precisao?

Le este tuturial penso qie te dara umas luzes sobre a tua questao
http://iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

bubulindo

Hugo,

O digitalWrite é lentíssimo e ao fim de algumas activações, começa-se a notar a diferença.

O mais rápido possível é escrevendo directamente para o registo PORT directamente.

Mas qual é mesmo a aplicação que necessita de ser realizada num espaço tão curto?
This... is a hobby.

jacksonrb

Hugo e Bubulindo, boa noite.
Em primeiro lugar obrigado pela resposta.

Hugo, o acionamento direto eu estou entendendo como funciona, bem como o digitalWrite. Como o Bubulindo disse, o digitalWrite é lento em alguns casos. Independentemente da velocidade de acionamento, trabalhando com muitas portas o acionamento simultaneo depois de declarar portas economizariam muitas linhas de código, principalmente em tarefas repetitivas.
Estou trabalhando em um projeto de automação com motores de passo, e sincronia é muito importante, por isso tal necessidade.

Acho que minha duvida é mais uma questão de sintaxe.
Imagine que tenho duas portas em blocos diferentes do Arduino, a 1 e a 9 por exemplo:

PORTD = B0000001 //hipoteticamente a digital port 1
PORTE = B0000010 //hipoteticamente a digital port 9

Existe uma maneira de eu declarar uma variavel chamada X, que contenha duas portas de blocos diferentes (1 e 9) e fazer um especie de:

x = ((PORTD = B0000001) (PORTE = B00000010)); //declaração de variavel
e depois aciona-las simplesmente digitando:
x; //acionamento da variavel ligando as portas 1 e 9

Porque se fossem do mesmo PORT, tudo bem, seria só colocar o "1" no lugar certo. Mas sendo de dois PORTs diferentes, nao sei como fazer.

Desde já agradeço.

bubulindo

Não.

Ou seja, pode até haver algo assim em C, mas o processo de compilação vai passar isso para mais instruções. 

Tenta ver como se faz em assembly, aí não existe problemas de optimização de compilação, e podes fazer isso com C também.

Ou então, outro método de output como um l297 ou um chip da alegromicro.
Ou serial in, parallel out...

This... is a hobby.

jacksonrb

Obrigado Bubulindo, vou continuar os trabalhos e pesquisar suas considerações e qquer coisa volto a postar. mto obrigado

iyahdub

Importas-te de explicar o porque que a solucao de manipulacao de portas directas (toggle como exemplo DDRB |= 1 << PIND0; PORTB |= 1 << PINB0;) nao serve parta oo teu caso em robotica ?!
Se tempo de execucao e assim tao importante, duvido que uma ATMega seja o uC que deves usar, para comecar !
Mas tens que me convencer com uma explicacao porque que nao te serve ?!? Porque ainda nao me faz sentido !!
10 LET Loop=Infinite
20 GO TO 10

bubulindo


Se tempo de execucao e assim tao importante, duvido que uma ATMega seja o uC que deves usar, para comecar !


Estás a ser irónico, não?
This... is a hobby.

iyahdub

10 LET Loop=Infinite
20 GO TO 10

Go Up