Карма: 90
Рейтинг сообщений: 1337
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4558 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
write_1(0, "ОК") и на экране будет ОК
Конечно будет, никто и не спорит. Речь идёт не о Вашей ф-ии, которая выводит данные на дисплей, а о строке. Вы объявили строку как константу и пытаетесь изменить её с помощью sprintf. Но забыли о том, что она не может меняться, т.к. она константа !
Карма: 67
Рейтинг сообщений: 1053
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19372 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Vlad0o писал(а):
Неужели sprintf() так много занимает?
Да, больше килобайта.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Поскольку sprintf() - чет уж очень слишком большой. Я мучил гугл в поисках его альтернативы. Нашел itoa() (из int делает char*). В функция нестандартная, в обычных библиотеках Keil'a ее нет. Может у кого завалялся листинг itoa() ? Поделитесь, пожалуйста. sprintf уж очень неэкономично..
ЗЫ пробовал взять отсюда http://www.scribd.com/doc/59309455/ITOA-C , скопировалось с косяками. поправлял долго, но все равно достаточное количество ошибок. Ругается вот так *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS на SYMBOL: cadena и SYMBOL: _itoa
Открыта удобная площадка с выгодными ценами, поставляющая весь ассортимент продукции, производимой компанией MEAN WELL – от завоевавших популярность и известных на рынке изделий до новинок. MEAN WELL.Market предоставляет гарантийную и сервисную поддержку, удобный подбор продукции, оперативную доставку по России.
На сайте интернет-магазина посетители смогут найти обзоры, интересные статьи о применении, максимальный объем технических сведений.
Ну можно сымпровизировать. Это урезанная версия: минимальный набор для чисел с десятичным основанием системы счисления. Полная версия будет немного поболее, если она вообще нужна будет.
if (value < 0){*(str++)='-'; value=-value;}// Если число отрицательное, то ставим минус n = str;// Запоминаем указатель на начало конца. O_o Числа, в смысле. while (value){*(str++)= value%10 +'0'; value /= 10;}// Преобразовываем число в строку задом на перёд *(str--)= 0;// Ставим нуль-символ конца строки
while (n < str){ buff =*n;*(n++)=*str;*(str--)= buff;}// Кручу-верчу перевернуть число хочу! }
Естественно не исключаю и подозреваю, что сделать можно оптимальнее.
Продукция MOSO предназначена в основном для индустриальных приложений, использует инновационные решения на основе более 200 собственных патентов для силовой электроники и соответствует международным стандартам. LED-драйверы MOSO применяются в системах наружного освещения разных отраслей, включая промышленность, сельское хозяйство, транспорт и железную дорогу. В ряде серий реализована возможность дистанционного контроля и программирования работы по заданному сценарию. Разберем решения MOSO
подробнее>>
IfoR Подобный вариант мне попадался. Только я что то протупил над той функцией. void itoa( int value, char * str ) здесь value это число которое надо преобразовать, а str это массив куда всё записывается. Как мне этой функцией воспользоваться? я предполагаю что так (для проверки): int T; char sT[25]; void itoa( int value, char * str ); void main (void) { T = 25; itoa(T, sT);
write_1(0, sT); //вывод на ЛСД while (1) {} }
Примерно так? Или все проще делается с ней? Я просто хочу вывести на экран значения с ds1820 примерно такие -55 и 125 (без знака +)
ЗЫ У меня пока главной задачей в оптимизации стоит избавление от sprintf
Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.
IfoR, странно. я вроде так и использовал, но экран оставался пустым. еще раз попробую, может где то что то не так скопировал я. сейчас по-быстрому проверял, как то странно вышло мне компилятор сказал что слишком много параметров, когда я вот так подставил itoa(T, sT). я все равно это itoa добью))
Зарегистрирован: Чт сен 29, 2011 13:54:53 Сообщений: 74
Рейтинг сообщения:0
[quote="Vlad0o"]Aerarh, спасибо еще раз. void LCD_WriteInt(unsigned int Data) работает нормально!=) правда нули впереди появляются когда число не 5тизначное, но это можно решить добавив пару условий.
Да, по началу нагрузочка глаза разбегаются... Все в отладочном режиме, еще знак и нули... в общем мод "хоть что-то покажи, а красоту потом наведем"
Error [1346] ; 0. can't find 0x2 words for psect "config" in segment "CONFIG" (largest unused contiguous range 0x1)
Вероятно Вы неправильно задали конфигурационное слово - оно у Вас больше 14 бит в размере, естественно для него не хватает места в конфиг-области памяти, которая размером 1 слово. Конфигурировать надо примерно так:
Дефайны для макроса __CONFIG можно посмотреть в заголовочном файле на Ваш контроллер, обычно в конце. Естественно, в код должен быть включен файл htc.h
Карма: 90
Рейтинг сообщений: 1337
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4558 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
levaclaus писал(а):
Как победить?
Написать свои функции для работы с датчиком. Подобное 100 раз обсасывалось на этом форуме. Тем более, Вы же сами запрещаете прерывания на длительное время
Зарегистрирован: Чт сен 29, 2011 13:54:53 Сообщений: 74
Рейтинг сообщения:0
stas00n писал(а):
Aerarh писал(а):
Кто это объяснит (PICC 9.6)?
Error [1346] ; 0. can't find 0x2 words for psect "config" in segment "CONFIG" (largest unused contiguous range 0x1)
Вероятно Вы неправильно задали конфигурационное слово - оно у Вас больше 14 бит в размере, естественно для него не хватает места в конфиг-области памяти, которая размером 1 слово. Конфигурировать надо примерно так:
Дефайны для макроса __CONFIG можно посмотреть в заголовочном файле на Ваш контроллер, обычно в конце. Естественно, в код должен быть включен файл htc.h
Да я уже разобрался, Так и было, и дефайны нашел именно там. Спс.
Надеюсь я не исчерпал свою квоту на глупые вопросы.
У меня возникло очередное затруднение, скорее всего из специфичности самодельного девелопментборда (как оказалось этот термин больше подходит, чем "kit").
К третьему порту (Р3) по пинам (3.1, 3.2, 3.3, 3.4) подключен LCD (работает ). Но! Для экономии портов на эти же пины ( 3.1 - 3.4) посадили кнопки (обычные кнопки) и с помощью контрольного пина 3.0 так сказать проверяется нажата ли кнопка или нет. Вот так вот примерно http://i023.radikal.ru/1111/b8/80306427b39b.jpg. Опрашивать получается - светодиод при нажатии загорается. Вот такой вот бесконечный цикл для проверки.
Код:
while (1) { P3MDOUT = 0; //определение порта на вход B1 = 0; B2 = 1; //опрос именно этой кнопки! B3 = 0; B4 = 0;
if (B0 == 1) //если кнопка нажата {Delay(1000);} //проверка на if (B0 == 1) //дребезг {LED1 = 1;} else {LED1 = 0;} }
Но если подставить вместо "LED1 = 1;" вывод на экран произвольного текста при нажатии, то ничего хорошего не получается.... выводится только то что стоит в else (я так понимаю какой то "конфликт" - ведь один же порт используется). У меня даже в процессе экспериментов с кодом при нажатии длительном бледная буква "й" пробегала (один раз) по верхней строке справа налево (а ведь это не планировалось ) и при этом на той же верхней строке более ярко был текст. К сожалению текст программы утерян..
Как мне разобраться с кнопкой? К примеру сделать счетчик нажатий кнопки. Нажимаешь - 1, еще раз - 2 на экране единицу сменяет двойка...как то так. Я понял только то что надо использовать "флаги" - глобальные переменные которые сохраняют текущее и предыдущее состояния кнопки. но пока это не дало результатов....
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения