Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: помогите с ошибкой
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
remontprint
Помогите пожалуста, никак не могу разобраться где я допустил ошибку?
hd44780
Хоть бы написали, в чём проблема.

Цитата
// ajstex khajtararenq bolor popoxakannery


Это цитата из Вашего исходника. Переведите. На каком это языке.?

И мне нечем схему глянуть .... По-моему, это Eagle, но на работе у меня его нету.
remontprint
Цитата(hd44780 @ May 7 2012, 18:02) *
Хоть бы написали, в чём проблема.



Это цитата из Вашего исходника. Переведите. На каком это языке.?

И мне нечем схему глянуть .... По-моему, это Eagle, но на работе у меня его нету.

простите это на армянском озночает здес обявляем переменние завтра перееведу на русский и отправлю вам спасибо за ответ а схема на протеусе собрана

а проблема у меня в том что каждий раз на дисплей каторий состоит из светодиодов виводит еденицу кажетца что после иф не продолжает работу
demiurg_spb
вместо:
Код
int tiv_stanal(int t)
{
   int c_gnacox;
   if (t==0) {c_gnacox=119; goto avart;};
   if (t==1) {c_gnacox=20; goto avart;};
   if (t==2) {c_gnacox=110; goto avart;};
   if (t==3) {c_gnacox=94; goto avart;};
   if (t==4) {c_gnacox=25; goto avart;};
   if (t==5) {c_gnacox=91; goto avart; };
   if (t==6) {c_gnacox=123; goto avart;};
   if (t==7) {c_gnacox=22; goto avart;};
   if (t==8) {c_gnacox=127; goto avart;};
   if (t==9) {c_gnacox=95; goto avart;};

  avart:
  return (c_gnacox);
};
стоит писать примерно так:
Код
int tiv_stanal(int t)
{
   static const int c_gnacox[10] = {119, 20, 110, 94, 25, 91, 123, 22, 127, 95};

   return (c_gnacox[t%10]);
};
maksimp
Цитата(demiurg_spb @ May 8 2012, 00:19) *
Код
int tiv_stanal(int t)
{
   static const int c_gnacox[10] = {119, 20, 110, 94, 25, 91, 123, 22, 127, 95};

   return (c_gnacox[t%10]);
};

И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления. Тогда уж
Код
int tiv_stanal(int t)
{
   static const int c_gnacox_t[10] = {119, 20, 110, 94, 25, 91, 123, 22, 127, 95};
   int c_gnacox;
   if (t>=0 && t<=9) {c_gnacox=c_gnacox_t[t];};
   return (c_gnacox);
};

ut1wpr
Цитата(maksimp @ May 8 2012, 11:28) *
И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления. Тогда уж
Код
int tiv_stanal(int t)
{
   static const int c_gnacox_t[10] = {119, 20, 110, 94, 25, 91, 123, 22, 127, 95};
   int c_gnacox;
   if (t>=0 && t<=9) {c_gnacox=c_gnacox_t[t];};
   return (c_gnacox);
};
А что вернет ваша функция в случае невыполнения тестового условия?
hd44780
Цитата(maksimp @ May 8 2012, 10:28) *
И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления.


Ну и что? Компилятор Си со дня своего рождения умеет это делать laughing.gif .

А вот, что переменная c_gnacox остаётся неинициализированной, это действительно серъёзный глюк.
defunct
Цитата(ut1wpr @ May 8 2012, 10:46) *
А что вернет ваша функция в случае невыполнения тестового условия?

Вернет один в один с тем что и оригинальная функция.
Поэтому лучше не заморачиваясь написать так:

Код
int tiv_stanal(int t)
{
   static __flash int c_gnacox[10] = {119, 20, 110, 94, 25, 91, 123, 22, 127, 95};

   return (c_gnacox[t]);
};


объявление массива во флеш гарантированно обезопасит от непредсказуемых последствий выхода индекса за границы массива.

Цитата(hd44780 @ May 8 2012, 11:46) *
Ну и что? Компилятор Си со дня своего рождения умеет это делать laughing.gif .

Компилятор то умеет, только эта операция выполняется не над константой, а значит в run-time. Следовательно будет к вашей программке ~1KB из библиотеки подлинковано с функциями __rt_div. Мало того что медленно так еще и памяти сожрет. "/" и "%", а также ".xx" в AVR лучше не сорить без особой на то надобности. На крайняк - добейте массив чтобы стал кратен степени двойки и делайте "&".
demiurg_spb
Цитата(defunct @ May 9 2012, 03:09) *
объявление массива во флеш гарантированно обезопасит от непредсказуемых последствий выхода индекса за границы массива.
Требую подробностей...
Может я о чём-то не в курсеsm.gif
ИМХО Принципиально нет никакой разницы откуда читать из-за пределов массива, что из ОЗУ что из ПЗУ.
В контексте AVR можно притянуть за уши, что прочитали мы из SFR что-нибудь ну потеряли байт информации например из UDR и это при условии что уарт на полинге построен и что? Программа-то как содержала багу так и будет её содержать.

Цитата(defunct @ May 9 2012, 03:09) *
Вернет один в один с тем что и оригинальная функция.
Поэтому я написал что стоит ПРИМЕРНО так писать. Чтобы дать толчёк в каком направлении искать багу человеку, а тут развели дискуссию...

Цитата(maksimp @ May 8 2012, 10:28) *
И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления.
Это просто ужасно... Вы видели исходный код? Не коробит?
Вот когда у него всё заработает и он поймёт что нужна оптимизация т.к. проваливается либо по скорости либо по объёму тогда можно будет и заменить один символ % на три строчки кода. На первом этапе это даже скорее вредно чем полезно.

А ещё из из идеологических советов тут будет более правильно аргумент функции сделать беззнаковым...
defunct
Цитата(demiurg_spb @ May 9 2012, 07:11) *
что прочитали мы из SFR что-нибудь ну потеряли байт информации например из UDR и это при условии что уарт на полинге построен и что?

Именно это и имел в виду (SFR и ОЗУ используют одно и тоже адресное пространство, flash - другое). Из SFR кроме UDR есть другие регистры которые читать нежелательно.

Цитата
Программа-то как содержала багу так и будет её содержать.

то, что значение возвращаемое функцией при t>x не определено - не мне судить баг это или так задумано.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.