2015-06-03 4 views
2

Я использую ATmega16 в моем проекте. Я хочу получить значение = 1023, когда я даю 5V в качестве входных данных, и 0 при вводе = 0. Функция readADC считывает конкретный канал АЦП микроконтроллера. Частота моих часов составляет 4 МГц. Но при чтении ввода я получаю 255 как максимальное значение вместо 1023. Кто-то, кто знает об avr-программировании, может помочь !!!255 char. вместо 1023 Невозможно установить опорное напряжение

Мой код:

#include <avr/delay.h> 
#include <avr/io.h> 
#include <avr/interrupt.h> 

unsigned char ReadADC(unsigned char ch) 
{ 
    ch = ch&0b00000111; 
    ADMUX&=0xF8; 
    ADMUX |= ch; 
    ADCSRA |= (1<<ADSC); 
    while(ADCSRA & (1<<ADSC); //wait for conversion to complete 
    return(ADC); 
} 

int main(void) 
{ 
    SegDataDDR = 0xFF; 
    SegCntrlDDR = 0xF3; 
    SegCntrlPort = 0xF3; 
    SegDataPort = 0x00; 

ADMUX = (1<<REFS0) | (0<<REFS1); 
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); // ADEN set to turn ADC on 
// clock frequency divided by 32 for operable 125KHz frequency 

while(1) 
{ 
    ADCSRA |= (1<<ADSC); // start conversion 
    unsigned char value = ReadADC(0); // Reads the value of the ADC 
} 
+1

1023. слишком велик, чтобы поместиться в 'без знака char'. То, что вы получаете, это младший байт 1023, который равен 255. – Michael

+0

Подсказка: попробуйте 'unsigned short' или' unsigned int' вместо 'unsigned char' – Levi

+0

Я пробовал float, int и другие, но это doesn 't work Пожалуйста, предложите подходящий тип данных, если это единственная проблема !!! – Yash

ответ

3

В коде, линия

unsigned char value = ReadADC(0); 

ограничивает вас только 8 бит. Вам нужно изменить тип value на нечто большее, например unsigned short, которое может хранить данные на 16 бит. Если вы сделаете это изменение, необходимо также изменить определение ReadADC к

unsigned short ReadADC(unsigned char ch) 
+1

Ему тоже придется менять 'unsigned char ReadADC (unsigned char ch)'. – JimmyB

+0

@HannoBinder: Хороший момент – Levi

+0

Существует еще одна проблема, я не могу установить максимальное опорное напряжение. Я применил 5V в AVcc и capicator для заземления в Aref. Но выход 5 В также дает 1023 (максимальное значение), а выход 3 В также делает то же самое. – Yash

0

Заменить неподписанные символ на unit16_t

+0

Итак, проблема решена? Помог ли вам ответ Леви? – JimmyB