Multitarefa com o PIC16f877a ( thread )

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor Renie » 20 Mar 2009 01:11

Olá pessoALL!

Multi-tarefa preenptiva em pic é coisa muito antiga!

O colega/amigo zémarlon que sumiu do nosso convívio (cadê o Zé?),
implementou isso e disponibilizou para todos, aberto na net, se não
me engano o nome era PICOLO!

Ps: é claro que não é para 200MHz, cada chip tem seu limite, e cada
aplicacação suas necessidades!

[]'s
Renie
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor msamsoniuk » 20 Mar 2009 12:33

concordo com vc renie... o fato eh que nao precisa nem de solucoes magicas ou megaprocessadores. suporte a multitarefa (preemptiva ou nao) eh facil de implementar ateh mesmo no PIC e o limite eh apenas a quantidade de memoria, o que limita a quantidade de tasks e a complexidade delas. fora isso nao tem segredo e tem infinitas formas de implementar.

soh para constar, eu nem vou discutir o merito de rodar java no PIC pq o renie me proibiu de fazer "limpeza etnica" de outras plataformas e linguagens no forum hahaha :)
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor leoabubauru » 20 Mar 2009 14:15

rodrigoadachi e aos demais amigos...

Não sei se o que o amigo rodrigoadachi precisa é de um sistema "complexo" como um Kernel ou SO. Creio que seja apenas uma questão de planejamento da tarefa a ser executada num software.

Por exemplo, o que ele sugeriu em fazer com um buzzer a maioria de nós já se defrontou. A questão é não parar o processamento de outras tarefas (ou não ter a impressão que as demais pararam => Sist. de tempo real?). Para isso não precisamos de treads ou kernel ou SO, basta não usar um delay e contar o tempo numa variável.


Código: Selecionar todos
main()
   {
   Inicializa micro...
   .
   .
   .
   for (;;)
      {
      Lê entradas();

      if (botao == ON)     // Se apertou o botao, liga/desliga o beep.
         {
          beep = !beep;       // bit auxiliar para ligar/desligar o buzzer
          variavel = 1000;    // Carrega o tempo do beep
          }
      if((beep == ON) && (!variavel--))
         {
          liga_buzzer = !liga_buzzer;   // Aciona a saida do buzzer.
          variavel = 1000;    // Carrega o tempo do beep
         }

      Executa_tarefa1();
      Executa_tarefa3();
      Executa_tarefa3();
      .
      .
      .
      Aciona_saidas();
      }
   }



Veja rodrigoadachi, não é preciso parar a execução das outras tarefas, pois durante a varredura o processador só executa o liga/desliga da saída do buzzer se houver duas condições satisfeitas. Assim tem-se a impressão que o software executa tudo em paralelo...

Espero ter compreendido sua dúvida e também contribuido.


Laercio
Tento, tento e tento...
Me arrebento!
Também bato!
Ô negocim bunitim essa tal eletrônica de barco!
leoabubauru
Byte
 
Mensagens: 227
Registrado em: 21 Nov 2006 19:08
Localização: São Paulo

Mensagempor Mersin » 21 Mar 2009 22:54

Oi Rodrigo,

Multicore à parte, eu entendi sua necessidade e digo que é totalmente possível o PIC tratar muitas tarefas "ao mesmo tempo".

Coloco entre aspas porque para o PIC é realmente uma coisa de cada vez, mas ele faz isso tão rápido que para nós fica sendo tudo de uma só vez.

Todo programa deve ser capaz de tocar beep e multiplexar um display e fazer leituras analógicas etc "ao mesmo tempo", bom, mas para você conseguir isso, você deverá utilizar Interrupções.

Uma boa prática e é o que sempre faço, é colocar o Timer2 que tem recarregamento automático, para gerar interrupções a cada, por exemplo, 1ms e com isso, dentro dessa interrupção, você já pode utilizar a rotina de multiplexação do display e pode também setar bits que podem servir de "flags" de tempo para que outras rotinas possam fazer suas atividades de tempos em tempos, como por exemplo, pode decrementar uma variável de 1000 a 0 e quando chegar a 0, a rotina do Timer2 pode setar um bit que se chama BaseTempo1s que será lido mais tarde por uma rotina chamada Relogio que incrementará outra variável chamada Segundos, e assim por diante.

Aprendendo a trabalhar com interrupções, você pode criar várias bases de tempo que serão o "clock" para outras rotinas funcionarem.

não sei se deu para entender de primeira, mas procure voltar seu modo de programar com essa concepção.

Espera ter ajudado!

Inté!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor rodrigoadachi » 22 Mar 2009 22:26

Muito obrigado..

Sim, eu conseguir entender sim, ainda não conseguir faver mas ta me esclarecendo muitas duvidas.

Tô ainda nessa pendencia...
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor amboni » 23 Mar 2009 08:46

