ISR AD C выборка ATMEGA2560 всегда показывает 0 - PullRequest
1 голос
/ 04 мая 2020

моя выборка всегда застряла на 0. Я понятия не имею, почему ?! Я попытался удалить ISR и поместить код через некоторое время l oop, но все тот же. В чем проблема, это то, что я не понимаю. Я хочу попробовать TMP36 на ATMEGA2560. Если необходимы дальнейшие разъяснения, просто спросите меня. Мой код:

ISR(ADC_vect)
{
        sample = ADCH;
        display(sample,digit);// displays on seven segment
        digit++;
       if(digit>=4) digit=0;
    }


  void init_analog()
{
    sei();
    DDRK &= ~(1<<PK6);
    ADMUX |= (1<<REFS0) | (1<<MUX1) | (1<<MUX2);
    ADCSRB |= (1<<MUX5);
    ADCSRB |= (1<<ADEN) | (1<<ADATE) |(1<<ADIE) | (1<<ADPS0) | (1<<ADPS1)  | (1<<ADPS2);



}

    void convert()
{
    ADCSRA|=(1<<ADSC);    //start conversion
}




void display(uint16_t number, int digit)
{    int code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};// array of representations
    int thousands = number/1000;// stores thousands
    int hundreds= (number%1000)/100;// stores hundreds
    int tens = (number%100) /10;// stores tens
    int hey = (number%10);// stores ones

    if(digit==0)// if fragment number = 0 it shows the rightmost digit.
    {
        PORTF = ~0x08;
        spi_data(code[hey]);
    }
    else if(digit==1)// next diggit
    {
        PORTF = ~0x04; // changes the fragment to be shown
        spi_data(code[tens]); // sends the value to the spi
    }
    else if(digit==2)// next digit
    {
        PORTF = ~0x02;
        spi_data(code[hundreds]);
    }
    else if(digit==3)// leftmost ddigit
    {
        PORTF = ~0x01;
        spi_data(code[thousands]);
    } //|0x80
}

void spi_data(uint8_t n) // passes the number to the SPI.
{

    SPDR = n;
    while( !(SPSR & (1<<SPIF)) );
    L_ON;
    L_OFF;
}

1 Ответ

0 голосов
/ 12 мая 2020

Прежде всего, переменная sample нигде не объявлена ​​в вашем коде.

Убедитесь, что она объявлена, и она volatile.

Нет main в вашем примере кода либо.

TMP36 выводит 750 мВ @ 25 ° C. У вас есть биты REFS1:0 в ADMUX, установленные на 01, поэтому AV CC (т.е. питание 5 В) используется в качестве эталона.

ATmega2560 имеет 10-битное AD C, что означает старший байт (ADCH) может содержать только значения 0, 1, 2 или 3, когда бит ADLAR в ADMUX не установлен.

Для напряжений в диапазоне 0 ... 1250 мВ ADCH значение всегда будет равно нулю.

Чтобы получить ненулевое значение:

  • либо прочитайте оба ADCH: ADCL (простым чтением ADC в C). Вы не можете читать только ADCL, поскольку он замораживает регистр AD C до тех пор, пока не будет прочитано ADCH.
  • или установленный бит ADLAR в ADMUX, который приводит к сдвигу результата влево на 6 бит, тогда вы можете использовать ADCH один.
...