Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
05.07.2011, 23:44
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Очистка буфера LCD в программе ATMEGA
Переписал я под свои нужды программу под ATMEGA8 в CodeVisionAVR для измерения напряжения и тока. Вывод на LCD 16x2. При измерении напряжения до 9,9в отображаются 2 цифры (9.9V), после 3 цифры (например 26.6V). Но, если обратно уменьшать напряжение, то последний разряд не гасится и в нем остается старая информация. Например, вместо 9.9V показывает 9.96V (6 в остатке), а по идее должно быть те же 9.9V. Пробовал lcd_clear(); но тогда показания начинают мигать, хотя индикация восстанавливается.
Надеюсь, что объяснил нормально?
Я так понял, что остаток сохраняется в буфере, а как его очистить я не знаю. Программирование только осваиваю, так что просьба не пинать, а если можно, объяснить, что можно сделать?
Исходный текст программы:
Последний раз редактировалось Dimitrij; 05.07.2011 в 23:46.
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
05.07.2011, 23:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
|
Re: Очистка буфера LCD в программе ATMEGA
Пробелы поставьте.
Вы ж в знакоместа вводите.
Код:
|
//напряжение
ftoa(Volt, 1, LCD_volt); // преобразование и вывод на LCD напряжения
lcd_gotoxy(0,0);
lcd_puts(LCD_volt);
lcd_putsf(" ");
lcd_gotoxy(4,0);
lcd_putsf("V");
lcd_gotoxy(5,0);
lcd_putsf(","); |
|
|
|
Эти 2 пользователя(ей) сказали Спасибо lsa за это сообщение:
|
|
|
06.07.2011, 12:01
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Очистка буфера LCD в программе ATMEGA
lsa, Большое спасибо! Все оказалось очень просто, а я ломал голову. В программе, что брал для образца, та же ошибка, да и в интернет что-то не нашел.
Уж попутно вопрос. Как рассчитать выводимую на LCD информацию о напряжении (или токе), чтобы она соответствовала входному. С LED как будто разобрался, в этой программе тоже не ясна методика расчета. А есть еще одна:
Код:
|
char byDisplay[6]; // буфер данных, для вывода на экран
char Counter;
char Count = 5;
CARDINAL U;
CARDINAL I_ust;
CARDINAL I_izm;
void PrepareData(CARDINAL Data)
{
BYTE i;
WORD R;
//BYTE add_10;
if (Data › 30000)
{
Data = 0;
}
R = Data;
// Первые 7 цифр - обороты двигателя
for(i=0; i‹6; i++)
{
byDisplay[5-i] = Data % 10 + 48;
Data /= 10;
}
}
void PrintBuf(void)
{
int i;
for(i=0; i‹6; i++)
{
lcd_putchar(byDisplay[i]);
}
}
#define ADC_VREF_TYPE 0xC0
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
WORD tmp;
// Reinitialize Timer 1 value
TCNT1H=0xFF;
TCNT1L=0x3C;
// Place your code here
if (Counter++ ›= Count)
{
Counter = 0;
lcd_gotoxy(0,0);
//напряжение
PrepareData(U / Count); // read_adc(2)/10.24*256
byDisplay[0] = byDisplay[2];
byDisplay[1] = byDisplay[3];
byDisplay[2] = '.';
byDisplay[3] = byDisplay[4];
byDisplay[4] = byDisplay[5];
byDisplay[5] = 'V';
PrintBuf();
lcd_putsf(", ");
//ток измеренный
PrepareData((I_izm / Count) - 9); // read_adc(2)/10.24*256
byDisplay[0] = byDisplay[2];
byDisplay[1] = byDisplay[3];
byDisplay[2] = '.';
byDisplay[3] = byDisplay[4];
byDisplay[4] = byDisplay[5];
byDisplay[5] = 'A';
PrintBuf();
lcd_gotoxy(0,1);
//ток установленный
lcd_putsf("Set I= ");
PrepareData((I_ust / Count) - 9); // read_adc(2)/10.24*256
byDisplay[0] = byDisplay[2];
byDisplay[1] = byDisplay[3];
byDisplay[2] = '.';
byDisplay[3] = byDisplay[4];
byDisplay[4] = byDisplay[5];
byDisplay[5] = 'A';
PrintBuf();
if (!PIND.3)
{
lcd_putchar(0xDA);
}
else
{
lcd_putchar(' ');
}
U = 0;
I_izm = 0;
I_ust = 0;
}
else
{
U += read_adc(0) * 2;
I_izm += read_adc(2);
I_ust += read_adc(1);
}
} |
вообще не понятно, где и что менять. Как получилось read_adc(2)/10.24*256 ?
В интернет что-то я информации на эту тему не нашел.
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
07.11.2011, 00:39
|
|
Частый гость
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Очистка буфера LCD в программе ATMEGA
Сообщение от Dimitrij
|
lsa, Большое спасибо! Все оказалось очень просто, а я ломал голову. В программе, что брал для образца, та же ошибка, да и в интернет что-то не нашел.
|
каким образом Вы нашли решение очистки?
|
|
|
Сказали "Спасибо" suhar666
|
|
|
08.11.2011, 02:34
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Очистка буфера LCD в программе ATMEGA
Сообщение от suhar666
|
каким образом Вы нашли решение очистки?
|
Как подсказал lsa, поставил пробелы в знакоместо для выводимой величины. У меня 4 знака, если выводится 3 последних знака, то первый пустой:
PHP код:
|
//напряжение
ftoa(Volt, 1, LCD_volt); // преобразование и вывод на LCD напряжения
lcd_gotoxy(0,0);
lcd_puts(LCD_volt);
lcd_putsf(" ");
|
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
08.11.2011, 09:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Очистка буфера LCD в программе ATMEGA
Сообщение от Dimitrij
|
вообще не понятно, где и что менять. Как получилось read_adc(2)/10.24*256 ?
В интернет что-то я информации на эту тему не нашел.
|
В любом даташите на МК с АЦП. Мега8 не исключение.
Формула в наличии. Дальше напрягаемся и вспоминаем школу. Арифметика, примерно 6-й класс. Институты отдыхают...
|
|
|
|
08.11.2011, 12:25
|
|
Временная регистрация
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
|
Re: Очистка буфера LCD в программе ATMEGA
Сообщение от ut1wpr
|
Формула в наличии.
|
Это и так понятно, вопрос ставился, как она реализована в этой программе?
|
|
|
Сказали "Спасибо" Dimitrij
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:29.
|
|