Rodrigo,

pra começar... da uma lida no livro do fAbio - programaçao em "c" pag 255... la tem sobre timer automatico....

valeu


rodrigoadachi escreveu:Muito obrigado..

Sim, eu conseguir entender sim, ainda não conseguir faver mas ta me esclarecendo muitas duvidas.

Tô ainda nessa pendencia...
amboni
Nibble
 
Mensagens: 50
Registrado em: 23 Abr 2008 08:26
Localização: Içara - SC

Mensagempor Vonnilmam » 24 Mar 2009 14:22

Aos que injustamente desmoralizam o pic877a por ser de 8bits insignificantes são totalmente preconceituosos e talves falem sem conhecimento de causa, cada projeto tem uma necessidade adquada a um mcu em especial,cabe ao projetista definir que a melhor aplicação para cada chip....em especial o 877a é um pic muito bom e bem completinho com a/d, serial, memoria suficiente para rodar a maioria das aplicações comerciais de consumo....bem como seu preço reduzido,

O fabim fala muuuuuito, se voce não gosta de mcus pic, vai para outro tópico, falar de cortex, dsps texas, dual core, dez cores....não viaja não camara...

O nosso colega esta apenas querendo saber sobre as tecnicas de se rodar varias funções ao mesmo "tempo"....Como alguns do colegas mencionaram existem varias formas de fazer isso, e isso vai depender da sua aplicação...o ideal seria vc montar um cerne baseado na interrupção do pic pelo tmr0 e a cada estouro do timer vc verificar "flags" afim de detectar as chamadas mais prioritaria, como o explicado pelo colegas...

Especial atenção ao entrar e sair de interrupções no pic, ajuste corretamente o save e load da variaveis de status, fsr, banks etc...ok nos manuais da microchip há como fazer isso de forma correta.

Boa sorte,
Use pic, é barato, efeiciente e todo o mundo conhece e usa, pic é bom e funciona, os software é gratuito e a ide é muito amigavel....

Não filozofeie sobre coisas que não conhece, apenas ponha a mão na massa e faça, por isso estamos aquí neste forum para ajudar-nos mutamente..ok
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Mensagempor fabim » 24 Mar 2009 14:35

vonnilmam.
Eu só trabalho com pic, a 13 anos.
Exatamente por isso eu sei o que falo.
Montar um task para processos normais.
Sim possivel claro!!
Montar um mult-task, para um processinho um pouco mais complexo!!
Aí sujou.

O que facilita muito, mais muito mesmo, e que torna possivel o mult task no que diz respeito a leitura de ad, serial, spi entre outros, é o lindo e maravilhoso DMA, esse sim é um super heroi de macho!!


Poisé meu querido, eu falo muito sim, pois sei o que eu falo. Fora algum post que eu apenas sacaniei. Aponte algum que eu tenha falado bobagem e algo errado!!! não tem né?! poisé.

Mais vonnilmam, se não gosta de mim, tudo bem, é sua opinião, eu não tenho nada contra você. Mais por favor, evite comentarios agressivos e ofensivos. Isto pode lhe causar problemas, como me causou..

fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor rodrigoadachi » 24 Mar 2009 17:24

Ola pessoal,

Obrigado Vonnilmam e Fabim...

Por favor não briguem ..

Só quero tentar fazer umas coisinhas ao "mesmo tempo" com o PIC, por favor não briguem por minhas perguntas..

Eu uso PIC a uns 4 mêses dai eu ainda tô bem verdinho...

Mas chego lah ao nivel d vocês.

Valew...

Abraços..
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor jeanfernandes » 24 Mar 2009 17:24

Ixe. Nada a ver.

Nenhum mcu desses normais roda mais de uma tarefa de uma vez. É uma de cada vez. Da pra fazer multitask desde que sejam atendidos o que ja falaram ae (tempo de tarefa, velocidade do processo e velocidade do processador + recursos para tal).

Meio que genérico a todos os mcus. O nada a ver é com relação a gostar ou nao do processador. Sem dúvida que não dá para esperar muito de um processador com pouca memória RAM principalmente. O que acontece, e eu até entendo, é que se o sujeito acha que pode fazer a coisa beleza, porém todos nós sabemos que o limite para esse tipo de mcu não é lá essas coisas de longe.

Porém as vezes, o cara quer por multi task em tudo, e não eh bem assim. Muitas vezes os processos convencionais sao mais que suficientes.
O que eu estou levando em conta do dito processador não dar conta, é quando a coisa começa a ficar meio seria no quesito tipo tempo de atendimento de processos.

Se falarem de coisas simples tais como lcd, teclado, serial e por ae vai, ai nem tem discussão pq qq mcu dá conta. Desta maneira eu creio que seja mais conveniente ao cara que faz a pergunta de saber se dá ou não dá é escrever mais ou menos um conjunto das coisas que ele quer executar e pela experiência dos mané aqui, pode se chegar a algum veredicto antes mesmo do cara tentar.

Parenteses. Embora não seja usuário ativo, creio que a microchip hoje, tem processadores melhores e mais eficientes em recursos que o velho 877, com um preço bem competitivo. É que tipo se o cara não pergunta bem, as vezes vai ter respostas meio que evasivas, pois não dá pra adivinhar ne ?

Conectividade, Processos temporais, Dependência de recursos externos, acesso á memoria externa, e por ae vai são elementos meio que básicos pra você poder formular uma pergunta mais "lá dentro".

No off topic, eu creio que aqui não está se discutindo futebol ou qq coisa sem futuro do gênero. Nao vamos ter rédea curta nem cabaré, mas vamos ser apenas sensatos. As vezes uma boa dose de humor vai bem.

Se o cara quer sair do 877 como base para depois experimentar uma cosa melhor é válido. Logo logo ele vai querer se conectar com tudo o que existe e vai ver que o mcu não vai dar conta ou não tem o recurso.
Mas é uma decisão pessoal Aqui a gente só opina pelas nossas experiências.

Sei que o Von e o Fabim são experientes em PIC, pois conheco o trabalho de ambos. Então sao duas pessoas que podem naturalmente orientar o mininin nas suas posições.

Se minha opinião é válida, eu tb sou a favor de ALÉM de usar o costumeiro, ESTUDAR ou LER sobre outras arquiteturas, não só pela MODA, mas também pela SEGURANÇA de ter algo bom nas mãos.
Nada como um estudo comparativo as vezes pra gente não parar no tempo. Um bom exemplo disso e falo sem nenhum interesse é nosso amigo Proex, que programa bem, mas encontrou o teto dele no que diz respeito aos PICs e partiu para arquitetura de 32 bits (em cima de ARM).

Ele ainda usa PIC (usa?) mas creio que encontrou algo que pudesse satisfazer sem uma diferença de custo de aprendizado e de produto significativa. Temos que evoluir a medida em que nossos projetos o necessitam. Eu tiro leite de pedra, se ela for mole e esponjosa. As vezes é um dolar ou dois no processador que me dá N vezes mais chances de terminar a coisa logo, e normalmente eu consigo tirar essadiferença noutro item nem tao crítco (tipo a fornecedora da PCI).

Então amigos, ajudemo-nos, mas sempre procurando mostrar além do caminho, outras alternativas, sem querer desmerecer o trabalho que o sujeito tá fazendo. Claro que as vezes os caras lidam com projetos na base do desafio e esquecem de outros fatores tipo time to market.

É por ae.

:lol:
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor rodrigoadachi » 24 Mar 2009 17:41

Sei que ha muita coisa sem comparação do PIC16F877A, mas assim por fim, não eh possivel fazer multitarefa, mas posso fazer algo que supra essa nescessidade?

Por exemplo, preciso piscar um LED tipo:

void led();
output_high(PIN_A0);
delay_ms(200);
output_low(PIN_A0);
delay_ms(200);
}

