реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Proteus и AVR ATMEGA
dimka2001
сообщение Mar 7 2006, 13:40
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 6-11-05
Пользователь №: 10 508



blink.gifЛюди добрые у кого есть библиотеки для Proteus микроконтроллеров ATMEGA (особенно интересует ATMEGA8535)???
Еще такой вопросик имеется: написал программу на COdevision для ATMEGA16 собрал схемку в Proteus залил программку и она некоретктно работает затыкается на строчке
sprintf(lcd_buffer,"t=%u",result1); unsure.gif
У кого есть какие соображения... biggrin.gif
Прикрепленные файлы
Прикрепленный файл  my.7z.txt ( 49.98 килобайт ) Кол-во скачиваний: 56
 
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 7 2006, 20:47
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664



Цитата(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. Аттач не смотрел.
Go to the top of the page
 
+Quote Post
dimka2001
сообщение Mar 9 2006, 06:40
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 129
Регистрация: 6-11-05
Пользователь №: 10 508



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

например как?
Go to the top of the page
 
+Quote Post
osnwt
сообщение Mar 9 2006, 08:39
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 175
Регистрация: 26-01-06
Из: Sevastopol
Пользователь №: 13 664



Цитата(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', которого при непосредственном выводе в примере нет за ненадобностью.

Сообщение отредактировал osnwt - Mar 9 2006, 08:54
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 10:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016