CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

К.С.А писал(а): Возникла проблема, ... на ЖКИ выводятся надписи ...
В том, что "на ЖКИ выводятся надписи" проблемы нет, вероятно имелось ввиду то, что надписи не выводятся? Ну, скажем так, они может и выводятся, чтолько это трудно заметить - программа инициирует один порт, затем инициирует LCD, после чего, проверив состояние пина, выводит на экран одну или другую надпись. Всё. А дальше начинается чехарда - процессорное ядро начинает читать и исполнять то, что записано в памяти программ сразу за вот этим местом:

Код: Выделить всё

} // Это осталось от main.
А там может быть всё, что угодно, любые инструкции и даже - части инструкций, хуже того - там могут быть данные, которые процессор попытается интерпретировать как инструкции. Вероятность удержаться в седле у него при таком раскладе - абсолютно никакая. Программа в м/к исполняется не под управлением ОС, а сама по себе, поэтому она не должна завершаться, как программы для компьютеров, работающих под управлением ОС. Попробуй заключить опрос порта и вывод на дисплей в бесконечный цикл:

Код: Выделить всё

while (1)
{
	// опрос пина с кнопкой
	// очистка экрана
	if () {
		// вывод 1
	} else {
		// вывод 2
	}
}
Evaluation - означет "оценочная", не стесняйся заглянуть в словарь.
Функция очистки экрана объявлена вот так:

Код: Выделить всё

void lcd_clear(void);
то есть, никаких параметров не принимает, привыкай искать объявления функций и по ним определять такие вещи.
Очистку лишь части дисплея можно осуществить выводом в эту часть пробелов.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Yellow Tiger писал(а):Всё. А дальше начинается чехарда - процессорное ядро начинает читать и исполнять то, что записано в памяти программ сразу за вот этим местом:

Код: Выделить всё

} // Это осталось от main.
А там может быть всё, что угодно, любые инструкции и даже - части инструкций, хуже того - там могут быть данные, которые процессор попытается интерпретировать как инструкции. Вероятность удержаться в седле у него при таком раскладе - абсолютно никакая. Программа в м/к исполняется не под управлением ОС, а сама по себе, поэтому она не должна завершаться, как программы для компьютеров, работающих под управлением ОС.
имхо, это какая-то уж слишком вольная трактовка того, как поведет себя программа для МК без ОС... в частности, для WinAVR поведение четко документировано: при "выходе" из main происходит запрет прерываний и зацикливание:

Код: Выделить всё

asm("cli");
asm('rjmp $");
что равносильно полной остановке работы микроконтроллера (хоть на самом деле ядро молотит в пустом цикле, для программиста это равносильно тому, что ядро остановлено).

думаю, аналогично поведет себя программа и из-под других компиляторов.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Стандартом языка это не задано, а потому я не вижу оснований твердо рассчитывать на такое положение. Вот и пример:

Код: Выделить всё

;>>>     133 void main(void)
;>>>     134 {
_main:
;>>>     135         InitDevices();
	RCALL _InitDevices
;>>>     136         while (1)
_0x3:
;>>>     137         {
;>>>     138             ++ucCounter;
	INC  R3
;>>>     139         };
	RJMP _0x3
;>>>     140 }
_0x6:
	RJMP _0x6
Никаких запретов прерываний.

Впрочем, K.C.A.-то я говорил совсем не об этом... :?
makser
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 24, 2009 11:25:34
Откуда: Rus

Сообщение makser »

У кого-нибудь есть версия 2хх Pro? Там есть тип double, он 8 байтный?
А то в моей проге требуется высокая точность float не хватает.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Yellow Tiger писал(а):Стандартом языка это не задано, а потому я не вижу оснований твердо рассчитывать на такое положение. Вот и пример:

Код: Выделить всё

;>>>     133 void main(void)
;>>>     134 {
_main:
;>>>     135         InitDevices();
	RCALL _InitDevices
;>>>     136         while (1)
_0x3:
;>>>     137         {
;>>>     138             ++ucCounter;
	INC  R3
;>>>     139         };
	RJMP _0x3
;>>>     140 }
_0x6:
	RJMP _0x6
Никаких запретов прерываний.

Впрочем, K.C.A.-то я говорил совсем не об этом... :?
не спорю, стандарт не рассматривает ситуацию, когда нет ОС, которая "вызывает" main - но ведь main тем не менее вызывается? значит, есть смысл рассчитывать на то, что хотя бы поведение программы будет соответствовать стандарту - с завершением функции main фактическое исполнение программы прекращается. в вашем коде видно, что начинается зацикливание, т.е. речи об "исполнении" мусора за закрывающей скобкой main не идет.

P.S. кстати, стандарт Си, на сколько я помню, требует, чтобы main возвращала int - а у вас void. т.е. выходит, ваш компилятор не соответствует стандарту? что ж тогда от него требовать? он тогда может и мусор исполнять...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
К.С.А
Грызет канифоль
Сообщения: 265
Зарегистрирован: Пн окт 27, 2008 22:55:45

Сообщение К.С.А »

Здравствуйте!
Огромное спасибо всем кто отозвался!

О пробелах я и сам догадался, еще за долго до того как решился обратится со своими бедами к вам. Но я хочу обойтись без них.

Вот эта конструкция
if () {
// вывод 1
} else {
// вывод 2
}
не должна находится в цикле, т. к. тогда выводимая информация мерцает из-за присутствия lcd_clear(void), а без него никак нельзя, потому что остаются хвосты от предыдущей надписи.
Я пробовал в условие
if ()
ставить "0" или "1" , а орпос PINA.0 выбрасывал из программы совсем, в результате все работает как надо.
Следовательно вся загвоздка в том что в переменную "а" не вписывается результат проверки PINA.0, или я ее неправильно делаю, или неправильно помещаю результат в "а".
Вот как раз по этому моменту и хотелось бы получить какие то разьяснения.
К стати всю проверку работоспособности я делаю прямо в железе, тоесть в тех условиях для которых программа и пишется.
Спасибо
С уважением Сергей.
Реклама
К.С.А
Грызет канифоль
Сообщения: 265
Зарегистрирован: Пн окт 27, 2008 22:55:45

Сообщение К.С.А »

Yellow Tiger писал;

А дальше начинается чехарда - процессорное ядро начинает читать и исполнять то, что записано в памяти программ сразу за вот этим местом: Код:
} // Это осталось от main.

