while (1)
{
int MMM[64];
a=PINB.0;
b=PINB.1;
for (i=1;i<=64;i++)
{if (b=0)
MMM=a;
}
}
}
Он сохранит мне значения входа или нет?
Нет. Вообще непонял логику работы вашего кода.ot011 писал(а): Он сохранит мне значения входа или нет?
Код: Выделить всё
unsigned char mem[16], count, i;
void main(void)
{
while(1)
{
if(PINB&0x01)
{
mem[i]|=0x01;
mem[i]<<=1;
count++;
}
if(PINB&0x02)
{
mem[i]<<=1;
count++;
}
if(count==7 && i<15)
{
count=0;
i++;
}
}}Не получиться. Подождёт.ot011 писал(а):Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?
Это наложение маски. Через неё обращаемся к конкретному биту. Это тот же PINB.1, только на Си.ot011 писал(а):PINB&0x01 - вот эта команда указывает на обновление порта?
лучше всего написать код при помощи функции void change_frequence_on_button_pressed(void)Александр 071 писал(а):Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки?
вам уже говорили, что CVAVR для работы с портами использует нестандартную фичу, к которой лучше не привыкать. используйте стандартные для Си приемы:ELcat писал(а):peremennay.1=1; //Записать лог. 1 в первый бит
peremennay.1=0; //Записать лог. 0 в первый бит"
CV не понимает, хотя те же операции с портами в\в и регистрами периферии делает. А не подскажете как привязать переменную к конкретному регистру общего назначения? И ещё вопрос, почему значение переменной не меняется в коде "col=col*2+1;" где "col" переменная типа "unsigned int"?
Код: Выделить всё
#define bit(x) (1 << (x))
if(peremennaya & bit(2)) тра-та-та
peremennaya |= bit(3); // установить 3-й бит в 1
peremennaya &= ~bit(5); // сбросить 5-й бит в 0Точно?ELcat писал(а):А насчёт того что строка "col=col*2+1;" не работала, скажу ещё больше хохму - CV AVR вообще не умножает, не делит и не сдвигает беззнаковую шестнадцатибитную переменную, даже warning выводит, где говорит что результатом шифтинга будет 0. Всё заработало сразу же, как только переменную переобозвал signed int`ом.
Ну тогда загляните в книжку по С и попробуйте битовые поляELcat писал(а):ARV, это очень удобно, а потому и хочется
Код: Выделить всё
typedef struct {
unsigned char mode0 : 1,
mode1 : 1,
up : 1,
high : 1;
} flags_t;
flags_t f;
unsigned char foo()
{
f.mode0 = 1;
f.up = 0;
return f.mode1;
}Код: Выделить всё
.global foo
.type foo, @function
foo:
lds r24,f
ori r24,lo8(1) ; f.mode0 = 1;
andi r24,lo8(-5) ; f.up = 0;
sts f,r24
; return f.mode1;
lsr r24
andi r24,lo8(1)
ldi r25,lo8(0)
ret
.size foo, .-foo
.comm f,1,1 ; переменная f заняла один байтКод: Выделить всё
typedef struct {
unsigned cnt0 : 4,
cnt1 : 3,
mode : 1; // в одном байте 4-битная переменная, 3-битная переменная и однобитный флаг
} cnt_t;
cnt_t c;
unsigned foo()
{
if(c.mode) {
++c.cnt0;
} else {
c.cnt1 += 3;
}
return c.cnt0;
}Код: Выделить всё
foo:
lds r25,c
sbrs r25,7
rjmp .L2
mov r24,r25
subi r24,lo8(-(1))
andi r24,lo8(15)
andi r25,lo8(-16)
rjmp .L5
.L2:
mov r24,r25
swap r24
andi r24,lo8(15)
subi r24,lo8(-(3))
andi r24,lo8(7)
swap r24
andi r24,lo8(-16)
andi r25,lo8(-113)
.L5:
or r25,r24
sts c,r25
lds r24,c
andi r24,lo8(15)
ldi r25,lo8(0)
retКод: Выделить всё
/* the integer variable "a" is stored
in RAM at address 80h */
int a @0x80;
/* the structure "alfa" is stored
in RAM at address 90h */
struct s1 {
int a;
char c;
} alfa @0x90;для WinAVR весьма эффективно работать с битовыми полями в регистровых переменных - во всяком случае ничуть не менее эффективно, чем с явным маскированием битов, сделанным вручную. но это, естественно, гораздо более наглядный способ.avreal писал(а):Ну тогда загляните в книжку по С и попробуйте битовые поляELcat писал(а):ARV, это очень удобно, а потому и хочется
...
В зависимости от компилятора может быть разная эффективность полученного кода, но если это волнует меньше, чем удобство, флеша и скорости контроллера с запасом - то почему бы и не пользоваться? Это может быть вполне оправдано даже экономически.
Код: Выделить всё
char a @2; // переменная а будет хранится в регистре R2
char b @4; // переменная b в регистре R4