Ir ao conteúdo

Posts recomendados

Postado

Como posso implementar no PIC18F4550 um programa multitarefa?

Eu tenho um programa que pisca um led, outro que é um relógio e um outro que escreve no teclado e aparece no LCD.

Como posso implementar esses 3 programas em 1 no PIC?

Postado

Observe que não existe 'multi tarefa' no microcontrolador,é tudo sequencialmente.

A velocidade de processamento é que dá a impressão de multitarefa,a não ser que o micro tenha mais núcleos,que não é o caso do PIC.

voce deve implementar as rotinas sequencialmente,pela ordem das rotinas de maior prioridade,ou seja,o que voce deseja executar primeiro.

Postado
Observe que não existe 'multi tarefa' no microcontrolador,é tudo sequencialmente.

A velocidade de processamento é que dá a impressão de multitarefa,a não ser que o micro tenha mais núcleos,que não é o caso do PIC.

voce deve implementar as rotinas sequencialmente,pela ordem das rotinas de maior prioridade,ou seja,o que voce deseja executar primeiro.

Eu sei, o pic só tem um núcleo...

Estou pedindo ajuda pra implementar um um sistema em tempo real. Estou com dificuldades de implementar no código RTOS como o FreeRTOS ou o BRtos

Postado
Estou com dificuldades de implementar no código RTOS

Então use interrupções. Funções RTOS servem para facilitar esse trabalho evitando interrupções, mas nesse caso não seria difícil usa-las, a menos que o objectivo seja mesmo o RTOS. Com a interrupção do timer podes fazer o led piscar e o relogio. para o teclado podes usar as interrupções nos ports.

Postado
Então use interrupções. Funções RTOS servem para facilitar esse trabalho evitando interrupções, mas nesse caso não seria difícil usa-las, a menos que o objectivo seja mesmo o RTOS. Com a interrupção do timer podes fazer o led piscar e o relogio. para o teclado podes usar as interrupções nos ports.

Quero implementar para aumentar a dificuldade aos poucos, depois colocar um PWM, um leito ADC, um contador, cálculos com variáveis externas como sensores...

Postado

Meu Caro,

realizar esse sistema operacional de tempo real depende muito da sua experiência com esse tipo de problema.A minha sugestão, se acaso você está habituado a programar o PIC diretamente em C e conhecimento de hardware, que você gaste algum tempo definindo bem as atividades rotineiras e as que estão relacionadas a eventos. Num sistema simples, dedicado, um loop infinito já é um RTOS. Você administra as atividades rotineiras dentro do loop. As coisas relacionadas com o tempo, desde que sejam curtas, numa rotina de interrupção de algum timer. Os eventos não relacionados com o tempo, você atende seja por interrupção ou por outros meios conforme vão chegando. Parece complicado, mas é muito simples. Eu mesmo já fiz diversos assim e estão por aí na praça funcionando muito bem. Se acaso você não tem essa experiência, aí a coisa complica...

Boa sorte. Abraço!

Henrique

consulte sempre um engenheiro eletrônico

Postado
Meu Caro,

realizar esse sistema operacional de tempo real depende muito da sua experiência com esse tipo de problema.A minha sugestão, se acaso você está habituado a programar o PIC diretamente em C e conhecimento de hardware, que você gaste algum tempo definindo bem as atividades rotineiras e as que estão relacionadas a eventos. Num sistema simples, dedicado, um loop infinito já é um RTOS. Você administra as atividades rotineiras dentro do loop. As coisas relacionadas com o tempo, desde que sejam curtas, numa rotina de interrupção de algum timer. Os eventos não relacionados com o tempo, você atende seja por interrupção ou por outros meios conforme vão chegando. Parece complicado, mas é muito simples. Eu mesmo já fiz diversos assim e estão por aí na praça funcionando muito bem. Se acaso você não tem essa experiência, aí a coisa complica...

Boa sorte. Abraço!

Henrique

consulte sempre um engenheiro eletrônico

Quero aprender a implementar um RTOS pronto como o freeRTOS, pois por exemplo, um LCD é atualizado 1x por segundo enquanto o teclado pode ser acionado a qualquer momento e ao mesmo tempo algum pino está fazendo uma leitura de um sensor, administrar esse tempo com um rtos fica mais fácil. Aliás, a medida que o circuito vai ficando mais complexo e vai demandando tarefas mais críticas fica mais complicado administrar o tempo de cada tarefa e ai um RTOS fica melhor de mexer....

