Página 1 de 1

ADCs dos PICs

MensagemEnviado: 20 Set 2007 16:19
por lmdmendes
Eu estou iniciando em PICs, estou a testar a forma de usar os portos ADCs, do 18F452, contudo num programa exemplo, vejo isto:

*****************************************************
*****************************************************
unsigned char ch;
int t;
unsigned short tcc;
char *tc, cflag;
long tlong;

void interrupt()
{
t = Adc_Read(1); // get ADC value from 2nd channel
cflag = 1;
PIR1.TMR1IF = 0;
}


void Display_Adc(int adcval)
{
long longadc;
char ch;

PIR1.TMR1IE = 0;

longadc = adcval * 5000; // use int multiplication instead of long
asm{ // and fill the upper two bytes manually
MOVFF STACK_2, FLOC_Display_Adc+2
MOVFF STACK_3, FLOC_Display_Adc+3
}
adcval = longadc >> 10;
ch = adcval / 1000; // prepare value for diplay

Lcd_Custom_Chr(2, 10, 48 + ch); // write ASCII at 2nd row, 9th column
Lcd_Custom_Chr_CP('.');
ch = (adcval / 100) % 10;
Lcd_Custom_Chr_Cp(48 + ch);

ch = (adcval / 10) % 10;
Lcd_Custom_Chr_Cp(48 + ch);

ch = adcval % 10;
Lcd_Custom_Chr_Cp(48 + ch);
Lcd_Custom_Chr_Cp('V');
PIR1.TMR1IE = 1;

}//~

*****************************************************
Tem mais código, depois
*****************************************************

Quanto ao resultado da operação: PIR1.TMR1IF, sendo PIR1 um registo e TMR1IF um Bit desse registo, compreendo que esta apenas a alterar o dado desse Bit, desse porto.

Mas quanto a outra instruçao semelhante que é:
PIR1.TMR1IE = 1;

Não consigo compreender, pois PIR1 é um Registo e TMR1IE é uma Bit de outro registo diferente.

Afinal o que faz estas operação?

Alguém me pode ajudar?




Um Abraço

Re: ADCs dos PICs

MensagemEnviado: 20 Set 2007 16:55
por SoMeWhErE
Sou novato ainda, mas vou tentar explicar,

O Bit TRM1IF é o flag sinalizador da interrupção do TIMER1 que é setado quando o contador do TIMER1 estoura, e está localizado no registro PIR1.

No final da interrupção esse flag tem que ser limpo por software, por isso PIR1.TRM1IF = 0.

O Bit TRM1IE é o flag que habilita a interrupção do TIMER1, ou seja, a interrupção somente ocorrerá se esse flag estiver em nivel alto.

No inicio da função void Display_Adc(int adcval) a interrupção do TIMER1 é desabilitada, por isso PIR1.TMR1IE = 0;, para que ela não venha a interferir nessa parte do programa, e continua executando a função e no final volta a ativá-la, por isso PIR1.TMR1IE = 1; nessa parte é permitido que a interrupção interfira no programa.

Axu que é isso, se estiver errado ou cometi algum equivoco, alguem por favor me corrija.

MensagemEnviado: 20 Set 2007 17:03
por lmdmendes
Ok, na situação do PIR1.TRM1IF = 0, compreend q esta a por a "0" o bit desses registo, mas na situação do PIR1.TMR1IE = 1; o que me espanta é q o bit ou flag TMR1IE, não faz parte do registo PIR1, mas sim do registo PIE1.

Dai eu n compreender, pois de o TMR1IE fosse um registo do PIR1, tudo muito bem, estava a por a 1 esse bit q por sua vez corresponde au m flag, agora, como n é n compreendo como funciona essa função.

Um Abraço

MensagemEnviado: 20 Set 2007 17:43
por SoMeWhErE
Ok, corrigindo o que eu disse, esta certo o bit TRM1IE faz parte do registro PIE1, o que deve ter ocorrido no programa ae, deve ter sido algum erro de digitação.

MensagemEnviado: 21 Set 2007 14:59
por lmdmendes
Pois, tera que ser, pois não tinha grande logica igualar a um valor uma função di tipo "registos_X.Bit_do_registo_=0y" dai perguntei para queria, o mais engraçado é que esse programa exemplo esta a funcionar na perfeição :P

Alguma explicação? ou n será necessario colocar a '1' o bit TMR1IE????