AnsweredAssumed Answered

MC9S08DZ60 ADC interrupt won't work properly

Question asked by Johannes Philippi on Jul 16, 2007
Latest reply on Jul 16, 2007 by Johannes Philippi
Hello!
 
I'm back again with another problem debugging my MC9S08DZ60.
After I managed to get the timer-interrupt working properly, I try to make use of the ADC-interrupt. what I want to do is making an ADC-conversion on channel12, and turning on a LED in the ADC-ISR. This ADC-ISR is configured to run when the conversion is complete ADIEN-flag.
 
When I debug the code in the target-HW, i.e. on the microcontroller-board, everything works as I want to. The ISR starts after the line
 
ADCSC1_ADCH = 12; 
 
the LED turns on (LEDs are active low-type) and the program continues to execute with the line "aux = 5;". So far so good. When the microcontroller is in normal run mode, the LED doas not turn on, which means the ISR is even not executed. Why? It should start at some time after the conversion start - like in BDM-mode.
 
Does somebody have some hints/tips why it does not work in normal run mode?
 
Thanks,
Johannes
 
PS: here's the code:
Code:
#include  /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations *//*----------------------------------------------------------definitions ------------------------------------------------ -----------------------------------------------------------*/typedef unsigned char   UINT8;typedef signed char     SINT8;typedef unsigned int    UINT16;typedef int             SINT16;typedef unsigned long int UINT32;typedef long int        SINT32;#define TRESHOLD12 512   //ca. 2,5V#define TRESHOLD13 256   //ca. 1,25V/*----------------------------------------------------------Interrupt Vector Numbers definitions---------------------------------------------------------------------------------- */#define ISR_VEC_TPM1OVF 11#define ISR_VEC_ADC 23/*----------------------------------------------------------define LED's --------------------------------------------------------------------------------------------------------- */#define LED2 PTBD_PTBD3#define LED1 PTCD_PTCD5/*----------------------------------------------------------globals -------------------------------------------------------------------------------------------------------------- */UINT16 ADC_RESULT;/*----------------------------------------------------------interrupts ------------------------------------------------- -----------------------------------------------------------*/interrupt 23  void intADC(void)  //ISR_VEC_TPM1OVF{    ADC_RESULT = ADCR;     LED1 = 0;           // LED1 on    }void init_adc(void) {  ADCCFG_ADLPC  = 0;    // high speed, no low power consumption  ADCCFG_ADIV   = 1;    // clock/2  ADCCFG_ADLSMP = 1;    // long sample time  ADCCFG_MODE   = 0x02; // 10bit-mode  ADCCFG_ADICLK = 0;    // i/o bus clock    ADCSC2_ADTRG  = 0;    // software trigger  ADCSC2_ACFE   = 0;    // disable compare function  ADCSC2_ACFGT  = 0;    // compare function greater than disabled    ADCSC1_AIEN   = 1;    // enable ADC Interrupt  //ADCSC1_AIEN = 0;    // disable ADC Interrupt  ADCSC1_ADCH   = 0x1f; // disable ADC  ADCSC1_ADCO   = 0;    // enable single conversion (continuous conversions disabled)   LED2 = 1;   LED2 = 0;      APCTL1        = 0x00;   APCTL2_ADPC12 = 1;    // disable I/O-control on AD-ports 12 and 13   APCTL2_ADPC13 = 1;    // all other ports remain GPIOs.}/* main -------------------------------------------------- */void main(void) {  UINT16 ADC12;  UINT8 aux;      PTBDD_PTBDD3 = 1;      // configure Ports with green led as outputs  PTCDD_PTCDD5 = 1;    LED1 = 1;              // turn off LED1  LED2 = 0;     init_adc();    EnableInterrupts; /* enable interrupts */  /* include your code here */    for(;;)   {    //start conversion on channel 12 --------------------------    ADCSC1_ADCH = 12;              //dummy operations    aux=5;            // interrupt occurs here when debugging in realt time with the P&E Micro debuger    aux=6+aux;           ADC12=ADC_RESULT;    //set LED according to ADC-treshold    if(ADC12>TRESHOLD12)       LED2 = 0;    else      LED2 = 1;      __RESET_WATCHDOG(); /* feeds the dog */  } /* loop forever */    /* please make sure that you never leave main */}

 
 
 
 
 


Message Edited by ohanica on 2007-07-16 08:26 AM

Message Edited by ohanica on 2007-07-16 08:26 AM

Outcomes