Postado

Usar RTOS para rotinas simples como as que voce citou,limita sua memória e seu sistema.

Se for usar USB,que esse pic tem,nem sei se o comportamento seria desejável.

RTOS é mais usado em arquitetura ARM.

voce pode usar num PIC mas não vejo nenhuma utilidade prática na linha 16F,18F,geralmente se programa em Assembly quando a temporização ou sincronização de algum periférico ou rotinas é crítico.

Postado
Observe que não existe 'multi tarefa' no microcontrolador,é tudo sequencialmente.

A velocidade de processamento é que dá a impressão de multitarefa,a não ser que o micro tenha mais núcleos,que não é o caso do PIC.

voce deve implementar as rotinas sequencialmente,pela ordem das rotinas de maior prioridade,ou seja,o que voce deseja executar primeiro.

O problema de implementar rotinas sequencialmente é que, por exemplo, se eu tiver um sistema com um sensor, teclado e LCD, o LCD leva muito tempo para escrever um digito na tela e esse tempo pode atrapalhar a leitura do sensor... Se pelo menos eu tiver uma ideia de como fazer o Delay_ms virar uma função para ficar monitorando o sensor durante o intervalo de tempo e depois voltar de onde parou....

Postado

voce pode usar interrupção ou invés de usar a função Delay,voce pode fazer um LOOP e dentro deste LOOP ler o sensor,bastaria calcular quantas vezes este LOOP tem que ser feito para 'gastar' o mesmo tempo se fosse usar Delay.

O problema de implementar rotinas sequencialmente é que, por exemplo...

Não existe problema,todo mundo programa assim,imagine ter 50 interrupções para fazer 50 tarefaz...

Postado

Para tarefas como essa que citei, LCD + teclado + sensor + calculos, posso usar 2 pics?

1 ficaria por conta de LCD e teclado e outro com sensor e calculo.

recebe e envia os dados atraves de buffer, ou seja, quando solicitado um pic descarrega informações de um teclado ou atualiza um LCD, assim a demora em scanear o teclado ou enviar um caracter para o LCD não influenciaria nas outras operações...

Essa comunicações pode ser feita ou uart e o pic do sensor saberia que dados a receber ou enviar através de uma interrupção externa...

Isso é viável?

li isso em um site aqui

As interrupções são muito utilizadas no mundo dos microcontroladores e dos microprocessadores. Um exemplo típico são nossos microcomputadores PC. Sempre que pressionamos uma tecla, uma interrupção é gerada para o microprocessador, solicitando o tratamento desta. Assim, o PC não é obrigado a varrer constantemente o teclado em busca de uma tecla. Porém é claro que para que isso seja feito, “alguém ou alguma coisa” deve fazer esta varredura por ele. Isso é feito por um microcontrolador dedicado, interno em todos os teclados de PC. Assim temos a geração de uma interrupção no processamento central por parte de um “periférico”.
Postado

voce deve postar o código para que mais pessoas te ajudem.

Parece que voce esta completamente perdido nesta sua tarefa.

Usar 2 pics para isso é o mesmo que usar 2 Pcs para assistir 2 videos no youtube ao mesmo tempo.

Postado

Boa tarde,

Na minha opinião, 1 PIC só faz isso tranquilo.

Estou terminando um projeto que tem display gráfico 128x64, teclado de 8 teclas com bip, conversor A/D (2 canais), faz cáculo de leitura de um PT100 por calendar van-dusen, monitora 6 entradas digitais e controla 8 saídas.

O teclado é multiplexado com o bus de dados do GLCD.

Uso um PIC18F4550 clock do núcleo 16MHz.

Até agora, está sendo usados 20% da RAM e 42% da ROM no CCS, tem muitas "strings" e elas ocupam bastante a ROM.

Funciona muito bem e rápido, não perde sequer 1 pressionamento de qualquer tecla.

Pretendo implementar USB para enviar o valor da temperatura para o PC.

Att,

Postado

Também acho que o colega está perdido na tarefa a ser executada.

