??? 02/02/09 21:39 Modified: 02/02/09 21:40 Read: times |
#161964 - ADUC845 Unable to stop ADC Interrupts |
I'm having difficulty stopping the interrupts from occurring. I've followed the data sheet as best I can. I've disabled EA (global), EADC (all ADC Interrupts), ADC0EN (Primary ADC device) which are the only bits associated with ADC interrupts, but my code continues to loop forever. I've tried doing these bit changes in both main and the ISR to no avail. What am I missing?
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <ADuC845.h> //To use this with an ADuC847 or ADuC848, simply change the //header file to <ADuC847.h> or <ADuC848> #define MAX 20 sbit LED = 0x0B4; unsigned short int adcSamples[MAX]; int indexSample = 0; volatile int flag = 0; void delay(int count); void ADC_Interrupt () interrupt 6 { unsigned short int adcH = ADC0H; if(indexSample < MAX) { adcSamples[indexSample++] = adcH; RDY0 = 0; //printf("indexSample: %d n", indexSample); //printf("Dec Value: %d n", adcH); LED ^= 1; //delay(1); } else { //printf("Exceeded Index Samplen"); flag = 1; //Cause main loop failure RDY0 = 1; //Ensure primary ADC cannot be triggered ADCMODE &= 0x00; //Disable primary ADC device EADC = 0; //Disable ADC Interrupt LED ^= 1; } return; } void main (void) { int i = 0; int sum = 0; float average = 0; //Configure UART T3CON = 0x83; //9600 Baud rate T3FD = 0x12; SCON = 0x52; //CONFIGURE ADC AND START CONVERTING.... SF = 0x45; ADC0CON1 = 0x27; //Full Buffer, Unipolar, 0 - 650 mV range. ADC0CON2 = 0x01; //Refin+/-, Ain2 EADC = 1; //Enable ADC Interrupt EA = 1; //Enable Global Interrupts ADCMODE = 0x03; //Continuous conversion on primary ADC device ADCMODE |= 0x20; //Primary ADC Enable delay(5); while(flag == 0); //WAIT FOR INTERRUPTS.... printf("Flag after interrupt loop %d n", flag); //printf("Escaped Interrupt Loopn"); for(i = 0; i < MAX; ++i) { sum += adcSamples[i]; printf("adc Sample %d: %dn", i, adcSamples[i]); } average = ceil(sum/20); printf("Average: %.2fn", average); delay(5); RDY0 = 1; //Ensure primary ADC cannot be triggered ADCMODE^5 = 0; //Disable primary ADC device EADC = 0; //Disable ADC Interrupt //PCON = 0x02; //Power Down to stop interrupt return; } void delay(int count) { int i; int j; int max = 32766; for(i = 0; i < count; ++i) { for(j = 0; j < max; ++j); } } |
Topic | Author | Date |
ADUC845 Unable to stop ADC Interrupts | 01/01/70 00:00 | |
Your problem has _nothing_ to do with the ADC. | 01/01/70 00:00 | |
Excellent Advice![]() | 01/01/70 00:00 | |
More advice. | 01/01/70 00:00 |