1. Насколько я знаю, в gcc-подобных компиляторах char-ы и так выравниваются по одному байту. То есть, если в структуре только char-ы, то они будут идти в памяти один за другим и без подобных ухищрений
2. 1) ага
2) ага
В схеме участвует тройной 7ми сегментный индикатор с общим анодом, поэтому зажигание происходит при сброшенном бите в порту. ДУмаю, не вам рассказывать.
По моим ожиданиям огонек должен бегать по a-b-c-d-e-f. Фактически же его маршрут a-b-c-f Оо Что-то я явно упускаю из вида, но что - не пойму. Подскажите, плз...
Последний раз редактировалось Мikа Вт май 28, 2013 11:53:52, всего редактировалось 1 раз.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Мikа писал(а):А что же тогда происходит с числом при 1<<PORTB?
Как и написано, единичка сдвигается влево на количество разрядов, записанное в PORTB. Т.е. первый раз получается двойка, второй - четверка, в третий - фигня ( сдвиг на восемь битов при операции над байтом - операция бессмысленная)
shads писал(а):А вы заставьте это сказать того кто после Си пытается АСМ освоить ....
Хм... и в чём здесь прикол???
... Си-шник всегда напишет 0xFF вместо 0b11111111, и накатает макросов из любви к #define, чтобы сократить писанину . Неприязнь будет вызывать необходимость делать многие вещи "ручками", вместо того что бы взять готовую либу ....
А причём тут printf ? Деление с остатком не пойдёт ?
Ну я же могу написать что-то вроде sprintf(buf, "%02f", var), только сколько на это уйдет памяти МК? Деление с остатком вполне подойдёт, подскажете алгоритм?
Число обязательно должно быть вещественным ? В МК вообще лучше избегать вещественной арифметики.
целая часть получается присваиванием вещественного целому достаточной длины, а потом вычисляется дробная достаточной точности.
/* как пример */
long part1, part2;
float source = -66780.015;
char buf[20], *pp;
part1 = source;
part2 = labs((source - part1 + (part1>0 ? 0.00501 : -0.00501)) * 100); /* 100 - два знака после запятой */
pp=buf;
if(part1==0 && source<0) *pp++='-';
ltoa(part1, pp, 10);
strcat(buf, ".");
pp = buf + strlen(buf);
if(part2<10) *pp++='0'; /* зависит от точности, для более двух знаков нужно более сложный код */
ltoa(part2,pp,10);
/* Ну у теперь в buf сформирована строка и с ней можно что угодно делать */
puts(buf);
ltoa я брал за образец itoa из Кернигана, если есть в используемой среде в библиотеках, то тоже неплохо. В любом случае расход памяти вообще минимален, по сравнению с использованием sprintf
Присваиваю OCR0 значение 255 а он всеравно остается равным 0, в чем проблема ?
И еще в цикл while(OCR0 != 0xff) вы полняется не 255 раз а гораздо больше, как такое может быть, регистр 8-битный же ?
P.S. проблема решена, спасибо за 'помощь' , возможно ктонибуть подскажет более более качественую реализацию задания ?
Последний раз редактировалось aleksandr5rikin Ср май 29, 2013 17:49:44, всего редактировалось 4 раза.