Ir ao conteúdo

Posts recomendados

Postado

Olá a todos,

 

O objectivo é através de um resultado do ADC, que recebe um valor analógico no pino RB4 (PIC16F690) converter esse valor para digital e esse valor ser utilizado no ciclo for para que o processo pare.

 

void timer(){
      __delay_us (50);
      ADCON0 |= 0b00000010;
      for(int i=0; i<=result;i++){
     __delay_ms(20);
      }
}

 

No interior do interrupt do isr


    if(ADIF){    
       ADIF=0;
       result = ADRESH;    
    }

 

Portanto, quando for chamada a função timer() ela deve correr um ciclo for tantas quantas vezes for o valor de ADRESH. Mas não está a funcionar. Suspeito, que mesmo que colocando o valor de RB4 a zero ou a 5V o valor de ADRESH é sempre o mesmo, nulo. Por isso o ciclo é muito rápido e é como senão existisse.

 

Como posso resolver a situação?

Valeu

  • Curtir 1
Postado

Tem exatamente o mesmo comportamento.

No proteus tem como ver o valor dessa variável, no momento de execução?

adicionado 10 minutos depois

Fiz pausa no código. E a variável tem o valor 0! :/

  • Membro VIP
Postado

Tem sim. Mas antes, certeza que:

-que a interrupt da conversão ocorre? (penso que não precisa de interrupt no momento)

-configuraste corretamente o hw?

-estás a ler o canal correto?

 

No proteus, carregue o .cof (teu compilador tem que gerá-lo) e não o .hex. Com isto hás de ver as variáveis

Postado

@Isadora Ferraz

O que é o hw?

 

No proteus tenho a aba do circuito e a aba do código. Estou a programar directamente no proteus.

Não tenho a certeza que o interrupt ocorra...Poderei chamar tudo no interior da função timer?

  • Membro VIP
Postado

ok.

1 hora atrás, ilovepic disse:

Estou a programar directamente no proteus

Se achares que deves, publica o fonte completo. Minha bola de cristal tá enferrujada kk

 

hw é hardware ou o circuito do mc. P.ex. um mesmo pino do mc (microcontrolador) tem várias funções. você define qual e como será usada no programa. p.ex. TRISB4=1; //entrada ou TRISB4=0;//saída epor aí vai... . Só que isso é um nível mais baixo do mundo da programação. Por gentileza, humilha-te um pouco e dá uma olhadela no datasheet. O mundo não é 'soft' não kk. Rapadura é doce mas não é mole não kk

 

1 hora atrás, ilovepic disse:

Poderei chamar tudo no interior da função timer?

De fato podes chamar apenas no loop principal sem interrupt. Algo como

void main(void)
//inicializar hw
for(;;)
{
a=adc_read(0);//dê uma olhada pois deve ter esta função prépronta no compilador
for (i=0;i<a;i++) {funcao();}//executa "a" vezes a funcao()
}

beeeemm simples.

 

Acho que o teu pulo do gato está em "inicializar o hw" correctamente

Postado
9 minutos atrás, Isadora Ferraz disse:

 

Acho que o teu pulo do gato está em "inicializar o hw" correctamente

Também acho que sim!

O pino onde estou a ligar o potenciometro é o RB4. No datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/41262C.pdf

página 8 do pdf, informa que o rb4 tenho que activar o AN10, certo? Como faço isso?

Faço AN10 = 1  no main?

 

Obrigado

  • Membro VIP
Postado

Sim isso e um pouco mais que isso.  Por gentileza, queira ler a seção

9.0ANALOG-TO-DIGITAL
CONVERTER (ADC) MODULE

 

Ó...

 

"When configuring and using the ADC the following
functions must be considered:
•Port configuration
•Channel selection
•ADC voltage reference selection
•ADC conversion clock source
•Interrupt control
•Results formatting"

 

"When converting analog signals, the I/O pin
should be configured for analog by setting the associated
TRIS and ANSEL bits. See the corresponding port
section for more information"

 

Algo como

TRISB4=1;//entrada...

ANS10=1;//...analógica

Tens que ver como teu compilador trata estes bits. Mas não deve fugir muito disso não.

Configurar ADC voltage reference selection, ADC conversion clock source, Results formatting permito-me deixar por tua conta ok? Só se REALMENTE tiver alguma dificuldade pode perguntar ok?

 

Depois de ler/estudar 1 pouco, estarás apto a dominar o mundo

Postado

Aqui vai um teste:


#include <htc.h>
//#include <pic16f690.h>
//#define _XTAL_FREQ 4000000

int result;

