Processamento de execução paralela com ATmega

Consideremos dessa forma, mas se tratando de microcontrolador, um só nesse caso, é só um processador, ou seja: irá executar instrução por instrução, por vez. Se temos algum projeto que precisamos executar (processar) uma ou mais coisas de uma só vez, existe alguns meios de se fazer isto, já andei estudando sobre. Descobri que é possivel, mas desde que não seja processamentos que necessitem de muita precisão, como controles PID. Alguns dos amigos tem conhecimento sobre algo?

Sim... divides o programa e colocas outro processador ligado ao principal encarregue dessa tarefa.

Que precisas de fazer ao certo?

bubulindo:
Sim... divides o programa e colocas outro processador ligado ao principal encarregue dessa tarefa.

Que precisas de fazer ao certo?

Não, quero executar mais de uma tarefa simultaneamente com um só processador.

Impossível!!! 8)

Digo isso porque o processador só pode executar uma instrução por vez, o que significa que nunca terás duas coisas acontecendo ao mesmo tempo, a não ser que utilizes um duo, onde poderá ter uma instrução para cada core.

O que procura é algo como as libs abaixo:
http://www.kwartzlab.ca/tag/multi-threading/
https://code.google.com/p/threadkit/

Não fui a fundo ainda, até porque o que eu precisava resolvi com as interrupções.

Vamos ver se alguém se aventurou por esta área...

Mortis, queres dizer Due ou duo?

O Due só tem um core... logo também só executa uma coisa de cada vez.

E que tarefas são essas? O processador pode não fazer as duas ao mesmo tempo, mas aos teus olhos pode parecer assim.

Olá, bubulindo!

Desculpe-me, eu me referia a dois processadores em um único chip (core to duo, por exemplo).

Sei como funcionam as threads, mas preferi trabalhar (brincar, na verdade) com condições no loop para alternar entre métodos e funções. Creio que seja a solução mais simples, sem interromper o loop do arduino ou fazer concorrência com ele =)

Eu uso as interrupts para monitorar comandos externos (sensores/switchs) e amlimento variáveis globais, trando os resultados no loop, se quero 10 amostragens, por exemplo, no lugar de um "while ou for" + delay(), eu trato dentro do loop do arduino.

Mas essas são preferências pessoais, por isso indiquei os links para as libs :wink:

Na grande maioria das vezes a percepção que se tem é que as coisas têm de ser feitas ao mesmo tempo quando na realidade isso não é bem assim.

Existem exemplos de controlo PID que são temporizados com o millis e funcionam perfeitamente bem. Aliás, é possível compensar o tempo de ciclo irregular no controlo PID (acredito que uma das bibliotecas para o Arduino faz isso). Existe também a possibilidade de criar uma interrupção com o timer e dentro da interrupção correr o código PID. Embora nesta situação é bom que o PID use inteiros e não floating points.

Daí que cada caso é um caso e só analizando se pode perceber qual o efeito que um atraso no PID ou algo do género terá no controlo.

Mortis, usar delay() é pecado. :stuck_out_tongue:

bubulindo:
Na grande maioria das vezes a percepção que se tem é que as coisas têm de ser feitas ao mesmo tempo quando na realidade isso não é bem assim.

É bubulindo, foi a essa conclusão que cheguei!

É que pensamos, por exemplo, que uma thread para monitorar cada botão é a solução para o caso de dois botões (ou sensor wall) serem pressionados ao mesmo tempo :slight_smile:

Quando pegamos um microcontrolador para "brincar pela primeira vez" temos o pensamento de que ele funcionará como um computador pessoal, mas aos poucos vamos percebendo que a coisa é bem diferente e são necessários muito mais cuidados (como o uso tipos de 8 ou 16 bits no lugar dos de 16, esquecer o tipo string, ter cuidado com loops dentro do loop, etc), tudo para evitar que algo seja perdido.

O mesmo eu diria sobre threads, pode se tornar um problema no lugar de uma solução, mas como você disse, cada caso é um caso.

Perdoe-me padre, pois eu pequei!!! lol

Impossível controle PID sem floating points. É como vocês disseram, a nosso olhos o microcontrolador executa diversas tarefas, mas não é bem o que acontece. Estou criando uma biblioteca para me auxiliar nessa "ilusão" 8)

Flip-Flop:
Estou criando uma biblioteca para me auxiliar nessa "ilusão" 8)

Olá, Flip-Flop,

Bacana! Ms por curiosidade, o que te motiva à implementar threads no arduino?

Flip-Flop:
Impossível controle PID sem floating points. É como vocês disseram, a nosso olhos o microcontrolador executa diversas tarefas, mas não é bem o que acontece. Estou criando uma biblioteca para me auxiliar nessa "ilusão" 8)

