CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

SPI DI and External Interrupt by RB0
Goto page Previous  1, 2
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Ttelmah



Joined: 11 Mar 2010
Posts: 19401

View user's profile Send private message

PostPosted: Thu Oct 03, 2013 4:27 am     Reply with quote

I'd suggest, depending on the compiler version, adding setup_adc(NO_ANALOGS); at the start of the code. The 26J50, is one of the chips that with some compiler versions wakes up with the analogs enabled.
The INT_EXT line will never work if this is the case.

Repeat PCM_programmers statements though:

Post your code.

What is your compiler version ?

Best Wishes
JosedeJesusC



Joined: 29 Mar 2013
Posts: 24

View user's profile Send private message

PostPosted: Sun Oct 06, 2013 6:26 pm     Reply with quote

Hi thanks for your reply here is my code.
my compiler version is PCWHD 4.105
Code:

#include<18f26J50.h>
#fuses HSPLL, NOWDT, NOPROTECT, NODEBUG, PLLDIV1, NOCPUDIV, STVREN, NOXINST
#USE delay(clock = 48000000)

#define INTCON 0XFF2
#bit    GIEH = INTCON.7// set up global all high priority interrupts
#bit    GIEL = INTCON.6// set up global all low priority interrupts
#bit    INT0IE = INTCON.4// anable interrupts by RB0
#bit    INT0F  = INTCON.1// Flag if interrupt ocurred
#byte INTCON2 = 0XFF1
#byte INTCON3 = 0XFF0
#define RCON     0xFD0
#BIT    IPEN = RCON.7

#define ADS1251_DOUT_DRDY_PIN  PIN_B0
#define ADS1251_SCLK_PIN       PIN_B1

//----------------------Define ADS1254 COSNTANTS---------------------
#define ADS_CLK_FREQ  320000
#define ADS_SAMPLE_FREQ  (ADS_CLK_FREQ / (6 * 64))  // A/D samples/second

#define ADS_CONVERSION_CYCLE_PERIOD_IN_USEC  ((384 * 100000) / ADS_CLK_FREQ)

#define ADS_TIMEOUT_IN_USEC  ADS_CONVERSION_CYCLE_PERIOD_IN_USEC

//------------------------------------------------------
// Utility macros

#define BytePtr(var, offset)   (&(char)var + offset)

#ifdef __PCM__
#define interrupt_enabled(x)  !!(*make8(x,1) & make8(x,0))
#endif
#ifdef __PCH__
#define interrupt_enabled(x)  !!(*(make8(x,1) | 0xF00) & make8(x,0))
#endif

#ifdef __PCB__
#error  interrupt_enabled(x) is not supported for the PCB compiler.
#endif
#ifdef __PCD__
#error  interrupt_enabled(x) is not supported for the PCD compiler.
#endif

int8 read_ads1251(signed int32 &result)
{
   int i = 0, gie_enabled;
   output_high(PIN_B7);  // IT TURN ON
   if(interrupt_enabled(GLOBAL))// another way it tried if((GEIH == true) || (GEIL == true))
  {
   disable_interrupts(GLOBAL);
   gie_enabled = TRUE;   
  }
else
  {
   gie_enabled = FALSE;
   output_low(PIN_B7);
  }
 
  ext_int_edge(H_TO_L); 
  clear_interrupt(INT_EXT);

  output_high(PIN_B6); // ALL IS WORKING TILL NOW
for(i = 0; i < ADS_TIMEOUT_IN_USEC; i++)   // 8 ins. cycles/loop
   {
     //if(INTOF == TRUE) another way I tried
    if(interrupt_active(INT_EXT))// <--- here the pic is broken in any way
    {
       break;
       INT0F = FALSE;
       output_high(PIN_B5);
    }
    delay_us(1);
   } // end of for Loop
   
   if(i == ADS_TIMEOUT_IN_USEC)return(FALSE);
   
   delay_us(2);
// -------------- forward never is executed------------------------   
   output_high(PIN_B4);
   
   for(i = 0; i < 6; i++)
   {   
    output_low(ADS1251_SCLK_PIN);
    shift_left(&result, 3, input(ADS1251_DOUT_DRDY_PIN));
    output_high(ADS1251_SCLK_PIN);

    output_low(ADS1251_SCLK_PIN);
    shift_left(&result, 3, input(ADS1251_DOUT_DRDY_PIN));
    output_high(ADS1251_SCLK_PIN);

    output_low(ADS1251_SCLK_PIN);
    shift_left(&result, 3, input(ADS1251_DOUT_DRDY_PIN));
    output_high(ADS1251_SCLK_PIN);

    output_low(ADS1251_SCLK_PIN);
    shift_left(&result, 3, input(ADS1251_DOUT_DRDY_PIN));
    output_high(ADS1251_SCLK_PIN);
 }// end of for loop

output_low(ADS1251_SCLK_PIN);

if(gie_enabled)
  {
   enable_interrupts(GLOBAL);
  }
 
if(bit_test(result, 23))
   *BytePtr(result, 3) = 0xFF;
else
   *BytePtr(result, 3) = 0x00;

return(TRUE);
}//end of ADS1254_READ

