Страница 1 из 1

зависает прошивка при выводе на LCD!

Добавлено: Ср дек 30, 2009 10:34:40
ssvd
привет!
есть программа, вообще то стандартная, но если выводить на LCD текст, то программа зависает! Если за комментировать вывод на дисплей, то все нормально работает! где я неправ?
проц atmega8

Код: Выделить всё

 lcd_init(16);
    while (1){
        __beep(100);        
        devices=w1_search(0xf0,rom_codes);
        if (devices==0){
            lcd_gotoxy(0,0);
            lcd_putsf("Init. device");
            if (ds18b20_init(&rom_codes[i][0],25,35,DS18B20_9BIT_RES)){
                lcd_gotoxy(0,1);
                lcd_putsf("                ");
                lcd_puts(i+'='+&rom_codes[i][0]);
                delay_ms(1000);                
            } else {
                lcd_gotoxy(0,1);
                lcd_putsf("ERROR");
            }
        }
        else{
            while(1){
                temp=ds18b20_temperature(&rom_codes[0][0]);
                sprintf(lcd_buffer,"Temp in=%i.%u\xdfC",temp,temp%1);
//                lcd_gotoxy(0,0);
//                lcd_putsf("                ");
//                lcd_gotoxy(0,0);
//                lcd_puts(lcd_buffer);
                delay_ms(1000);                
                    
                temp=ds18b20_temperature(&rom_codes[1][0]);
                sprintf(lcd_buffer,"Temp out=%i.%u\xdfC",temp,temp%1);
//                lcd_gotoxy(0,1);
//                lcd_putsf("                ");
//                lcd_gotoxy(0,1);
//                lcd_puts(lcd_buffer);
                delay_ms(1000);                
                __beep(50);        
            }       
        };

Добавлено: Ср дек 30, 2009 11:23:34
Danko
Если Вы хотите отделить целую часть от дробной и соответственно отделить дробную от целой
обычно делают так:
sprintf(lcd_buffer,"Temp out=%i.%u\xdfC",temp/10,temp%10);

temp/10 - деление на 10 без остатка

temp%10 - остаток от деления на 10

Re: зависает прошивка при выводе на LCD!

Добавлено: Ср дек 30, 2009 12:37:09
Neekeetos
ssvd писал(а):привет!
есть программа, вообще то стандартная, но если выводить на LCD текст, то программа зависает! Если за комментировать вывод на дисплей, то все нормально работает! где я неправ?
проц atmega8

Код: Выделить всё

 lcd_init(16);
Могу предположить что неправильно подключен LCD, конкретно его R/W вход. Драйвер экрана может ждать выполнения команды, соотв проверять флаг busy.

Добавлено: Ср дек 30, 2009 21:07:55
Saadov
А что за странная запись

Код: Выделить всё

lcd_puts(i+'='+&rom_codes[i][0]);

Добавлено: Ср дек 30, 2009 22:11:49
Neekeetos
Saadov писал(а):А что за странная запись

Код: Выделить всё

lcd_puts(i+'='+&rom_codes[i][0]);
похоже человек пытается сложить строки как в бейсике :) , кстати из за этого и зависает скорей всего, указатель неверный

Добавлено: Ср дек 30, 2009 22:15:26
Saadov
Я то понял, а вот автор видно что то напутал))
Исправте и примените функцию присоединения строк, читать по
String Functions в хелпе своего компилятора.

Код: Выделить всё

The string manipulation functions were extended to handle strings located both in SRAM and FLASH memories.


char *strcat(char *str1, char *str2)


      concatenate the string str2 to the end of the string str1.


char *strcatf(char *str1, char flash *str2)


      concatenate the string str2, located in FLASH, to the end of the string str1.


char *strncat(char *str1, char *str2, unsigned char n)


      concatenate maximum n characters of the string str2 to the end of the string str1.
Returns a pointer to the string str1.


char *strncatf(char *str1, char flash *str2, unsigned char n)


      concatenate maximum n characters of the string str2, located in FLASH, to the end of the string str1.
Returns a pointer to the string str1.

Добавлено: Чт дек 31, 2009 08:18:04
ssvd
Neekeetos писал(а):
Saadov писал(а):А что за странная запись

Код: Выделить всё

lcd_puts(i+'='+&rom_codes[i][0]);
похоже человек пытается сложить строки как в бейсике :) , кстати из за этого и зависает скорей всего, указатель неверный

опа, привычка с паскаля ))))

Добавлено: Пн янв 11, 2010 19:49:03
ssvd
всем спасибо все как бы работает! НО! все таки подвисает через некоторое время. Берусь за дисплей а он горячий!!! контроллер дисплея тоже горячий! может изза этого зависает? и почему может греться контроллер на дисплее, подаю 5,4 вольта. Дисплей wh1602. В даташите написано что работает MAX 5,3. Изза этого?

Добавлено: Пн янв 11, 2010 19:52:04
Saadov
Вполне может быть! + еще погрешность прибора которым вы измеряли.
Поставте в цепь питания дисплея диод, подберите такой, чтоб падение напряжения на нем было 0.3-0.5 В. И все будет :beer:

Добавлено: Пн янв 11, 2010 20:11:24
ssvd
ok попробую!