Multitarefa com o PIC16f877a ( thread )

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PARA PENSAR :)

Mensagempor tcpipchip » 24 Mar 2009 23:36

Para pensar...

/*
* Threads.java PIC JAVA
*
*/

package com.kitnacional.examples.threads;

import com.kitnacional.KITRunnable;
import com.kitnacional.io.PinIO;
import com.kitnacional.io.PortIO;

public class CooperativeThreads extends KITRunnable {

public void run(){

for(int i = 0; i < 6; i++){
if( i < 3){
new PinTogglerThread( PinIO.encodePin( PortIO.PORTD, i ), 200 * (i + 1) ).start();
}else{
new PinTogglerThread( PinIO.encodePin( PortIO.PORTD, i ), -200 * (i + 1) ).start();
}
}

PinIO.setPinAsOutput( PinIO.PIND7 );

while(true) {
PinIO.toggleOutputPin( PinIO.PIND7 );
// Thread.yield();
try{ Thread.sleep( (long) 200 ); }catch(Exception e){}
}

}
}

cria 6 threads, onde cada thread é responsavel por piscar um led (BIT) especifico do PORTD (0..5), a cada 200ms. Tambem o bit 7...
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor jeanfernandes » 25 Mar 2009 06:15

PIC rodando Java ?
Miguel ? num fica pesado naum ?

Depois fui olhar de curioso que sou

http://jpictools.sourceforge.net/
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 helton » 25 Mar 2009 07:52

Pelo que eu entendi, o rodrigoadachi só quer saber como usar as interrupções do microcontrolador...( aquilo que ele chama de multitask )...

por exemplo para piscar um led usando uma interrupçao de tempo...
isso sem gerar nenhum atraso, delay, ou coisa parecida...

Código: Selecionar todos
/* timer interrupt / 10ms */
unsigned char tmp_led;
unsigned char tmp_1s;

void timer_int( void ) irq
{
 if (tmp_led > 0)tmp_led--;
 else{
   LD1 = 1;
 }

  if(tmp_1s >0 ) tmp_1s--;
  else{
    tmp_1s = 99;
    tmp_led = value;
    LD1 = 0;
  }
}



Compre um dos livros sobre PIC e siga os exemplos...

Agora...Java pra PIC...hummm....sei nao...
Helton Marques
"Priorize as Prioridades"
helton
Byte
 
Mensagens: 146
Registrado em: 16 Out 2006 09:18
Localização: São José-SC

Mensagempor guest2003 » 25 Mar 2009 08:09

Pessoal,

Dei uma lida em tudo isso discutido aqui e gostaria de pedir licença para contar uma piadinha para ilustrar o que estou pensando...

Um belo dia chega a garotinha lá pelos seus 8 anos para os pais, após o primeiro dia de aula e pergunta, mamãe o que é SEXO ?

Os pais se entre olham e dizem, é chegou o momento, vamos explicar para ela... e ficam por volta de 3 horas explicando para ela como tudo acontece... desde o momento que os pais se apaixonam, bla bla bla, até o nenem nascer...

A pobre coitada da menina com olhar assustado pergunta:

Como vou escrever TUDO ISSO neste quadradinho aqui do questionario:

NOME:
SEXO: [ ]

:)

enfim, nosso amigo é iniciante, o que ele quis dizer / perguntar, é simplesmente como fazer coisas basicas que fazemos sempre... como ele mesmo exemplificou

Tocar um Beep por 3 segundos, e Não ter que ficar parado esperando.

Ou por exemplo, piscar 3 leds em frequencias diferentes...

é isso... este post foi pra tentar melhorar a pergunta para que possamos ajudar com mais objetivo o amigo.

[]'s
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor fabim » 25 Mar 2009 09:07

Rodrigo, me deixe dar uma exempru por cima pra você poder entender.
Eu só programo com o mikroC, o jean ainda não me arrumou o compilador ANSI C de macho que me prometeu.

Void interrupt(void){
}

Basicamente ao criar isto, você esta dizendo para o compilador que a rotina de tratamento de interrupções seria o mesmo que.

void interrupt(void)Absolut org 0x04 {
}

Lembra de seus primordios de estudo, que o vetor de interrupção fica no endereço 0x04. A maioria dos pic´s adotou este endereço.

Pois bem, este endereço basicamente pode ser inserido toda uma execução de tratamento, ou simplesmente servir para chamada de outras rotinas, totalmente fora de 0x04, as quais são responsáveis pelo tratamento de ADC, SPI, I2C, USART, PSP, e etc.

Neste quesito de como se aplicar uma multi tarefa, depende muito de o que você precisa, qual a necessidade de cada processo, e como deve ser feito isso.

Vamos para um exemplo besta, o qual você pode entender bem o que eu quero dizer.

Neste exemplo o main fica livre, e as rotinas são tratadas dentro de outras rotinas chamadas pela int.
//***********************************************************
void interrupt(void){
if(interrptRB0){ trata_rb0();clr_flg;)
if(interrupt_Usart){trata_usart();clr_flg;}
if(interrupt_adc){trata_adc();clr_flg;}
Clr_flags();
intcon.gie=1;
}


void main(void){
while(1){
portd = ~portd;
delay_ms(500);

}
}
//***********************************************************

Observe o seguinte, para cada trata_interrupt();
O programa sai do main principal, e fica preso dentro desta sub rotina, o tempo suficiente para que o processo de tratamento seja finalizado, isto pode ser um grande problema, se por exemplo o tempo para finalização do tratamento for de 1S, e neste um segundo chegar dados pela serial, ainda não deu tempo de você ir lá tratalo, logo chegara outro dado, e vai sobreescrever o anterior.
Entendeu sobre velocidade e tempo de execução ?Isso complica as coisas!!

AGora observe desta forma.

//***********************************************************
_u short a,b,c;

void interrupt(void){
if(interrptRB0){a=255; clr_flg;}
if(interrupt_Usart){b=255;clr_flg;}
if(interrupt_adc){c=255;clr_flg;}
intcon.gie=1;
}


void main(void){
while(1){
if(a){ trata_rb0();)
if(b){trata_usart();}
if(c){trata_adc();}
}
}
//***********************************************************

Observe a diferença basica!!
Veja que da primeira forma,"claro que teria como ser diferente", quando você entra na int e vai tratar determinada função, você não consegue ver outras int´s pois esta ocupado demais para isto, e o INTCON.GIE não esta ativo, pois o seu processo daquele determinada int tratada não poderia ser parado.CERTO.!

Agora na segunda forma, você criou o que eu chamo como máquina de estados, você fica em um continuo scan, testando interrupções e as tratando, mesmo que esta tratando um determinado, a interrupt pode acontecer novamente, e você pode tratar rapidão outra.

Claro que se eu for explicar tudim tudim, eu vou ficar 1 semana escrevendo, mais só pra te dar uma clareada.
E não precisar escrever tudo sobre SEXO aqui dentro.
[ ].

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 jeanfernandes » 25 Mar 2009 12:38

Eh Marcelo,
so que pra saber sexo [ ] tem conceitos anteriores ne.
Multitask para o [ ] vai uma diferenca maior.
Buenas, mas eh por ae mermo.

Eh que tipo ne, eu mesmo to acostumado com o sistema minimo.
Sei la, acho que eh escola mesmo.
Mas eu mandei umas infos pro cara ae se ligar no meio de campo.
bem [ ]
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 » 04 Abr 2009 22:15

Tô estudando pessoal, assim que eu tiver alguma posição eu retorno aki..

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

Anterior

Voltar para PIC

Quem está online

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

cron

x