void main(void)
{
 int8 status;
 signed int32 adc_value;
 
 INTCON2 = 0X00; // making sure rb3 and RBport  priority interrupts are low
 INTCON3 = 0X00; // making sure rb3, rb2 and rb1 interrupts are disabled and its priority are low
 IPEN    = 0X00; // making sure low priority
 
 output_low(PIN_B3);
 output_low(PIN_B2);
  status = read_ads1251(adc_value);
// -------- never are executed-------------------------
   if(status == TRUE)
  {
    output_high(PIN_B3);
    output_low(PIN_B2);
  }
   else
  {
  output_high(PIN_B2);
  output_low(PIN_B3);
  }
   delay_ms(1000);
}

As you can see, to verify where is the problem, I used LED in PIN_B7, PIN_B6, PIN_B5, PIN_B4, PIN_B3 and PIN_B2.
In the part of the for loop where the PIC have to verify if the interruption PIN_B0 flag is ocurred, the program never pass of this loop, because the leds PIN_B5 to PIN_B2 never are turned on.
In the oscilloscope the PIN_B1 it's in LOW, so the ADS1254 is waiting the SCLK signal, only I can see is the falling edge from the ADC.
I'm going to try that, you told me Ttelmah.

Thanks so much for your reply best regards have a good day Smile
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Oct 06, 2013 9:11 pm     Reply with quote

Quote:
#define ADS_CLK_FREQ 320000

Do you really have only a 320 KHz clock frequency for the ads chip ?

Quote:
#define ADS_CONVERSION_CYCLE_PERIOD_IN_USEC ((384 * 100000) / ADS_CLK_FREQ)

Why did you change this to 100000 ? It was 1000000 in my example
program. The purpose of that equation is to calculate the conversion
cycle period in microseconds. By changing the constant to only 100000
you have messed it up. With the correct constant of 1000000, the
result will be 1200 usec timeout period with your 320 KHz clock.
You have caused it to be 120 usec timeout, which is totally wrong.

Quote:
int i = 0, gie_enabled;

Also, for the correct timeout value of 1200, 'i' must be declared as an int16.
JosedeJesusC



Joined: 29 Mar 2013
Posts: 24

View user's profile Send private message

PostPosted: Sun Oct 06, 2013 10:56 pm     Reply with quote

OMG!!!! PCM programmer Embarassed I'm so sorry. I'm wrong.

Integer of 8 bits just can represent till 255 :S.

I can achieve 8 MHz but It's just a trial, It seems the PIC is working now adding that instruction setup_adc(NO_ANALOGS); because it's lighting up the PIN_B4 and its after the loop where was the problem.

I'm going to check this out with the Oscilloscope I hope it's Ok.

Thanks so much for your time PCM Programer and Ttelmah. Best wishes Smile
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page Previous  1, 2
Page 2 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group