اطلاعیه

Collapse
No announcement yet.

مشکل در خواندن ADC یک پین به صورت unsigned

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در خواندن ADC یک پین به صورت unsigned

    این کد رو از نمونه کد های آقای کی نژاد برداشتم(کد اصلی کار میکرد) یکم تغیرش دادم که بتونم 0-4096 خروی خروجی داشته باشم ولی یه عدد تو رنج 65000 روی LCD نشون میده
    #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 رو برابر صفر گذاشتم.
    A-Hosseini

    #2
    پاسخ : مشکل در خواندن ADC یک پین به صورت unsigned

    عددی که میگید در واقع یه عدد منفیه. شاید adc را روی حالت علامت دار تنظیم کردید.

    دیدگاه

    لطفا صبر کنید...
    X