CodeVision AVR в вопросах и ответах
Re: CodeVision AVR в вопросах и ответах
Добрый вечер всем. Скажите пожалуйста. С входного порто контролера (например PORT.0) нужно записать последовательность нулей и еденичек которую задают нажатием кнопок, а потом эту последовательность выдать на выход. Если задать вот так вот:
while (1)
{
int MMM[64];
a=PINB.0;
b=PINB.1;
for (i=1;i<=64;i++)
{if (b=0)
MMM[i]=a;
}
}
}
Он сохранит мне значения входа или нет?
while (1)
{
int MMM[64];
a=PINB.0;
b=PINB.1;
for (i=1;i<=64;i++)
{if (b=0)
MMM[i]=a;
}
}
}
Он сохранит мне значения входа или нет?
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
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++;
}
}}кнопка на PB.0 - еденица, PB.1 - ноль. Данные запишутся в массив, начиная со старшего бита первого элемента.
Re: CodeVision AVR в вопросах и ответах
Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?
Re: CodeVision AVR в вопросах и ответах
PINB&0x01 - вот эта команда указывает на обновление порта?
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
ot011 писал(а):Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?
Не получиться. Подождёт.
ot011 писал(а):PINB&0x01 - вот эта команда указывает на обновление порта?
Это наложение маски. Через неё обращаемся к конкретному биту. Это тот же PINB.1, только на Си.
Re: CodeVision AVR в вопросах и ответах
Всем здравствуйте, подскажите пожалуйста как в CVAVR принудительно назначить, для символьного массива, диапазон адресов размещения его в памяти. Мне это нужно чтобы с ним работать как в Си, так и в ассемблерных вставках.
Re: CodeVision AVR в вопросах и ответах
Всем здрасте. Подскажите пожалуйста как проще округлить число float до сотой.
Я использую так:
Po1=P1*100;
Po1=(int)Pо1;
Po1=Po1/100;
если поместить все в строку не работает. Может можно как-то короче?
спасибо.
Я использую так:
Po1=P1*100;
Po1=(int)Pо1;
Po1=Po1/100;
если поместить все в строку не работает. Может можно как-то короче?
спасибо.
Последний раз редактировалось kapitaneo Чт мар 18, 2010 20:50:20, всего редактировалось 1 раз.
-
Александр 071
- Открыл глаза
- Сообщения: 61
- Зарегистрирован: Сб янв 24, 2009 19:00:08
- Откуда: Волгоград
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки? 

- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
лучше всего написать код при помощи функции void change_frequence_on_button_pressed(void)Александр 071 писал(а):Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Александр 071
- Открыл глаза
- Сообщения: 61
- Зарегистрирован: Сб янв 24, 2009 19:00:08
- Откуда: Волгоград
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Ну хорошо. Тогда переформулирую вопрос. Как сделать так чтобы можно было регулировать частоту выходного сигнала с кнопки? Как написать функцию?
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Лучше всего – не надо никакой функции. Включаем таймер в режим CTC и подключаем к нему выход OCnA(B). Если основной цикл программы забит, то обрабатываем нажатие кнопки через внешнее прерывание, где инкрементируем/декрементируем регистр сравнения – OCRnA(B), в противном случаи можно опрашивать кнопку в цикле.
Re: CodeVision AVR в вопросах и ответах
ValBag и AI_Disable спасибо что ответили. Код типа
"if(peremennay.1) {} //если первый бит равен лог. 1, то…
else{}
peremennay.1=1; //Записать лог. 1 в первый бит
peremennay.1=0; //Записать лог. 0 в первый бит"
CV не понимает, хотя те же операции с портами в\в и регистрами периферии делает. А не подскажете как привязать переменную к конкретному регистру общего назначения? И ещё вопрос, почему значение переменной не меняется в коде "col=col*2+1;" где "col" переменная типа "unsigned int"?
"if(peremennay.1) {} //если первый бит равен лог. 1, то…
else{}
peremennay.1=1; //Записать лог. 1 в первый бит
peremennay.1=0; //Записать лог. 0 в первый бит"
CV не понимает, хотя те же операции с портами в\в и регистрами периферии делает. А не подскажете как привязать переменную к конкретному регистру общего назначения? И ещё вопрос, почему значение переменной не меняется в коде "col=col*2+1;" где "col" переменная типа "unsigned int"?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
вам уже говорили, что 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точно так же работайте и с портами - это будет воспринято адекватно любым компилятором Си.
а вот почему у вас переменная не меняется - тут надо смотреть код, вами написанный, ибо причин для этого может быть много - от вашей ошибки до стандартного поведения компилятора.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
ARV, это очень удобно, а потому и хочется
А насчёт того что строка "col=col*2+1;" не работала, скажу ещё больше хохму - CV AVR вообще не умножает, не делит и не сдвигает беззнаковую шестнадцатибитную переменную, даже warning выводит, где говорит что результатом шифтинга будет 0. Всё заработало сразу же, как только переменную переобозвал signed int`ом.
Может всё таки кто подскажет как привязать переменную к регистру?
Может всё таки кто подскажет как привязать переменную к регистру?
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
Точно?ELcat писал(а):А насчёт того что строка "col=col*2+1;" не работала, скажу ещё больше хохму - CV AVR вообще не умножает, не делит и не сдвигает беззнаковую шестнадцатибитную переменную, даже warning выводит, где говорит что результатом шифтинга будет 0. Всё заработало сразу же, как только переменную переобозвал signed int`ом.
Нет, ну я так давно по подобным обсуждениям вижу, что CVAVR - это не компилятор языка С. Это компилятор "С-подбного языка программирования".
Но аж такого не ожидал.
Чего вы все продолжаете жрать этот кактус?
Ну тогда загляните в книжку по С и попробуйте битовые поля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В зависимости от компилятора может быть разная эффективность полученного кода, но если это волнует меньше, чем удобство, флеша и скорости контроллера с запасом - то почему бы и не пользоваться? Это может быть вполне оправдано даже экономически.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Re: CodeVision AVR в вопросах и ответах
Еще раз всем здравствуйте. Отвечу на свой же вопрос, может кому пригодится.
Итак, чтобы задать переменной, массиву или структуре определенный адрес в RAM
достаточно после объявления переменной или массива поставить символ @ и следом начальный адрес.
Нашлось это в справке к CVAVR
вот примеры из нее
Оказывается надо читать справку!
Кстати ELcat спрашивал как привязать переменную к регистру?
точно также, указав адрес регистра.
Итак, чтобы задать переменной, массиву или структуре определенный адрес в RAM
достаточно после объявления переменной или массива поставить символ @ и следом начальный адрес.
Нашлось это в справке к CVAVR
Код: Выделить всё
/* 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;Оказывается надо читать справку!
Кстати ELcat спрашивал как привязать переменную к регистру?
точно также, указав адрес регистра.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: CodeVision AVR в вопросах и ответах
для WinAVR весьма эффективно работать с битовыми полями в регистровых переменных - во всяком случае ничуть не менее эффективно, чем с явным маскированием битов, сделанным вручную. но это, естественно, гораздо более наглядный способ.avreal писал(а):Ну тогда загляните в книжку по С и попробуйте битовые поляELcat писал(а):ARV, это очень удобно, а потому и хочется
...
В зависимости от компилятора может быть разная эффективность полученного кода, но если это волнует меньше, чем удобство, флеша и скорости контроллера с запасом - то почему бы и не пользоваться? Это может быть вполне оправдано даже экономически.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: CodeVision AVR в вопросах и ответах
avreal, похоже так и есть, это именно С-подобный компилятор для программирования КОНТРОЛЛЕРОВ
Я лично С не знаю, учился и работал на паскале, васике. Знакомство с микроконтроллерами началось на ассемблере, а там именно с битами и работают. С CV AVR начал осваивать С. Он совмещает некоторые удобства С и Ассемблера.
bobr25, сорри за бестолковый вопрос, а где именно можно найти эти самые адреса?
bobr25, сорри за бестолковый вопрос, а где именно можно найти эти самые адреса?
Re: CodeVision AVR в вопросах и ответах
в даташите,
регистры находятся в начале памяти,
тоесть можно даже так:
и так далее, единственное обнаруженное НО если компилятор решил хранить другую переменную в нужном нам регистре, то он регистр не отдает, ругается варнингами, а в асме присваивает обе переменные к этому регистру. (это видимо потому, что я в готовом проекте пробовал, поэтому компилятор отказался трогать занятые им регистры)
регистры находятся в начале памяти,
тоесть можно даже так:
Код: Выделить всё
char a @2; // переменная а будет хранится в регистре R2
char b @4; // переменная b в регистре R4 и так далее, единственное обнаруженное НО если компилятор решил хранить другую переменную в нужном нам регистре, то он регистр не отдает, ругается варнингами, а в асме присваивает обе переменные к этому регистру. (это видимо потому, что я в готовом проекте пробовал, поэтому компилятор отказался трогать занятые им регистры)
Re: CodeVision AVR в вопросах и ответах
Спасибо, подмогли, буду пробовать. Щас мучаю Mega16-ю и ls020b 