Esse sensor que você monitora por acaso seria de abertura de um air-bag? Esse precisa abrir o mais rápido possível.

Se não for algo do tipo, não veja necessidade de se preocupar com o tempo perdido no LCD.

Afinal qual o sensor usado?

Uma coisa que você deve ficar ciente é que o PIC não foi feito para realizar cálculos complexos. Dependendo das contas a serem feitas, as mesmas devem ter uma abordagem adequada.

Falou

Postado

Acho que tem como na inicialização do seu programa, fazer algo parecido, pode fazer o programa ler 3 Chaves por exemplo.., cada uma com uma função de programa no qual tenha a rotina da funcionalidade desejada pelo "usuário", porém isso é um pouco limitado, pois depende do numero de ports, memória , etc..

  • 3 anos depois...
Postado

Olá, pessoal. É possível usando o pic12F675 executar em um pino frequência de 500Hz constantemente para ser aplicada a um  diodo infra vermelho e ser captado pelo mesmo pic?

O objetivo é fazer um secador automático de mão com esse pic apenas, o que seria preciso é que um dos pinos pudesse trabalhar independente das outras instruções.

Obrigado,

Postado

1 - Use o TIMER0 para gerar uma interrupção a cada 2ms (isso dá 500Hz).

A fórmula para gerar o período é:

T = Tck . Prescaler . (256 - TMR0).

TMR0 = 256 - [T / (Tck . Prescaler)], onde:

T = 2ms

Tck = Foscilador / 4

Prescaler é um fator de divisão. Pode ser desde zero até 256, em fatores de 2.

Ex.:

Seja um cristal de 4MHz, então, escolhendo-se o fator de divisão do prescaler em 8, tem-se:

TMR0 = 256 - [2ms / (1us . 8))] = 256 - [2.000 / 8] = 6

Atualizando o valor de TMR0 em 6, a cada interrupção, você chega a 500 interrupções por segundo, ou de 2ms em 2ms.

Mas se você "deixar rolar o TIMER0", sem atualizar a cada interrupção, o seu período vai valer, no exemplo:

T = Tck . Prescaler . (256 - TMR0) = 1us . 8 . (256 - T0) = 2,048ms, ou 488,3Hz.

Nesta condição nem precisa atualizar o valor do TIMER0. Vão ser necessárias menos tarefas a serem executadas dentro da interrupção.

2 - Use o CAD com 8 bits, para conhecer o valor a ser medido da energia infravermelha (IV). Aí será necessário um circuito que forneça zero volts sem IV e 5V (caso a fonte de alimentação seja de 5V) com IV máximo. Esta deve ser uma função LINEAR.

3 - Quanto mais IV, maior será o valor do CAD e quanto menos IV, menor será o valor do CAD. 

4 - Para conhecer o valor correto de Ton, você deve comparar um valor desejado de IV com o valor medido de IV. (Vdesejado - Vmedido, ou Vd - Vm). O valor desejado Vd é o valor de IV (ou de calor), que você deseja e o valor medido Vm é o que o CAD mediu.

Repare que quanto mais próximo de zero for essa diferença, menor vai ser o erro entre Vd e Vm, ou mais o valor medido se aproxima do valor desejado, o que queremos.

 

 

1 - Estabeleça um valor de calor (Vd)

2 - A cada interrupção desligue a saída. Este instante corresponde ao início de Toff.

3 - Dentro da interrupção, calcule Vm com o CAD.

4 - Ache a diferença entre Vd e Vm.

5 - Se a diferença for POSITIVA, significa que Vd é maior que Vm, ou que o calor desejado é maior que o medido. Então aumente Ton.

Se a diferença for NEGATIVA, significa que Vd é menor que Vm, ou que o calor desejado é menor que o medido. Então diminua Ton.

6 - Diminuir Ton é aumentar Toff e vice-versa. Use o TIMER1 para gerar o Toff. Quando a interrupção do TIMER1 ocorrer, simplesmente ligue a carga.

Então você usa o TIMER0 para gerar o período T do PWM e para desligar a carga.

Você usa o TIMER1 para ligar a carga, ou iniciar o período Ton.

O ciclo se repete entre os dois TIMERs.

MOR_AL

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...