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

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

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

|
Хоть бы написали, в чём проблема. Цитата // ajstex khajtararenq bolor popoxakannery Это цитата из Вашего исходника. Переведите. На каком это языке.? И мне нечем схему глянуть .... По-моему, это Eagle, но на работе у меня его нету.
Сообщение отредактировал hd44780 - May 7 2012, 14:04
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
May 7 2012, 19:58
|
Группа: Новичок
Сообщений: 2
Регистрация: 7-05-12
Пользователь №: 71 725

|
Цитата(hd44780 @ May 7 2012, 18:02)  Хоть бы написали, в чём проблема.
Это цитата из Вашего исходника. Переведите. На каком это языке.?
И мне нечем схему глянуть .... По-моему, это Eagle, но на работе у меня его нету. простите это на армянском озночает здес обявляем переменние завтра перееведу на русский и отправлю вам спасибо за ответ а схема на протеусе собрана а проблема у меня в том что каждий раз на дисплей каторий состоит из светодиодов виводит еденицу кажетца что после иф не продолжает работу
|
|
|
|
|
May 7 2012, 20:19
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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]); };
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
May 8 2012, 07:28
|
Местный
  
Группа: Участник
Сообщений: 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); };
|
|
|
|
|
May 8 2012, 08:46
|

Частый гость
 
Группа: Участник
Сообщений: 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); }; А что вернет ваша функция в случае невыполнения тестового условия?
|
|
|
|
|
May 8 2012, 09:46
|

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

|
Цитата(maksimp @ May 8 2012, 10:28)  И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления. Ну и что? Компилятор Си со дня своего рождения умеет это делать  . А вот, что переменная c_gnacox остаётся неинициализированной, это действительно серъёзный глюк.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
May 9 2012, 00:09
|

кекс
     
Группа: Свой
Сообщений: 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)  Ну и что? Компилятор Си со дня своего рождения умеет это делать  . Компилятор то умеет, только эта операция выполняется не над константой, а значит в run-time. Следовательно будет к вашей программке ~1KB из библиотеки подлинковано с функциями __rt_div. Мало того что медленно так еще и памяти сожрет. "/" и "%", а также ".xx" в AVR лучше не сорить без особой на то надобности. На крайняк - добейте массив чтобы стал кратен степени двойки и делайте "&".
|
|
|
|
|
May 9 2012, 05:11
|

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

|
Цитата(defunct @ May 9 2012, 03:09)  объявление массива во флеш гарантированно обезопасит от непредсказуемых последствий выхода индекса за границы массива. Требую подробностей... Может я о чём-то не в курсе  ИМХО Принципиально нет никакой разницы откуда читать из-за пределов массива, что из ОЗУ что из ПЗУ. В контексте AVR можно притянуть за уши, что прочитали мы из SFR что-нибудь ну потеряли байт информации например из UDR и это при условии что уарт на полинге построен и что? Программа-то как содержала багу так и будет её содержать. Цитата(defunct @ May 9 2012, 03:09)  Вернет один в один с тем что и оригинальная функция. Поэтому я написал что стоит ПРИМЕРНО так писать. Чтобы дать толчёк в каком направлении искать багу человеку, а тут развели дискуссию... Цитата(maksimp @ May 8 2012, 10:28)  И вы добавили взятие остатка (операция %) на процессоре без аппаратного деления. Это просто ужасно... Вы видели исходный код? Не коробит? Вот когда у него всё заработает и он поймёт что нужна оптимизация т.к. проваливается либо по скорости либо по объёму тогда можно будет и заменить один символ % на три строчки кода. На первом этапе это даже скорее вредно чем полезно. А ещё из из идеологических советов тут будет более правильно аргумент функции сделать беззнаковым...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
May 9 2012, 17:35
|

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

|
Цитата(demiurg_spb @ May 9 2012, 07:11)  что прочитали мы из SFR что-нибудь ну потеряли байт информации например из UDR и это при условии что уарт на полинге построен и что? Именно это и имел в виду (SFR и ОЗУ используют одно и тоже адресное пространство, flash - другое). Из SFR кроме UDR есть другие регистры которые читать нежелательно. Цитата Программа-то как содержала багу так и будет её содержать. то, что значение возвращаемое функцией при t>x не определено - не мне судить баг это или так задумано.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|