Página 1 de 1

contador

MensagemEnviado: 16 Jun 2012 22:25
por ddspereira
ola pessoal,
estou com uma duvida, preciso fazer contagem com microcontrolador, ao todo vai ter 4 sensores vou precisar contar os pulso ai fiz o codigo abaixo para contar fiz apenas com duas portas para teste, o contador armazena a contagem em uma unica variavel, porem o codigo está com bug, alguem poderia analisar o codigo e dizer se estou fazendo da maneira correta.
obrigado a todos
Código: Selecionar todos
// LCD module connections
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;
sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB0_bit;
// End LCD module connections

int estado=0;
int estado1=0;
int teste = 0;
int teste1 = 0;
char to_LCD[6];
char to_LCD1[6];

void PWM(){
     PWM2_Start();
    PWM2_Init(35000);
    PWM2_Set_Duty(127);
    }

void main() {
     trisc.rc0 = 1;
     trise.re0 = 1;
     
    PWM();
    LCD_Init();
    LCD_Out(1, 1, "Entrada");
    LCD_Out(2, 1, "Saida");
    Lcd_Cmd(_LCD_CURSOR_OFF);

    while(1) {
                if (portc.rc0 == 1){
                teste++;
                intToStr(teste, to_LCD);
                LCD_Out(1, 9, to_LCD);
                //delay_ms(100);
                while(portc.rc0 == 1);
                }
                if (porte.re0 == 1){
                teste1++;
                intToStr(teste1, to_LCD1);
                LCD_Out(2, 9, to_LCD1);
                while(porte.re0 == 1);
                }
                }
                }

MensagemEnviado: 16 Jun 2012 23:53
por Cefas
Olá, ddspereira!
Então acho que seu código fonte tem duas inconcistências. Primeiro, logo após a função principal, você configurou os bits "0" dos registradores TRISC e TRISE como saídas, ou seja "setando" os mesmos, e no laço de repetição While você testa-os como se fossem entradas. Segundo, outro ponto que pode estar a falha são os dois "while(portc.rc0 == 1) e
while(portc.re0 == 1);", while é um laço de repetição, que ao ser verdadeiro executa algumas intruções. Agora, acho que pode funcionar com a instrução "do...........(instruções).................While(Condição);.

Att,
Cefas!

MensagemEnviado: 17 Jun 2012 00:27
por andre_luis
O problema é que seu código está esperando cada entrada retornar ao estado anterior :
Código: Selecionar todos
while(1) {
                if (portc.rc0 == 1){
                ...
                while(portc.rc0 == 1);
                }
                if (porte.re0 == 1){
                ...
                while(porte.re0 == 1);
                }

Acredito que são entradas assincronas e independentes, e não sequenciais.


+++

MensagemEnviado: 17 Jun 2012 12:24
por ddspereira
pois é André, as entradas tem que ser independentes este caso consigo fazer o que quero com as portas independentes e não uma logica sequencial??

MensagemEnviado: 17 Jun 2012 13:33
por andre_luis
Código: Selecionar todos
while(1) {
                if (portc.rc0 == 1){
                ...
                ///// while(portc.rc0 == 1);  //// Desnecessario
                }
                if (porte.re0 == 1){
                ...
                ///// while(porte.re0 == 1);  //// Desnecessario
                }


O que quero dizer é que voce está contando o pulso completo (borda subida+borda descida).
Retira a verificação indicada acima para ver que provavelmente vai resolver.

+++

MensagemEnviado: 17 Jun 2012 13:41
por ddspereira
é que tem outro detalhe, seguinte eu queria que a contagem ocorresse na borda de subida ou descida, caso eu tire o while e o sensor ficar sempre em nivel logico alto, não disparar a contagem?????

MensagemEnviado: 17 Jun 2012 14:50
por andre_luis
A lógica pra resolver o que voce precisa é simples, com a adição de apenas mais um flag, mas no momento não estou conseguindo raciocinar.
Porque voce não trabalha com interrupção ?

Pra tentar mais um palpite, experimenta assim :
Código: Selecionar todos
while(1) {
                if (portc.rc0 == 1);
                else {teste++; }
                }
                if (porte.re0 == 1);
                else  {teste1++; }
                }


Desse modo, a contagem de um dos sensores não estará bloqueando a contagem dos demais ( o WHILE implementa loop infinito )
No caso, ocorrerá na borda de descida.

+++

MensagemEnviado: 17 Jun 2012 15:03
por ddspereira
veja se posso fazer assim quero usar 4 portas do microcontrolador para poder receber pulso e a cada pulso incrementa o contador ai tenho o problema que o incremento deve ocorrer na borda de subida ou descida.
posso fazer uma rotina que monitora as portas e quando detectar o pulso gera interrupção e incrementa a variavel, o meu probelma é fazer as portas do microcontrolador detectar a borda.

MensagemEnviado: 17 Jun 2012 15:06
por andre_luis
Experimenta o modelo acima, tenho certeza que agora funciona.

+++

MensagemEnviado: 17 Jun 2012 15:23
por ddspereira
funcionou mais se a porta permanecer em nivel baixo dispara a contagem, eu queria que a contagem ocorre na transição mesmo se a porta ficar em nivel baixo só irá fazer a nova contagem caso a porta vai a nivel alto e depois para nivel baixo

MensagemEnviado: 17 Jun 2012 15:33
por andre_luis
Agora vai :

Código: Selecionar todos

char ContaPortcRC0 = 1 ;
char ContaPortcRE0 = 1 ;
while(1) {
                if (portc.rc0 == 1) {ContaPortcRC0 = 1 ;}
                else if (ContaPortcRC0 ==1) {teste++; ContaPortcRC0 = 0;}
                }
                if (porte.re0 == 1) {ContaPortcRE0 = 1 ;}
                else if (ContaPortcRE0 ==1) {teste++; ContaPortcRE0 = 0;}
                }



+++

MensagemEnviado: 17 Jun 2012 17:02
por ddspereira
André, funcionou perfeitamente obrigado

MensagemEnviado: 17 Jun 2012 19:58
por andre_luis
Fico satisteito em ter ajudado.
Tamos aí...



+++