contador

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

contador

Mensagempor ddspereira » 16 Jun 2012 22:25

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);
                }
                }
                }
ddspereira
Bit
 
Mensagens: 42
Registrado em: 24 Set 2009 23:34

Mensagempor Cefas » 16 Jun 2012 23:53

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!
Cefas
Nibble
 
Mensagens: 58
Registrado em: 26 Dez 2011 19:47

Mensagempor andre_luis » 17 Jun 2012 00:27

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor ddspereira » 17 Jun 2012 12:24

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??
ddspereira
Bit
 
Mensagens: 42
Registrado em: 24 Set 2009 23:34

Mensagempor andre_luis » 17 Jun 2012 13:33

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.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor ddspereira » 17 Jun 2012 13:41

é 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?????
ddspereira
Bit
 
Mensagens: 42
Registrado em: 24 Set 2009 23:34

Mensagempor andre_luis » 17 Jun 2012 14:50

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.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor ddspereira » 17 Jun 2012 15:03

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.
ddspereira
Bit
 
Mensagens: 42
Registrado em: 24 Set 2009 23:34

Mensagempor andre_luis » 17 Jun 2012 15:06

Experimenta o modelo acima, tenho certeza que agora funciona.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor ddspereira » 17 Jun 2012 15:23

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
ddspereira
Bit
 
Mensagens: 42
Registrado em: 24 Set 2009 23:34

Mensagempor andre_luis » 17 Jun 2012 15:33

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;}
                }



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor ddspereira » 17 Jun 2012 17:02

André, funcionou perfeitamente obrigado
ddspereira
Bit
 
Mensagens: 42
Registrado em: 24 Set 2009 23:34

Mensagempor andre_luis » 17 Jun 2012 19:58

Fico satisteito em ter ajudado.
Tamos aí...



+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

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

x