void config_adc(){
    ADCON0=0b00101101;
    ADCON1=0x50;
    INTCON=0xC0;
    ADIE=1;
    ADIF=0;    
} // end config_adc()

void interrupt isr(){
    if(ADIF){    
       ADIF=0;
       result = ADRESH;
    } // end if Interrupção para o ADC
} // end interrupt isr()

void timer_adc(){
      __delay_us (50);        
      ADCON0 |= 0b00000010;
      for(int i=0; i<=ADRESH;i++){
     __delay_ms(20);
      } // end for
} //end timer_adc()

void main(void)
 {
     TRISB4 = 1;
     TRISB5 = 0;     
     ANSEL = 0;
     ANSELH = 0;
     ANS10 = 1;     
   while (1){    
     if(result != 0){
      RB5 = 1;
     } // end if
     RB5 = 0;      
   } // end while     
 } // end main

 

RB5 nunca fica activo, pois result nunca assume valor diferente de zero!

O que estarei a fazer de mal?

 

Obrigado

  • Membro VIP
Postado

Penso que deves dar uma "rebobinada na fita".  p.ex. estás a esquecer de liberar as interrupts.

No entanto, permita-me observar que: Usá-las penso ser pra um nível acima do introdutório. No teu caso, basta-te as funções pre-mastigadas de acesso ao hw do teu compilador. Falando nisso... peço-te a gentileza de perceber os exemplos de adc (e otras cositas más) que (provavelmente) vêm junto com teu compilador. E antes ainda, passe pelo pisca led: hello world!

Ah sim, publique o desenho esquemático...

Postado

Já tenho alguma experiência no pisca pisca e no hello world. Mas aqui estou-me a enrolar. Já consegui colocar o adc a fornecer valor para o pwm, mas acho que estou a configurar mal alguma coisa no interior do config_Adc().

 

o que estou a fazer mal com os interrupts? Pode dar uma luzes?

  • Membro VIP
Postado
2 horas atrás, ilovepic disse:

consegui colocar o adc a fornecer valor para o pwm

Ora pois! Mostra como conseguiste esta façanha. Neste caso, configuraste correctamente o tal config_Adc().. pá.

Perdão mas devo insistir pra que dês uma olhadela nos exemplos do teu compilador e ...

3 horas atrás, Isadora Ferraz disse:

publique o desenho esquemático...

 

Postado

Aqui vai:


void pwm()
{
T2CON=0x05;    
PR2=250;
CCP1CON=0x0C;
CCPR1L=0;
TRISC5=0;
}


void config_adc()
{
    ADCON0=0b00001101;
    ADCON1=0x50;
    TRISA=0b00010000;
    ANSEL=0b00001000;
    ANSELH=0;
    INTCON=0xC0;
    ADIE=1;
    ADIF=0;

}

void interrupt adc()
{
    if(ADIF)
    {
        ADIF=0;
        //Codigo Pretendido
        CCPR1L=ADRESH;

    }    
}

void main(void)
 {
       TRISC=0;
    PORTC=0;
    config_adc();
    pwm();
   while (1){
        __delay_us (50);
        ADCON0 |= 0b00000010;
    } // end while
      ;
 }

 

Não estou a conseguir aplicar este exemplo de codigo no timer.

  • Membro VIP
Postado

ok.  Mas seu código ta muito esquisito...

 

amigo tenta por partes. Mostre o resultado do ad num terminal p.ex. De novo, veja nos exemplos que vem com teu compilador como usar o adc e faça um printf dele

Postado
4 minutos atrás, Isadora Ferraz disse:

ok.  Mas seu código ta muito esquisito...

 

amigo tenta por partes. Mostre o resultado do ad num terminal p.ex. De novo, veja nos exemplos que vem com teu compilador como usar o adc e faça um printf dele

 

Ok, agora ficou meio esquisito para mim. Como eu vejo isso? Ainda estou a explorar/aprender a trabalhar com o proteus.

Como utilizo essas funcionalidade de ver quais valores estão a ser atribuidos às variáveis e outras funcionalidades que são importantes!?

 

Valeu

  • Membro VIP
Postado

o proteus tem um virtual terminal que mostra a saída da serial do mc. Conecte o tx do mc no rx do terminal.

 

bem meu bem...Infelizmente, penso que teremos alguma dificuldade em detalhar mais profundamente alguns princípios básicos. Por gentileza, queira continuar a ...

5 minutos atrás, ilovepic disse:

explorar/aprender a trabalhar com o proteus.

e não só isso...aprenda os princípios do hw (circuito) do mc em questão. Escove alguns bits quase que literalmente. E finalmente, o mesmo para a linguagem que escolheste...

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!