Код: Выделить всё
addr &= (~3);
Можно так, но фишка была в точке с запятой.
Код: Выделить всё
(addr ~3 ) Код: Выделить всё
addr =(~3 )& addr; почему 3 бита? причем здесь выравнивание?Твори бобро писал(а):Я так понял что "~3" это тупо выравнивание на 4 байта;
.....
надо сбросить 3 младших бита, тем самым получим выравнивание адреса на 32 бита.
Код: Выделить всё
addr &=~3;vitalik_1984 писал(а):и какой же результат у этого выражения?Код: Выделить всё
(addr ~3 )
может все таки вот так?
Код: Выделить всё
addr =(~3)&addr;
ibiza11 писал(а):почему 3 бита? причем здесь выравнивание?
Cheba писал(а):Всё правильно, это выравнивание на границу 32-битного слова. Некоторые операции требуют такого выравнивания.
В этой строке переменной PORTD всегда будет присваиваться значение 255 (двоичное 11111111) независимо от того, каким было прежнее значение переменной и с какой константой перед этим выполнялась операция "побитовое И". Результат операции "ИЛИ", когда один из операндов равен 1, всегда 1, независимо от значения второго операнда. Вряд ли это именно то, что Вам нужно в данном случае.igorka писал(а):PORTD = (PORTD & 0xCF) | (255);
ответ: всё. Опишите словами, что именно нужно сделать, и я покажу, как это сделать.igorka писал(а):Этим кодом управляю катодом семисегментника напрямую с порта , а мне необходимо его инвертировать , т.е. в порт посылать не "0" а "1" .Что необходимо изменить?
Код: Выделить всё
PORTD = ~ 0xCF;Именно эти вопросы очень хорошо описаны у Кернигана-Ритчи (хоть книга и не ориентирована на специфику микроконтроллеров, но в данном случае этой специфики нет, обычная побитовая логика). Может, есть буквари и попроще, но первоисточник все равно предпочтительнее.igorka писал(а):Может посоветуете книжечку почитать по "СИ" для микроконтроллеров (читаю книгу Керниган.Ричи.Но не то пальто ,ориентируется для другого , учится на ней трудновато)
Ставим плюсы: )
Код: Выделить всё
#include<avr/io.h>
#define F_CPU 1200000UL
#include<util/delay.h>
int main(void)
{
unsigned long lfsr = 1;
unsigned char temp;
DDRB = 0xff;
while(1)
{
lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xd0000001u);
temp = (unsigned char) lfsr;
DDRB = ~temp;
PORTB = temp;
temp = (unsigned char) (lfsr >> 24);
_delay_loop_2(temp<<7);
}
}Код: Выделить всё
unsigned long lfsr = 1;Код: Выделить всё
lfsr >> 1Код: Выделить всё
lfsr & 1uКод: Выделить всё
-(lfsr & 1u)Не все так просто (уже сама фраза "беззнаковое число меняет знак" должна насторожить).baron_P писал(а):Дальше делается это, т.е. беззнаковое 32-х битное число меняет знак.Код: Выделить всё
-(lfsr & 1u)
Зависит от реализации. Например, стандарт ISO/IEC 9899:1999 в п. 6.2.6.2 Integer types предлагает следующие варианты представления отрицательных величин:baron_P писал(а):При этом просто инвертируется старший бит, а тип полученного числа остается unsigned long?
В данном случае сам кристалл (и соответственно "ихний C" (C), предположительно WinAVR) поддерживает "дополнение до двух", но лучше все-таки не закладываться на особенности реализации вроде поразрядного представления чисел и/или endianness. Для этой задачи найдется способ решения гораздо корректнее, если сформулирете, что именно хотели получить (инверсию старшего бита?).2. For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. There need not be any padding bits; there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as the same bit in the object representation of the corresponding unsigned type (if there are M value bits in the signed type and N in the unsigned type, then M <= N). If the sign bit is zero, it shall not affect the resulting value. If the sign bit is one, the value shall be modified in one of the following ways:
— the corresponding value with sign bit 0 is negated (sign and magnitude);
— the sign bit has the value -(2N) (two’s complement);
— the sign bit has the value -(2N - 1) (one’s complement).
Which of these applies is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for one’s complement), is a trap representation or a normal value. In the case of sign and magnitude and one’s complement, if this representation is a normal value it is called a negative zero.
А это уже называется лень-матушка:baron_P писал(а):2. Что является аргументом для _delay_loop_2()? Это задержка в каких то долях от тактовой частоты?
22.28.2.2 void _delay_loop_2 (uint16_t __count)
Delay loop using a 16-bit counter __count, so up to 65536 iterations are possible. (The value 65536 would have to be passed as 0.) The loop executes four CPU cycles per iteration, not including the overhead the compiler requires to setup the counter register pair.
Thus, at a CPU speed of 1 MHz, delays of up to about 262.1 milliseconds can be achieved.
Арифметика тут простая:baron_P писал(а):При 1 МГц цпу и 65536 итерациях, задержка будет 262,1 мс. Смущают какие-то не слишком привязанные к двоичным порядкам числа (кроме 65536), потому и хотел уточнить.
4 цикла * 65536 итераций дают те самые 262144, что при длительности цикла 1 мкс равно 262 с копейками миллисекундам.The loop executes four CPU cycles per iteration
Код: Выделить всё
-(lfsr & 1u) & 0xd0000001u