void main(){
while(true){
led();
serial=rs232_rx();
printf(lcd," Dado: %x",serial");
}
}


e + ou - ao mesmo tempo, preciso ler a serial e escrever no LCD o que leu na serial.

Os delays do led() irião atrazar a leitura.

Alguem poderia me dar exemplos de como fazer isso?

Por favor em C kk

Valew..
rodrigoadachi
Nibble
 
Mensagens: 70
Registrado em: 15 Out 2007 12:19
Localização: Bahia - Brazil

Mensagempor Djalma Toledo Rodrigues » 24 Mar 2009 18:37

Vonnilmam escreveu:... cada projeto tem uma necessidade adquada a um mcu em especial,cabe ao projetista definir que a melhor aplicação para cada chip....


Não seria ao contrário ?
Escolher o uC mais adquado a uma determinada aplicação.
.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor jeanfernandes » 24 Mar 2009 20:58

Rodrigo, imagino que voce já deu uma navegada pelos posts anteriores.
Vamos, lá. Se você tem intimidade com o ingles, voce pode ter acesso a uma grande quantidade de material sobre PIC.

Entre no site da Circuit Cellar (procure no google) e procure os Design Contest. Lá voce pode baixar todos os projetos feitos com PIC. Deve sair
alguma coisa de boa.

Depois (nao hoje) verifique sua caixa pessoal. Vou mandar um link para voce.

Outro ponto legal. Visite o site www.freebookspot.com (ou .net nao lembro). Lá tem outras fontes de informação (acesse o catalogo, e visite a seção de programação).

Se eu fosse procurar no google (mas vou deixar o prazer pra você) eu procuraria os seguintes termos:

multitasking PIC source code
16F877 round robin
PIC RTOS porting

Daria uma olhada no site da uxit para ver os app notes no assunto.
Daria uma olhada no site da FreeRTOS
Daria uma olhada no site epanorama.net
Daria uma olhada no site picmicroc.com (acho q eh esse)

Se depois de todas as alternativas acima citadas voce nao encontrar nada, eu mando fechar a internet. Leve isso pelo lado bom da coisa.
É um tipo de ajuda, tipo ensinar a pescar, muito bom nessa fase de aprendizado.

Só nao citei o CCS, porque por razoes pessoais não gosto de porcaria (na minha total é unica opiniao).

Valews.
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor jeanfernandes » 24 Mar 2009 21:28

Esqueci de um detalhe (last but no least).

quando voce imagina
coisa = serial_rx();
nao é bem assim que funciona pra ficar mais levinho.

Normalmente se fatia os processos em layers. Facilita muito a vida do desenvolvedor. Utilizando interrupcoes tipo serial, timer e tals e colocando tarefas minusculas dentro delas voce pode fazer as coisas funcionarem perfeitamente.

So corrigindo : ninguem disse que num dá pra fazer multitask. Dá, mas depende da quantidade de tarefas, tempo de execucao de cada uma, interelacao entre elas, e do processador escolhido ne. Leia mais sobre multitask, para entender o conceito.

Seria legal que voce comecasse a ler sobre UML como cachaça mesmo. Vai te ajudar no futuro a ser mais objetivo nas coisas.

Sobre a serial, ai ja cabe um estudo mais elaborado. Eu prefiro a tecnica de uso de buffer circular pra receber os dados (buffer + variaveis de tail e head) e uma tarefa pra ir tirando os dados do buffer, tratar a validacao do frame e executar o comando.

Aparece la no msn que a gente troca uma ideia....eh que sao muitos os conceitos a falar....e to meio q com preguiça de falar sobre....
Jean P. Fernandes - Eng. Eletrônico - (83) 2102-2116 - APEL - www.apel.com.br - Campina Grande - PB
jeanfernandes
Word
 
Mensagens: 539
Registrado em: 11 Out 2006 15:36
Localização: Campina Grande - PB

Mensagempor Vonnilmam » 24 Mar 2009 21:38

Caro jeanfernandes,


Meus parabens você falou bonito, cara!

Para poder tentar ajudar nosso amigo iniciante, eu aconselho como a maioria do colegas disse avaliar sua aplicação e analizar se seu MCU seja ele qual marca for, se dará conta do recado....Eu entendo que para aplicações "Vamos dizer até MÈDIO" nivel, tais como se comunicar com um PC pela serial, mostrar algo no LCD, ler um teclado e acionar algumas coisas o 877A dá o recado, é claro dentro do que poderiamos dizer coisas que não exijam muito esforço matemarico, UAI...

Outra coisa, sem dúvida o Jean disse uma coisa muito importante para todos nós pensarmos: É sempre bom encarar, aprender novas tendencias e jamais ter medo de aprender sobre novos conceitos de MCUs, quer seja 8 bits, 16 e por aí a fora. Eu particularmente utilizo muuuuito o 877A e estou a disposição do amigo iniciante para lhe ajudar, principalmente se for em ASSEMBLER...(QUE É UMA COISA LINDA) falo isso porque sou do tempo do ZÉ 80 entende!

O FABIM, eu não tenho nada contra você amiguinho, a minha antipatia boba é porque vc em certa época brincou (como vc mesmo disse) com os caras aquí do forum...então esse fato deixou a desejar, mas vamos deixar para lá, ok, vamos ser amigos...ok,

UMA DICA: Olha só amigo iniciante, eu costumo iniciar meus softwares da seguinte forma: Em primeiro lugar procure montar uma biblioteca de seu uso particular onde vc ira gerar #INCLUDES com as rotinas para LCD, TECLADO, DRIVER SERIAIS DIVERSOS, A/D, ETC..., de posse das rotinas (no meu caso são em assembler, eu explico porque: Minhas aplicações são relativamente simples e preciso usar o maximo de velocidade disponivel na MCU e saber exatamente o que ela esta fazendo, e também porque já sou viciado em assembler essa é a verdade + estou estudando C, tanto que comprei o livro desbravando o pic24, eheheheh) inicie então escrevendo sua rotina MAIN no loop principal, uma rotina de cada vez, e vá excutando-as, vc irá perceber que irá se deparando com dificuldades diversas e isso irá o ajudar a transpor essas dificuldades passo a passo, ponha a mão na massa sem medo de errar, se tiver duvidas venha aquí no forum que tenho certeza que obterá ajuda, ok...

Boa sorte, e obrigado a todos os amigos, briguinhas são normais, dá um thã e esquenta o MOTORES...

Até Mais, galera...gosto de todos vocês e os respeito muito a todos...
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

AnteriorPróximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x