Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.06.2011, 15:17
|
#11
|
Частый гость
Регистрация: 21.03.2008
Сообщений: 28
Сказал спасибо: 77
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изменить исходный код программы для ATMEGA8
Менять 255 на 511 в коде i_read и u_read нельзя, т.к. вы выйдите за пределы разрядности temp, которая до передачи в вызывающую программу сдвигается вправо на 10 разрядов и обрезается до байта. Результат будет тот, что вы уже видели - до 2,5 вольт все нормально, а потом все начинается с нуля. Если хотите удвоить показания, советую уменьшить в два раза ADC_U_DIV и ADC_I_DIV: в шапке программы задать их значения равными 511 (#define ADC_U_DIV 511 #define ADC_U_DIV 511). Возможно и ADCSETDIV тоже д.б. равна 511. Правда, не вник в ее роль, но возможно, что она связана с калибровкой.
|
|
|
|
18.06.2011, 18:14
|
#12
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от sansan_51
|
(#define ADC_U_DIV 511 #define ADC_U_DIV 511).
|
Это я то же менял, результат одинаков, до 2,5 вольт все нормально, а потом все начинается с нуля. Как бы я не менял коэффициенты, больше 25.5 не получал.
Уже почти разобрался в коде, но не понятна эта часть
Код:
|
// Reinitialize Timer 0 value
TCNT0=0xFA;
PORTB &= 0xF8;
PORTD = font[d[dig-1]];
if (settimei›1500) if (dig==4) PORTD|=128;
if (dig==2) PORTD|=128;
if (count›350){
//if (dig==2) PORTD|=128;
if (dig==4) PORTD|=128;
}
PORTB |=dig;
dig++;
if (dig==7) dig=1;
if (++count›700) count=0;
if (settimei‹1500) settimei++;
else settimei=65535;
} |
Не может быть причина в этом?
|
|
|
|
18.06.2011, 19:25
|
#13
|
Почётный гражданин KAZUS.RU
Регистрация: 13.02.2008
Адрес: Днепр. Украина
Сообщений: 3,294
Сказал спасибо: 442
Сказали Спасибо 1,048 раз(а) в 706 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
В старшем разряде порта Д формируется импульсная последовательность, для чего - вопрос к автору конструкции. К коэффициентам преобразования АЦП тут ничего не относиться. Этот участок отвечает только за отображение цифр на 7-сегментном индикаторе.
__________________
misterdi<@>i.ua
|
|
|
|
18.06.2011, 21:46
|
#14
|
Частый гость
Регистрация: 02.02.2010
Адрес: Одесская обл.
Сообщений: 32
Сказал спасибо: 0
Сказали Спасибо 24 раз(а) в 12 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от MisterDi
|
В старшем разряде порта Д формируется импульсная последовательность, для чего - вопрос к автору конструкции. .
|
Это же очевидно - автор зажигает децимальную точку. Я, кстати, тоже так делаю. А к вычислениям это действие действительно не имеет отношения
|
|
|
|
18.06.2011, 22:03
|
#15
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Ivan Panov
|
Это же очевидно - автор зажигает децимальную точку. Я, кстати, тоже так делаю.
|
С этим ясно, в подробности не вникаю, и так голова кругом.
Тут мне подсказали, что беззнаковый тип char это от 0 до 255 и никак большее число в восьми битах не сохранить. Но регистры ATMEGA8 8-битовые, значит с большими числами я не смогу работать?
А как же тогда обработать 5 вольт и вывести на индикатор число 50.0?
|
|
|
|
18.06.2011, 22:38
|
#16
|
Частый гость
Регистрация: 02.02.2010
Адрес: Одесская обл.
Сообщений: 32
Сказал спасибо: 0
Сказали Спасибо 24 раз(а) в 12 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Вам совершенно правильно подсказали. Изменения надо ввести в определения функций: void iindf(unsigned char il) переделать на void iindf(unsigned int il), void uindf(unsigned char ul) на void uindf(unsigned int ul). Далее изменить возвращаемый параметр на unsigned int в следующих функциях: unsigned char u_read(void), unsigned char i_read(void), unsigned char iset_read(void). В последних трёх функциях не забудьте убрать явное приведение возвращаемого типа к unsigned char. Вместе с этим, как Вам ранее и советовали, вдвое уменьшить значения #define ADC_U_DIV и #define ADC_I_DIV. Вышеописанные изменения я добавил в приложенный файл. Отпишитесь, если компилятор выдаст ошибку, я этот файл не компилировал.
|
|
|
Сказали "Спасибо" Ivan Panov
|
|
|
18.06.2011, 22:52
|
#17
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,439
Сказал спасибо: 97
Сказали Спасибо 314 раз(а) в 230 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Изучите типы данных Си.
char (8 бит): [-128..127]
unsigned char (8 бит): [0..255]
int (16 бит): [-32768..32767]
unsigned int (16 бит): [0..65535]
long int (32 бита): [-2147483648..2147483647]
unsigned long int (32 бита): [0..4294967295]
PHP код:
|
unsigned char u_read(void)
{
tmp=read_adc(ADCMUX_U); // считывается АЦП канала 0: [0..1023]
tmp *=255; // умножается на 255: [0..260865]
tmp /=ADC_U_DIV; // делитсня на 1023: [0..255]
return (unsigned char) tmp;
}
|
То есть, входному напряжению от 0..5 вольт соответствуют числа от 0 до 255. Результат функции - как раз это число.
Если надо, чтобы напряжению от 0 до 5 вольт соответствовали числа от 0 до 50, то надо ещё менять и функцию обработки результата.
PHP код:
|
#define ADC_U_DIV 511
#define ADC_I_DIV 511
unsigned char j,imax;
insigned int iind,uind;
unsigned int u_read(void)
{
tmp=read_adc(ADCMUX_U);
tmp *=255;
tmp /=ADC_U_DIV;
return (unsigned int) tmp;
}
unsigned int i_read(void)
{
tmp=read_adc(ADCMUX_I);
tmp *=255;
tmp /=ADC_I_DIV;
return (unsigned int) tmp;
}
void uindf(unsigned int ul)
{
d[0]= ul/100;
ul %=100;
d[1]= ul/10;
ul %=10;
d[2]= ul ;
}
void iindf(unsigned int il)
{
d[3]= il/100;
il %=100;
d[4]= il/10;
il %=10;
d[5]=il;
}
|
Последний раз редактировалось Godzilla82; 18.06.2011 в 22:59.
|
|
|
Сказали "Спасибо" Godzilla82
|
|
|
18.06.2011, 22:54
|
#18
|
Почётный гражданин KAZUS.RU
Регистрация: 29.10.2006
Сообщений: 1,439
Сказал спасибо: 97
Сказали Спасибо 314 раз(а) в 230 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
пока писал - опередили
|
|
|
|
19.06.2011, 13:13
|
#19
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Сообщение от Ivan Panov
|
Отпишитесь, если компилятор выдаст ошибку, я этот файл не компилировал.
|
Все нормально, только Godzilla82 немного подправил, в определениях переменных тоже поставил int.
Всем большое спасибо! Пока переписывал программу, немного изучил программирование, во всяком случае понял азы.
|
|
|
|
19.06.2011, 14:09
|
#20
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Изменить исходный код программы для ATMEGA8
Думал, что все закончилось, ан нет.
В Proteus все нормально, а в реалях очень прыгает младший разряд +-1.
Пробовал уменьшать тактовую частоту, реже, но все равно скасет.
Что можно сделать для стабилизации показаний?
Кстати, он прыгал и в начальном коде программы, который был приложен к схеме.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:23.
|
|