Гость химик Опубликовано 25 Декабря, 2013 в 15:56 Жалоба Поделиться Опубликовано 25 Декабря, 2013 в 15:56 (изменено) Добрый день. Делаю термометр на двух DS1820 + 90s2313. Проблема в том, что размер памяти 1kB, а эта жирная функция забирает 60% от обьема. Делал вот так: sprintf(text,"t1 %d",ds1820_temperature_10(&ds1820_rom_codes[0][0])/10); lcd_gotoxy(0,0); lcd_puts(text); lcd_putchar(0x01); lcd_putchar(0x43); Один из градусников будет работать в промежутке -40 ... +50 (грубо говоря). Поетому знак должен меняться и если число меньше 10, не должно сползать влево. Искал в интернете, нашел что-то типа такого: lcd_gotoxy(0,0); lcd_putchar('t'); lcd_putchar('='); lcd_gotoxy(3,0); lcd_putchar(x/10 + 0x30): ??????????????? lcd_putchar(x%10 + 0x30): ??????????????? lcd_putchar(0x01); // мой символ lcd_putchar('C'); Должно получиться вот что t= +18*C Вот как ето правильно сделать? И как выводить знак +/-? Изменено 25 Декабря, 2013 в 15:58 пользователем химик Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 25 Декабря, 2013 в 16:10 Жалоба Поделиться Опубликовано 25 Декабря, 2013 в 16:10 (изменено) ...Проблема в том, что размер памяти 1kB, а эта жирная функция забирает 60% от обьема. ... При таком размере памяти надо писать не на "С", а на Ассемблере. Заодно и такие вопросы ...И как выводить знак +/-?... возникать не будут. Знак - старший бит 9-битного результата DS1820. Изменено 25 Декабря, 2013 в 16:16 пользователем Lexter Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость химик Опубликовано 30 Декабря, 2013 в 18:26 Жалоба Поделиться Опубликовано 30 Декабря, 2013 в 18:26 При таком размере памяти надо писать не на "С", а на Ассемблере. Ага. Осталось только выучить Ассемблер и через пол годика у меня будет термометр. Заодно и такие вопросывозникать не будут. Знак - старший бит 9-битного результата DS1820. С этим уже разобрался, просто не сразу понял, что указатель %d выведет на дисплей знаковое число. Сделал вот так temp = ds1820_temperature_10(&ds1820_rom_codes[0][0])/10; Block_Char(); lcd_gotoxy(0,0); lcd_putchar('t'); lcd_putchar('1'); lcd_putchar(0x20); // пробел lcd_putchar(sign); lcd_putchar(De); lcd_putchar(Ee); lcd_putchar(0x01); lcd_putchar(0x43); void Block_Char(void){ if(temp <= -1) sign = 0x2d; if(temp <= 1) sign = 0x2b; if(temp <= 0) sign = 0x20; De = temp/10; if(De != 0){ De = De + 0x30; }else{ De = 0x20; } Ee = (temp%10) + 0x30; } Мне нужно было знать как выводиться переменная через lcd_putchar(); :smile: Теперь другая проблема - нешьеться 90s2313. Выскакивает ошибка начала програмирования. В закромах лежит и Tynni2313, но и старушку 90s жалко выбрасывать. Для такой простинькой схемы ее и берег. Что может быть? P.S. Внешний кварц 4МгЦ, меандр с программатора тоже непомагает. Ссылка на комментарий Поделиться на другие сайты Поделиться
Lexter Опубликовано 31 Декабря, 2013 в 07:45 Жалоба Поделиться Опубликовано 31 Декабря, 2013 в 07:45 (изменено) ...Теперь другая проблема - нешьеться 90s2313. Выскакивает ошибка начала програмирования. ... Да, встречается такое. Приходится читать рекомендации от авторов чипа (https://www.atmel.com/Images/doc0839.PDF со страницы 60 и далее) долго и до просветления, сверяя написанное с тем, что на осциллографе. Изменено 31 Декабря, 2013 в 07:47 пользователем Lexter Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти