Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Register Log in

[SOLVED] ADC reading , Timer interrupt - dspic33ch128mp508

chaminda12001

Newbie level 5
Joined
May 9, 2019
Messages
9
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
135
Hi,

I am trying to read ADC channel 0 using Timer interrupt to trigger it. I am using dspic33ch128mp508 curiosity development board for anologue reading using potentiometer annologue channel 0. When I debug, I dont get any value on the Anlogue channel 0.
I am using MPLAB X IDE 5.10 for debugging. Here is my code. Any thoughts on this?


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
int main(void) {
    
    TRISE = 0x0000;
   
    adc_init();
 
      PORTEbits.RE0 = 0;
     
       T1CON =0;
        TMR1 =0x0000;
        
        T1CONbits.TCS = 0;
        T1CONbits.TCKPS =0; 
        T1CONbits.TGATE = 0;
        IFS0bits.T1IF = 0;  //Timer interrupt flag
        IFS5bits.ADCAN0IF =0;
        IEC0bits.T1IE =0;   //Interrupt enable
        IPC22bits.ADCAN0IP =1;
        IEC5bits.ADCAN0IE =1;
        PR1 =0x0002;
        ADCON1Lbits.ADON = 1;
        T1CONbits.TON = 1;  //Timer 1 T1CON enable 
             
    
      while(1);  
      
}
 
void adc_init(){
    
    TRISAbits.TRISA0=1;
    ANSELAbits.ANSELA0=1; 
    ADCON3Hbits.CLKSEL0= 1; //FOSC clock selection 
    ADCON3Hbits.CLKSEL1 =0;
    ADCON3Hbits.CLKDIV =0;
    ADCON3Lbits.CNVCHSEL0 =1; // Channel selection 1  
    ADCON1Hbits.SHRRES =1; // 12 bit resolution
    ADCON2Lbits.EIEN =0;
    ADCON1Hbits.FORM =0;  //Output format
    ADMOD0Lbits.SIGN0 =0; 
       
    ADCON3Lbits.REFSEL =0; //ADC Reference voltage selection
  
    ADCON3Hbits.SHREN =0;
    ADCON5Hbits.WARMTIME = 0x2; 
    
}
 
void __attribute__((interrupt, no_auto_psv)) _ADCAN0Interrupt(void)
{
    
i = ADCBUF0; // read conversion result
PORTEbits.RE0 = i;
_ADCAN0IF = 0; // clear interrupt flag
 
}

 

andre_teprom

Super Moderator
Staff member
Joined
Nov 7, 2006
Messages
9,153
Helped
1,137
Reputation
2,292
Reaction score
1,108
Trophy points
1,403
Location
Brazil
Activity points
53,120
It seems like you are missing the command for starting the A/D conversion, either at the main() and at the interrupt() vectors:

Code:
ADCON3Lbits.CNVRTCH = 1;
Moreover, you are not enabling individual interrupts anywhere, one would expect something like:

Code:
ADIELbits.IE0=1;
 

chaminda12001

Newbie level 5
Joined
May 9, 2019
Messages
9
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
135
Hi,

Thank you for the reply. I did setup on my main code. but it does not go to ADCAN0Interrupt vector.

Code:
ADIELbits.IE0 =1;
        
       IPC22bits.ADCAN0IP =1;
        IEC5bits.ADCAN0IE =1;
         ADCON3Lbits.CNVRTCH =1;
        ADCON3Lbits.CNVCHSEL0 =1;
Anything I missed out on here.
 

andre_teprom

Super Moderator
Staff member
Joined
Nov 7, 2006
Messages
9,153
Helped
1,137
Reputation
2,292
Reaction score
1,108
Trophy points
1,403
Location
Brazil
Activity points
53,120
I did setup on my main code. but it does not go to ADCAN0Interrupt vector
Don't seem it is likely missing something like that at the init routine?

Code:
INTCON2.GIE = 1 // enable global interrupt
Seriously speaking, take a look at other extensively available examples on the Web, or read the datasheet, as previously suggested.
 

chaminda12001

Newbie level 5
Joined
May 9, 2019
Messages
9
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
135
Hi

I checked the examples on the web. I tried those methods but still no luck :sad:
 

Aussie Susan

Advanced Member level 4
Joined
Jan 5, 2015
Messages
1,151
Helped
359
Reputation
718
Reaction score
355
Trophy points
83
Activity points
12,508
You should not need to set the GIE bit to 1 as that is its Power-on default setting.\
Look at the ADC FRM section for that MCU - it has a whole section of examples.
Suan
 

chaminda12001

Newbie level 5
Joined
May 9, 2019
Messages
9
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
135
Hi,

I am still cant read value into ADCBUF0. Could you have a look on my ADC initilisation code,adc_read and Enablecalibrate function. Anything I missed.


Code C# - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
void adc_init(){
    
    
    //Configuration of the I/O pins to be used as analog inputs
    TRISA = 0xFFFF;   
    ANSELA =0xFFFF;  
    
    ADCON1Lbits.ADSIDL =0;   //ADC module operate in idle mode
    ADCON3Hbits.CLKSEL0= 1; //FOSC clock selection 
    ADCON3Hbits.CLKSEL1 =0; 
    ADCON3Hbits.CLKDIV =0;  //no clock divider
    ADCON1Hbits.FORM =0;  //Integer Output format
    ADMOD0Lbits.SIGN0 =0; //unsigned output format
    ADCON3Lbits.REFSEL =0; //ADC Reference voltage selection
    ADSTATL =0;            // ADC Data ready status register
    ADCON3Hbits.SHREN =1;    //Shared ADC core is enabled
    ADCON2Lbits.EIEN = 0;    //Early interrupt  is disabled
   ADCON1Lbits.ADON =1;  // Turn on ADC 
   ADCON5Hbits.WARMTIME =15;
   
   Enableandcalibrate();
    ADIEL=0xFFFF;              //   ADC interrupt enable register low
    IEC5=0xF100;          // enable interrupts for AN0 -AN4
    IEC6=0x07FF;           //enable interrupts for AN4 -AN15
    IFS5 =0x0000;         //clear interrupts flags
    IFS6 =0x0000;         //clear interrupts flags
    
} 
 
void Enableandcalibrate(){
    
  
    // Turn on analog power for shared core
ADCON5Lbits.SHRPWR = 1;
 
// Wait when the shared core is ready for operation
while(ADCON5Lbits.SHRRDY == 0);
 
// Turn on digital power to enable triggers to the shared core
ADCON3Hbits.SHREN = 1;        
    
}
 
unsigned int read_adc(int channel){
    
    int i =0; 
    ptr = &ADCBUF0;         
    
    ADCON3Lbits.CNVCHSEL = channel | 0x0100; // Channel selection 
    ADCON3Lbits.CNVRTCH =1;  //Starts  sampling
        
    while (ADSTATL & (1<<channel)){
                 
            conversionresults[i++] = *ptr++ ;
            
        
        }
    }


Please help on this. Thank you very much.
 
Last edited by a moderator:

Toggle Sidebar

Part and Inventory Search


Welcome to EDABoard.com

Sponsor

Sponsor

Design Fast


×
Top