Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Proteus и AVR ATMEGA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dimka2001
blink.gifЛюди добрые у кого есть библиотеки для Proteus микроконтроллеров ATMEGA (особенно интересует ATMEGA8535)???
Еще такой вопросик имеется: написал программу на COdevision для ATMEGA16 собрал схемку в Proteus залил программку и она некоретктно работает затыкается на строчке
sprintf(lcd_buffer,"t=%u",result1); unsure.gif
У кого есть какие соображения... biggrin.gif
osnwt
Цитата(dimka2001 @ Mar 7 2006, 15:40) *
blink.gifЛюди добрые у кого есть библиотеки для Proteus микроконтроллеров ATMEGA (особенно интересует ATMEGA8535)???

В версии 6.73 этой меги еще нет. В 6.9 (последней), подозреваю, что тоже, но рабочей версии 6.9 я еще не встречал.

И могу разочаровать: в свое время опытным путем было выяснено, что версии AVR.DLL (модели МК от атмела) при переносе в неродную версию Proteus не работают. Или почти всегда не работают, или работают, но не везде. Чаще всего симуляция просто не запускается - или вылетает по ошибке, или зависает SPICE. Так что про модели можно просто забыть - надо говорить о версии Proteus, в которой есть конкретные модификации.

Цитата
Еще такой вопросик имеется: написал программу на COdevision для ATMEGA16 собрал схемку в Proteus залил программку и она некоретктно работает затыкается на строчке
sprintf(lcd_buffer,"t=%u",result1); unsure.gif

Если других sprintf в программе нет, то с большой вероятностью нужно увеличить размер CSTACK. Тоже натыкался на трудноуловимые ошибки при недостатке выделенной памяти. Если другие printf есть и нормально работают, тогда сказать сложно. Но для конкретного случая лучше написать простенький цикл для вывода unsigned числа самостоятельно - экономится лишний кило памяти, и нет проблем со стеком.


PS. Аттач не смотрел.
dimka2001
?
Цитата
Если других sprintf в программе нет, то с большой вероятностью нужно увеличить размер CSTACK. Тоже натыкался на трудноуловимые ошибки при недостатке выделенной памяти. Если другие printf есть и нормально работают, тогда сказать сложно. Но для конкретного случая лучше написать простенький цикл для вывода unsigned числа самостоятельно - экономится лишний кило памяти, и нет проблем со стеком.

например как?
osnwt
Цитата(dimka2001 @ Mar 9 2006, 08:40) *
Цитата

Но для конкретного случая лучше написать простенький цикл для вывода unsigned числа самостоятельно - экономится лишний кило памяти, и нет проблем со стеком.

например как?


Вопрос странный, задачка на уровне школы по предмету "Информатика".

Как вывести десятичное значение числа? Да 1000 и одним способом. Вот кусок, который я накидал когда-то на скорую руку для использования в отладочных дампах. Выводит число в виде 5 символов со значащими нулями. Другие варианты (с пробелами вместо нулей или переменной длины) - по аналогии, или найти можно где угодно. Писалось очень наскоро, прошу не критиковать стиль и т.п. - его там просто нет, это одноразовая затычка, которая просто прижилась в отладочном файле по причине того, что большего и не требуется. byte - это unsigned char, word - unsigned int.


Код
void print_XXXXX(word w)
{
    byte buffer[5];
    byte n = 5;
    byte i;

    for (i = 0; i < 5; i++)
    {
        byte d = w % 10;
        buffer[--n] = d;
        w = (w - d) / 10;
    }

    for (i = 0; i < 5; i++)
    {
        putchar(buffer[i] + '0');
    }
}


PS. Посмотрев на написанное спустя пару лет, сразу бросилось в глаза, что многое можно оптимизировать. Например, вместо первого цикла по i использовать вариант с for (n=5; n;), убрав инициализацию n при объявлении (инициализировать хорошо там, где оно будет использовано). Тогда необходимость в i в первом цикле отпадает, а вывод можно организовать другой подручной функцией, например, выводящей n символов строки с указанного адреса (тогда и второй цикл по i станет не нужен). И т.п. Совершенству нет предела.

PPS. А если нужна аналогия со sprintf, то легко адрес буфера передавать как параметр, а возвращать ссылку на первый значащий символ строки (отбросив тем самым незначащие нули - ясное дело, что нужно установить флажок,где они начинаются, или искать первый ненулевой символ самому). И не забыть, что буфер должен быть или в параметрах, или статическим. А в конце буфера должен стоять символ конца строки '\0', которого при непосредственном выводе в примере нет за ненадобностью.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.