Так ведь там вроде как ничего нету :shock: на этом программа заканчивается.
А перед прошивкой я обязательно стираю АТмегу.
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

Господа, подскажите пожалуйсат, как включить поддержку 32 битных переменных (log int, ATmega8), просдел три часа и немогу понять, больше 16 бит никак не фурычит. Пробовал в опцияй проекта C compiler, размер переменных "32", не помогает, наблюдал за переменными в протеусе!? :? Совсем не хочется писать функцию умножения и деления 32 битных чисел из 16 битных переменных.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

К.С.А писал(а):Так ведь там вроде как ничего нету :shock: на этом программа заканчивается.
Ты понимаешь смысл слова "заканчивается", можешь объяснить, что именно это означает? Рельсы заканчиваются? Генератор тактовых импульсов останавливается? Выполняется инструкция HALT? Ещё что-то? Там дальше - остаток памяти программ, в котором всегда что-нибудь записано, таким образом, либо нужно держать в функции main бесконечный цикл while(1), либо уделять внимание тому, что получается в памяти программ после последней инструкции main (на примере CvAVR и WinAVR уже видно, что могут быть разные варианты). Есть еще третий вариант - ничего не изучать и вечно доставать окружающих своими хрестоматийными "проблемами" (всё время одними и теми же), но этот вариант неинтересен:
'Золотой телёнок' писал(а):...ну, год ещё, ну - два, но потом ваши рыжие кудри примелькаются и вас попросту начнут бить.
ARV писал(а):в вашем коде видно, что начинается зацикливание, т.е. речи об "исполнении" мусора за закрывающей скобкой main не идет.
Это лишь еще один частный случай. Из двух проверенных компиляторов видны были два различных варианта - где гарантия, что для трёх компиляторов не будет три варианта, а для четырёх - четыре? Я говорил гражданину К.С.А о дисциплине программирования для м/к (не для какого-то конкретного компилятора), а значит, рассматривал только общие черты ситуации, общие - для любого компилятора.
ARV писал(а):кстати, стандарт Си, на сколько я помню, требует, чтобы main возвращала int - ...
Нет, не требует.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Yellow Tiger писал(а):
ARV писал(а):кстати, стандарт Си, на сколько я помню, требует, чтобы main возвращала int - ...
Нет, не требует.
цитирую ISO/IEC 9899:1999
5.1.2.2.1 Program startup
The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:
int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be used, as theyare local to the function in which theyare declared):
int main(int argc, char *argv[]) { /* ... */ }
or equivalent; or in some other implementation-defined manner.
укажите, пожалуйста, где сказано, что main может быть void - надо повысить свой образовательный уровень :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):укажите, пожалуйста, где сказано, что main может быть void
В последней строке цитаты, после точки с запятой.
vbvbvb
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт апр 24, 2009 14:15:50

CodeVisionAVR

Сообщение vbvbvb »

Сталкнулся с функцией rand() хочу узнать как она реализовывается в AVR. В stdlib.h написано следующее:

void srand(int seed)
{
_seed=seed;
}


int rand(void)
{
_seed=0x41C64E6D*_seed+30562;
#ifdef _ENHANCED_CORE_
#asm
movw r30,r22
andi r31,0x7F
#endasm
#else
#asm
mov r30,r22
mov r31,r23
andi r31,0x7F
#endasm
#endif
}

если кто сталкивался поясните плизз




никто не стал объяснять я сам разобрался
Последний раз редактировалось vbvbvb Ср окт 07, 2009 13:43:34, всего редактировалось 1 раз.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Yellow Tiger писал(а):
ARV писал(а):укажите, пожалуйста, где сказано, что main может быть void
В последней строке цитаты, после точки с запятой.
это речь о параметрах функции, а о типе было сказано ранее :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Из чего это следует?
...
Добавлено спустя 35 минут:
Вижу, ответ на последний вопрос вызвал затруднения.
Ну, что ж, бывает.
Так вот, слова "or in some other implementation-defined manner" относятся-таки не к параметрам функции main, а именно к её объявлению в целом, и чтобы найти тому подтверждение достаточно было прочесть еще несколько строк после процитированного пункта 5.1.2.2.1, буквально в третьей строке после него читаем:
Изображение
То есть, как ни крути, тип функции main может не только не быть int, но даже может быть несовместим с типом int.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

судя по всему, ISO-стандарты такие же однозначные, как и наши ГОСТы :))) я не усматриваю без дополнительных "толкований" указаний на то, что main может быть void. всюду по тексту указывается однозначно int... а неоднозначные места можно толковать по-разному. avr-gcc, который заявляет о совместимости с С99-стандартом, выдает warning на попытку сделать main не int. косвенно это подтверждает, что все же по стандарту в первую очередь int, а потом остальное. хотя, раз не запрещено (а вообще, что в Си запрещено?!) - то разрешено... и это огорчает...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

помогите найти место где я не врубаюсь!?
пишу:
unsigned int u,d5,d6;
unsigned long int uk;


u=565;
uk=u*256;
d5=uk/100;
d6=uk%100;
d4=sizeof(uk);
sprintf(lcd_buffer,"%u %u %u ",d5,d6,d4);
протеус пишет в ответ : "135 68 4"
по идее должно быть 565*256=144640, значит "1446 40 4" !???? А он принимает "uk" как двухбайтную переменную. Либо я совсем дурак, либо где то галочку надо поставить!? :?
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):а неоднозначные места можно толковать по-разному.
Не вижу ни малейшего шанса трактовать положение о том, что: "если тип функции main не является int, то ...(далее по тексту)", - как либо иначе, чем так, что эта самая функция может иметь и другие, не int типы.

И в этом свете становится очевидным, что другое изречение, гласящее, что функция main может быть определена так, эдак и (снова цитата) "in some other implementation-defined manner" означает именно возможность определять другой тип возвращаемого значения (в зависимости от условий реализации), а не другое задание типов параметров только.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ooogo писал(а):помогите найти место где я не врубаюсь!?
пишу:
unsigned int u,d5,d6;
unsigned long int uk;


u=565;
uk=u*256;
d5=uk/100;
d6=uk%100;
d4=sizeof(uk);
sprintf(lcd_buffer,"%u %u %u ",d5,d6,d4);
протеус пишет в ответ : "135 68 4"
по идее должно быть 565*256=144640, значит "1446 40 4" !???? А он принимает "uk" как двухбайтную переменную. Либо я совсем дурак, либо где то галочку надо поставить!? :?
для вывода длинного целого надо указывать спецификатор %ul наверное - во всяком случае для WinAVR именно так.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ooogo
Это не хвост, это антенна
Сообщения: 1306
Зарегистрирован: Вс янв 18, 2009 20:51:02

Сообщение ooogo »

Мне подсказали, надо было явное указание типа поставить!
uk=(long int)u*256;
Аватара пользователя
DIGITALCAT
Первый раз сказал Мяу!
Сообщения: 34
Зарегистрирован: Пт июн 05, 2009 13:59:20

Сообщение DIGITALCAT »

А ЕСТЬ у кого нибудь нормальноя версия которая в висте работает скинте плиз
Ответить

Вернуться в «AVR»