é mais limitado, admito... e os inteiros podem dar sarilhos de estabilidade, mas não diria impossível. No entanto, nunca testei isso para ver o resultado, logo fica para outra altura como curiosidade. O interesse em usar inteiros é precisamente para evitar fazer multiplicações e divisões e usar bit shifts (desde que os parâmetros sejam divisíveis por dois). Mas isso realmente ia ser uma chatice para ajustar.

Então o que é que a biblioteca vai fazer mesmo?

Mortis:

Flip-Flop:
Estou criando uma biblioteca para me auxiliar nessa "ilusão" 8)

Olá, Flip-Flop,

Bacana! Ms por curiosidade, o que te motiva à implementar threads no arduino?

Não quero usar exatamente no Arduino, sim nos AVR em geral, uso eles no meu trabalho e entre uma automação e outra, me deparo com várias tarefas que precisam ser executadas pelo mesmo MCU e minha motivação é só para me ajudar a facilitar a escrita do código, pois já me deparei com alguns problemas. Estou a projetar melhor isso, pois tenho outros projetos e pesquisas.

Quanto a o PID, o Proporcional Derivativo, meio que anulas as chances desse controle ser tão preciso sem floating points, mas depende de cada aplicação.

Flip-Flop:
Quanto a o PID, o Proporcional Derivativo, meio que anulas as chances desse controle ser tão preciso sem floating points, mas depende de cada aplicação.

Sim, é isso... é tudo um compromisso, creio.

Mas que tarefas precisas de executar precisamente ao mesmo tempo?

É isso ai, Flip-Flop.

Estou arqui por hobby, não trabalho com microcontroladores, mas, se você tiver interesse, compartilha conosco quais foram os resultados, é sempre bom saber :wink:

Bons projetos por ai!

Acredito que você esteja se referindo a multitask, processo no qual um sistema operacional aloca um tempo de processamento para cada task (programa) iniciado. Isto dá a impressão de processamento paralelo, mas na verdade o tempo do processador foi dividido. Isto é feito através de uma interrupção interna. Por exemplo, um programa com 4 funções independentes (tasks) e interrupção de timer a cada 40 mseg. Veja que estas tasks não rodam no main(), elas são controladas apenas pela interrupção.
Sequencia: interrupçaõ, salva no stack ambiente da task n+3, recupera do stack ambiente da task n, roda task n
interrupção, salva no stack ambiente da task n, recupera do stack ambiente da task n+1, roda task n+1
interrupção, salva no stack ambiente da task n+1, recupera do stack ambiente da task n+2, roda task n+2
interrupção, salva no stack ambiente da task n+2, recupera do stack ambiente da task n+3, roda task n+3
interrupção, salva no stack ambiente da task n+3, e assim indefinidamente.
Isto é usado no caso de processos que não necessitam dedicação integral, como esperar pelo teclado, atualização de tela, sensor de presença e outros.

Boa tarde, também tenho um problema parecido. Estou com um ATmega 2560, que vai monitorar 24 sensores (led x foto transistor), e quando cada sensor muda de estado (está em LOW, vira HIGH e quando retorna para LOW) eu preciso anotar um evento. Já tentei fazer cada sensor em uma funcão única, e agora estou lidando com for e array, sendo que cada posição do array é uma porta digital. Trabalhando com a função era facil registrar o evento quando a borda descia, porém o arduino "ignorava" o que acontecia com os demais sensores. Já com o for, é facil monitorar todos, porém está sendo complicado anotar os eventos apenas quando o sensor muda de 1 para 0, visto que quando isso acontece, eu preciso coletar várias informações de outras funcoes (temperatura, pressao, data, hora...)

Desde já, obrigado!!!

Só vendo o código é que compreendo qual é o problema. Em princípio, pelo que leio, basta ter uma estrutura onde guarda, para além do estado da entrada, o valor das outras entradas analógicas. Essa estrutura pode vários elementos organizados na forma de vector também, para poder ter acesso a vários elementos iguais.

Não entendi muito bem o que pretendes e qual o problema...

Podes sempre olhar a interrupções para não perderes a mudança de estado ou uma função mais rápida para leres os pinos digitais.

A minha duvida penso ser igual.

Tenho 2 servos que são executados pelo comando "if" acontece que enquanto os dois servos estão a ser ajustados, queria ler o consumo de energia que estão a gastar

Para tal utilizo um "for" para ler a amostragem de 1 min e dai depois faço as minhas medias, hora, dia, mes etc...

Acontece que se estou a movimentar os servos, não vou seguir ler qual o consumo dos servos, pois enquanto tá a mover o servo só no fim de este estar posicionado (parado) é que passa para a leitura do sensor de currente e ai já está o servo parado já não vai me dar a leitura do seu consumo.....

Para mover o servo e ler o consumo deste a opção é ter 2 arduinos um para mover os servos e outro para ler os consumos?

obrigado