| ??? 03/07/08 20:24 Read: times |
#152014 - Whoops, here is the .c file with the ADC ISR..... Responding to: ???'s previous message |
/***********************************************************************
DESC: Configures ADC0 and starts conversions
If trigger = ADC_NONE then ADC0 is configured and no conversions
are started
RETURNS: Nothing
************************************************************************/
/* Below are the definitions of which A/D to select, which channel, and what trigger mode**
(
unsigned char trigger,
// ADC_TIMER, ADC_IMMEDIATE, ADC_EDGE, ADC_DUALIMMEDIATE, ADC_NONE
unsigned char mode,
// ADC_FIXEDSINGLE (select one channel in channels)
// ADC_FIXEDCONT (select one channel in channels)
// ADC_AUTOSCANSINGLE (select one to four channels in channels)
// ADC_AUTOSCANCONT (select one to four channels in channels)
// ADC_DUALCONT (select two channels in channels)
// ADC_SINGLESTEP (select one to four channels in channels)
unsigned char channels
// one or more of: ADC0_CHANNEL0, ADC0_CHANNEL1, ADC0_CHANNEL2, ADC0_CHANNEL3
)
*/
void adc_start_ADC0_conversion (unsigned char trigger, unsigned char mode, unsigned char channels)
{
ADCON0 &= 0xDC; // disable all triggers
ADMODA &= 0xF0; // clear mode bits and boundary interrupt flag
switch (mode)
{
case ADC_FIXEDSINGLE: // fixed channel, single conversion
case ADC_AUTOSCANSINGLE: // auto scan, single conversion
ADINS = channels; // select channel(s)
ADMODA |= 0x01; break; // select mode
case ADC_FIXEDCONT: // fixed channel, continuous conversion
case ADC_DUALCONT: // dual channel, continuous conversion
ADINS = channels; // select channel(s)
ADMODA |= 0x02; break; // select mode
case ADC_AUTOSCANCONT: // auto scan, continuous conversion
ADINS = channels; // select channel(s)
ADMODA |= 0x04; break; // select mode
case ADC_SINGLESTEP: // single step
ADINS = channels; break; // select channel(s)
}
switch (trigger) // select new trigger
{
case ADC_NONE: break; // no trigger
case ADC_TIMER: // timer triggered start
ADCON0 |= 0x20; break; // select trigger
case ADC_IMMEDIATE: // start immedately
ADCON0 |= 0x01; break; // select trigger
case ADC_EDGE: // edge triggered start
ADCON0 |= 0x02; break; // select trigger
case ADC_DUALIMMEDIATE: // dual start immediately
ADCON0 |= 0x03; break; // select trigger
}
}
/***********************************************************************
DESC: Stops ADC0 conversions
RETURNS: Nothing
************************************************************************/
void adc_stop_ADC0_conversion(void)
{
ADCON0 &= 0xDC; // disable all triggers
}
/***********************************************************************
DESC: ADC Interrupt Service Routine
Called when an ADC conversion has completed
Uses register bank 1
RETURNS: Nothing
CAUTION: adc_init must be called first
************************************************************************/
void adc_isr(void)
interrupt 14 using 1
{
if (ADCON0 & 0x08) // adc0 conversion complete?
{
ADCON0 &= ~0x08; // clear ADCI0 flag read results from AD0DAT0 - AD0DAT3
}
if (ADMODA & 0x08) // adc0 outside boundary range?
{
ADMODA &= ~0x08; // clear BND0 flag
}
}
|
| Topic | Author | Date |
| Problems with Code Architect and interrupts | 01/01/70 00:00 | |
| where is the ISR? | 01/01/70 00:00 | |
| Erik... | 01/01/70 00:00 | |
| you enable an interrupt for which there is no ISR | 01/01/70 00:00 | |
| I missed the ISR routine.... | 01/01/70 00:00 | |
| Whoops, here is the .c file with the ADC ISR..... | 01/01/70 00:00 | |
| Also forgot mention...simulation works fine | 01/01/70 00:00 | |
| I found part of my problem | 01/01/70 00:00 | |
| Interrupts | 01/01/70 00:00 | |
| Modified.....seems right, I2C bus going nuts | 01/01/70 00:00 | |
| Polling or Interrupts | 01/01/70 00:00 | |
| Exactly...... | 01/01/70 00:00 | |
| Opinion | 01/01/70 00:00 | |
| Gentlemen....thats what I thought I had!! | 01/01/70 00:00 | |
Port config | 01/01/70 00:00 | |
| poll .... | 01/01/70 00:00 |



