Pages: [1]   Go Down
Author Topic: Acionar portas digitais simultaneamente  (Read 1758 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Portugal
Offline Offline
Edison Member
*
Karma: 27
Posts: 1429
Tomorrow I will know a BIT more than yesterday
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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/
« Last Edit: October 27, 2012, 09:40:20 am by HugoPT » Logged

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3113
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3113
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 !!
Logged

10 LET Loop=Infinite
20 GO TO 10

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3113
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Sr. Member
****
Karma: 0
Posts: 339
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Que mais?
Logged

10 LET Loop=Infinite
20 GO TO 10

Pages: [1]   Go Up
Jump to: