Autor Tema: Extraño comportamiento Proteus y ADC (18F4520)  (Leído 1648 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ezesolares

  • PIC10
  • *
  • Mensajes: 13
Extraño comportamiento Proteus y ADC (18F4520)
« en: 11 de Septiembre de 2007, 17:17:58 »
Hola

Primera vez que trabajo con un micro pic que tiene tiempo de adquisicion automatico. Pero todavia no lo logro hacer funcionar bien en el simulador.
No he tenido nunca problemas con los anteriores micros que he trabajado (18F252, 18F452).

El punto es que tengo dos canales de A/D, y cuando hago el cambio entre ellos, tarda el micro en llegar a la tension del otro canal si cambio el valor de este. Es como si el capacitor interno del A/D no se termina de descargar para llegar a la tension del otro.

Este es el codigo

-----------

#include "p18f4520.h"
#include <adc.h>

void low_isr (void);
void tmr2(void);
void high_isr (void);


#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
   _asm
      GOTO low_isr
   _endasm
}
#pragma code /* return to the default code section */

#pragma interruptlow low_isr
void low_isr (void)
{
   if (PIR1bits.TMR2IF) {
      tmr2();
   }
   if (PIR1bits.ADIF) {
      PIR1bits.ADIF = 0;
//      ADC_interrupt();
   }
/*   if (PIR1bits.TXIF) {
      PIR1bits.TXIF = 0;
      USART_send();
   }*/
}

void tmr2(void)
{
   TMR2 = 0;
   PIR1bits.TMR2IF = 0;
}


#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
   _asm
      GOTO high_isr
   _endasm
}
#pragma code /* return to the default code section */

#pragma interrupt high_isr
void high_isr (void)
{

}

void main (void)
{
   unsigned char Temp1 = 0xFF;
   unsigned char Temp2 = 0x3F;
   unsigned char Temp3 = 0x30;
   unsigned char Temp4 = 0, Temp5=0, Temp6 = 15;
   int result;

   TRISA=0b00000011;

   T0CON=0x08;
   
   CCP1CON = 0x00;
   CCP2CON = 0x00;
   CMCON   = 0b00000111;

   OpenADC(ADC_FOSC_32 &
         ADC_RIGHT_JUST &
         ADC_20_TAD,
         ADC_CH0 &
         ADC_INT_OFF &
         ADC_VREFPLUS_VDD
         , 13 );

   
   while(1) {
      if (Temp5==0) {
         SetChanADC(ADC_CH0); Temp5=1; }
      else {
         SetChanADC(ADC_CH1); Temp5=0; }

      Delay10TCYx( 50 ); // Delay for 50TCY
      ConvertADC(); // Start conversion
      while( BusyADC() ); // Wait for completion
      result = ReadADC(); // Read result
      Delay10TCYx( 50 ); // Delay for 50TCY
   }
}

------------

Cuando cambio un canal A/D de 5V a 0 (como esta en el esquematico), primero cambia a 2,5, se mantiene un par de ciclos(o sea, se repite varias veces ese valor) hasta que recien, luego de 10 ciclos de lectura de ese canal A/D llega a el valor de 0.

No se que es, y no se que hacer. La razon por la cual todavia no lo probe en la realidad, es que estoy esperando que me lleguen los micros de buenos aires, siendo de tucuman yo! :(

Subo un rar donde esta el .C, el .HEX y el esquematico para el proteus (7.1)

http://files-upload.com/files/496498/checkad.rar


Saludos y gracias

Ezequiel


 

anything