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

 
 
 
Reply to this topicStart new topic
> помогите с ошибкой, атмега16
remontprint
сообщение May 7 2012, 13:36
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 7-05-12
Пользователь №: 71 725



Помогите пожалуста, никак не могу разобраться где я допустил ошибку?

Сообщение отредактировал IgorKossak - May 7 2012, 17:34
Причина редактирования: грамотно писать научитесь

Прикрепленные файлы
Прикрепленный файл  avr_stanok_vejnakan.rar ( 72.39 килобайт ) Кол-во скачиваний: 41
 
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 7 2012, 14:02
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Хоть бы написали, в чём проблема.

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


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

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

Сообщение отредактировал hd44780 - May 7 2012, 14:04


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
remontprint
сообщение May 7 2012, 19:58
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 7-05-12
Пользователь №: 71 725



Цитата(hd44780 @ May 7 2012, 18:02) *
Хоть бы написали, в чём проблема.



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

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

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

а проблема у меня в том что каждий раз на дисплей каторий состоит из светодиодов виводит еденицу кажетца что после иф не продолжает работу
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 7 2012, 20:19
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



вместо:
Код
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]);
};


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
maksimp
сообщение May 8 2012, 07:28
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(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);
};

Go to the top of the page
 
+Quote Post
ut1wpr
сообщение May 8 2012, 08:46
Сообщение #6


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

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



Цитата(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);
};
А что вернет ваша функция в случае невыполнения тестового условия?
Go to the top of the page
 
+Quote Post
hd44780
сообщение May 8 2012, 09:46
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(maksimp @ May 8 2012, 10:28) *
И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления.


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

А вот, что переменная c_gnacox остаётся неинициализированной, это действительно серъёзный глюк.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
defunct
сообщение May 9 2012, 00:09
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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 лучше не сорить без особой на то надобности. На крайняк - добейте массив чтобы стал кратен степени двойки и делайте "&".
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 9 2012, 05:11
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(defunct @ May 9 2012, 03:09) *
объявление массива во флеш гарантированно обезопасит от непредсказуемых последствий выхода индекса за границы массива.
Требую подробностей...
Может я о чём-то не в курсеsm.gif
ИМХО Принципиально нет никакой разницы откуда читать из-за пределов массива, что из ОЗУ что из ПЗУ.
В контексте AVR можно притянуть за уши, что прочитали мы из SFR что-нибудь ну потеряли байт информации например из UDR и это при условии что уарт на полинге построен и что? Программа-то как содержала багу так и будет её содержать.

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

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

А ещё из из идеологических советов тут будет более правильно аргумент функции сделать беззнаковым...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
defunct
сообщение May 9 2012, 17:35
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

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

то, что значение возвращаемое функцией при t>x не определено - не мне судить баг это или так задумано.
Go to the top of the page
 
+Quote Post

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

 


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


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