Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 05.07.2011, 23:44  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Очистка буфера LCD в программе ATMEGA

Переписал я под свои нужды программу под ATMEGA8 в CodeVisionAVR для измерения напряжения и тока. Вывод на LCD 16x2. При измерении напряжения до 9,9в отображаются 2 цифры (9.9V), после 3 цифры (например 26.6V). Но, если обратно уменьшать напряжение, то последний разряд не гасится и в нем остается старая информация. Например, вместо 9.9V показывает 9.96V (6 в остатке), а по идее должно быть те же 9.9V. Пробовал lcd_clear(); но тогда показания начинают мигать, хотя индикация восстанавливается.
Надеюсь, что объяснил нормально?
Я так понял, что остаток сохраняется в буфере, а как его очистить я не знаю. Программирование только осваиваю, так что просьба не пинать, а если можно, объяснить, что можно сделать?
Исходный текст программы:
Вложения:
Тип файла: rar avr.rar (1.9 Кб, 74 просмотров)
Реклама:

Последний раз редактировалось Dimitrij; 05.07.2011 в 23:46.
Dimitrij вне форума  
Сказали "Спасибо" Dimitrij
warel (28.06.2019)
Непрочитано 05.07.2011, 23:52  
lsa
Почётный гражданин KAZUS.RU
 
Аватар для lsa
 
Регистрация: 22.06.2004
Адрес: Харьков
Сообщений: 1,488
Сказал спасибо: 3,207
Сказали Спасибо 3,010 раз(а) в 686 сообщении(ях)
lsa на пути к лучшему
По умолчанию 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(",");
lsa вне форума  
Эти 2 пользователя(ей) сказали Спасибо lsa за это сообщение:
Dimitrij (06.07.2011), warel (28.06.2019)
Непрочитано 06.07.2011, 12:01  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" Dimitrij
warel (28.06.2019)
Непрочитано 07.11.2011, 00:39  
suhar666
Частый гость
 
Регистрация: 04.11.2011
Сообщений: 35
Сказал спасибо: 3
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
suhar666 на пути к лучшему
По умолчанию Re: Очистка буфера LCD в программе ATMEGA

Сообщение от Dimitrij Посмотреть сообщение
lsa, Большое спасибо! Все оказалось очень просто, а я ломал голову. В программе, что брал для образца, та же ошибка, да и в интернет что-то не нашел.
каким образом Вы нашли решение очистки?
suhar666 вне форума  
Сказали "Спасибо" suhar666
warel (28.06.2019)
Непрочитано 08.11.2011, 02:34  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Очистка буфера LCD в программе ATMEGA

Сообщение от suhar666 Посмотреть сообщение
каким образом Вы нашли решение очистки?
Как подсказал lsa, поставил пробелы в знакоместо для выводимой величины. У меня 4 знака, если выводится 3 последних знака, то первый пустой:
PHP код:
//напряжение
    
ftoa(Volt1LCD_volt);       // преобразование и вывод на LCD напряжения
    
lcd_gotoxy(0,0); 
    
lcd_puts(LCD_volt);
    
lcd_putsf("    "); 
Dimitrij вне форума  
Сказали "Спасибо" Dimitrij
warel (28.06.2019)
Непрочитано 08.11.2011, 09:28  
ut1wpr
Почётный гражданин KAZUS.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Очистка буфера LCD в программе ATMEGA

Сообщение от Dimitrij Посмотреть сообщение
вообще не понятно, где и что менять. Как получилось read_adc(2)/10.24*256 ?
В интернет что-то я информации на эту тему не нашел.
В любом даташите на МК с АЦП. Мега8 не исключение.

Формула в наличии. Дальше напрягаемся и вспоминаем школу. Арифметика, примерно 6-й класс. Институты отдыхают...
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (28.06.2019)
Непрочитано 08.11.2011, 12:25  
Dimitrij
Временная регистрация
 
Регистрация: 26.02.2005
Сообщений: 78
Сказал спасибо: 15
Сказали Спасибо 16 раз(а) в 16 сообщении(ях)
Dimitrij на пути к лучшему
По умолчанию Re: Очистка буфера LCD в программе ATMEGA

Сообщение от ut1wpr Посмотреть сообщение
Формула в наличии.
Это и так понятно, вопрос ставился, как она реализована в этой программе?
Dimitrij вне форума  
Сказали "Спасибо" Dimitrij
warel (28.06.2019)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ЖКИ и CodeVision: 8-ми битный режим vikpol Микроконтроллеры, АЦП, память и т.д 33 09.03.2009 21:55
Atmega 16, LCD и программирование по ISP sliam Микроконтроллеры, АЦП, память и т.д 29 08.06.2007 15:16
как вывести на LCD данные из буфера? goooblin Микроконтроллеры, АЦП, память и т.д 11 02.04.2007 10:01
4-битный режим LCD при работе с Atmega 128 Hellka Микроконтроллеры, АЦП, память и т.д 1 02.10.2006 14:23
Не могу разобраться с LCD init_sub Информация по радиокомпонентам 6 02.04.2004 04:40


Часовой пояс GMT +4, время: 17:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot