این کد رو از نمونه کد های آقای کی نژاد برداشتم(کد اصلی کار میکرد) یکم تغیرش دادم که بتونم 0-4096 خروی خروجی داشته باشم ولی یه عدد تو رنج 65000 روی LCD نشون میده
البته ADCA_CTRLB رو برابر صفر گذاشتم.
#define F_CPU 2000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdbool.h>
#include "xmega_lcd_v1.h"
#include <stdio.h>
unsigned char SP_ReadCalibrationByte(unsigned char);
#define ADCBCAL0_offset 0x24
#define ADCBCAL1_offset 0x25
volatile int adc_result,offset;
volatile bool new_adc=false;
int main(void){
// long temp;
unsigned char buffer[20];
ADCA.CALL=SP_ReadCalibrationByte(PROD_SIGNATURES_START + ADCBCAL0_offset);
ADCA.CALH=SP_ReadCalibrationByte(PROD_SIGNATURES_START + ADCBCAL1_offset);
ADCA_CTRLB= ADC_CONMODE_bm | ADC_RESOLUTION_12BIT_gc;
ADCA_REFCTRL=ADC_REFSEL_AREFA_gc;
ADCA_PRESCALER=ADC_PRESCALER_DIV16_gc;
ADCA_CH0_MUXCTRL=ADC_CH_MUXPOS_PIN2_gc|ADC_CH_MUXNEG_PIN2_gc;
ADCA_CH0_CTRL=ADC_CH_GAIN_1X_gc|ADC_CH_INPUTMODE_DIFF_gc;
ADCA_CTRLA|=ADC_ENABLE_bm;
_delay_us(300);
ADCA_CH0_CTRL|=ADC_CH_START_bm;
while(!(ADCA_CH0_INTFLAGS&ADC_CH_CHIF_bm));
ADCA_CH0_INTFLAGS=ADC_CH_CHIF_bm;
offset=ADCA_CH0_RES;
ADCA_CTRLA&=~ADC_ENABLE_bm;
ADCA_CH0_CTRL=ADC_CH_GAIN_1X_gc|ADC_CH_INPUTMODE_SINGLEENDED_gc;
ADCA_CH0_INTCTRL=ADC_CH_INTMODE_COMPLETE_gc|ADC_CH_INTLVL_LO_gc;
PMIC_CTRL|=PMIC_LOLVLEN_bm;
sei();
ADCA_CTRLA|=ADC_ENABLE_bm;
_delay_us(300);
ADCA_CH0_CTRL|=ADC_CH_START_bm;
LCDInit();
while(1){
if(new_adc){
new_adc=false;
LCDClr();
LCDGotoXY(0,0);
sprintf(buffer, "ADC = %5u", adc_result);
LCDStringRam(buffer);
//_delay_ms(2000);
}
}
}
//--------------------------------------------------------
unsigned char SP_ReadCalibrationByte(unsigned char index)
{
unsigned char result;
///* Load the NVM Command register to read the calibration row. */
NVM_CMD = NVM_CMD_READ_CALIB_ROW_gc;
result = pgm_read_byte(index);
/* Clean up NVM Command register. */
NVM_CMD = NVM_CMD_NO_OPERATION_gc;
return result;
}
//--------------------------------------------------------
ISR(ADCA_CH0_vect)
{
static unsigned int i=2048;
static long adc_sum=0;
adc_sum += (ADCA_CH0_RES-offset);
if(!(--i))
{
i=2048;
adc_result=adc_sum/2048;
adc_sum=0;
new_adc=true;
}
ADCA_CH0_CTRL|=ADC_CH_START_bm;
}
البته ADCA_CTRLB رو برابر صفر گذاشتم.
دیدگاه