Страница 69 из 421
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт мар 16, 2010 21:16:34
ot011
Добрый вечер всем. Скажите пожалуйста. С входного порто контролера (например PORT.0) нужно записать последовательность нулей и еденичек которую задают нажатием кнопок, а потом эту последовательность выдать на выход. Если задать вот так вот:
while (1)
{
int MMM[64];
a=PINB.0;
b=PINB.1;
for (i=1;i<=64;i++)
{if (b=0)
MMM=a;
}
}
}
Он сохранит мне значения входа или нет?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 17, 2010 05:50:51
AI_Disable
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 в вопросах и ответах
Добавлено: Ср мар 17, 2010 16:10:37
ot011
Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 17, 2010 16:14:43
ot011
PINB&0x01 - вот эта команда указывает на обновление порта?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 17, 2010 16:47:34
AI_Disable
ot011 писал(а):Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?
Не получиться. Подождёт.
ot011 писал(а):PINB&0x01 - вот эта команда указывает на обновление порта?
Это наложение маски. Через неё обращаемся к конкретному биту. Это тот же PINB.1, только на Си.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср мар 17, 2010 18:06:49
bobr25
Всем здравствуйте, подскажите пожалуйста как в CVAVR принудительно назначить, для символьного массива, диапазон адресов размещения его в памяти. Мне это нужно чтобы с ним работать как в Си, так и в ассемблерных вставках.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 18, 2010 12:12:00
kapitaneo
Всем здрасте. Подскажите пожалуйста как проще округлить число float до сотой.
Я использую так:
Po1=P1*100;
Po1=(int)Pо1;
Po1=Po1/100;
если поместить все в строку не работает. Может можно как-то короче?
спасибо.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 18, 2010 19:48:36
Александр 071
Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки?

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 18, 2010 19:53:47
ARV
Александр 071 писал(а):Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки?

лучше всего написать код при помощи функции
void change_frequence_on_button_pressed(void) 
только эту функцию вам самим придется написать

Re: CodeVision AVR в вопросах и ответах
Добавлено: Чт мар 18, 2010 20:06:52
Александр 071
Ну хорошо. Тогда переформулирую вопрос. Как сделать так чтобы можно было регулировать частоту выходного сигнала с кнопки? Как написать функцию?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Пт мар 19, 2010 00:16:16
AI_Disable
Лучше всего – не надо никакой функции. Включаем таймер в режим CTC и подключаем к нему выход OCnA(B). Если основной цикл программы забит, то обрабатываем нажатие кнопки через внешнее прерывание, где инкрементируем/декрементируем регистр сравнения – OCRnA(B), в противном случаи можно опрашивать кнопку в цикле.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 20, 2010 15:21:41
ELcat
ValBag и AI_Disable спасибо что ответили. Код типа
"if(peremennay.1) {} //если первый бит равен лог. 1, то…
else{}
peremennay.1=1; //Записать лог. 1 в первый бит
peremennay.1=0; //Записать лог. 0 в первый бит"
CV не понимает, хотя те же операции с портами в\в и регистрами периферии делает. А не подскажете как привязать переменную к конкретному регистру общего назначения? И ещё вопрос, почему значение переменной не меняется в коде "col=col*2+1;" где "col" переменная типа "unsigned int"?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Сб мар 20, 2010 17:25:19
ARV
ELcat писал(а):peremennay.1=1; //Записать лог. 1 в первый бит
peremennay.1=0; //Записать лог. 0 в первый бит"
CV не понимает, хотя те же операции с портами в\в и регистрами периферии делает. А не подскажете как привязать переменную к конкретному регистру общего назначения? И ещё вопрос, почему значение переменной не меняется в коде "col=col*2+1;" где "col" переменная типа "unsigned int"?
вам уже говорили, что CVAVR для работы с портами использует нестандартную фичу, к которой лучше не привыкать. используйте стандартные для Си приемы:
Код: Выделить всё
#define bit(x) (1 << (x))
if(peremennaya & bit(2)) тра-та-та
peremennaya |= bit(3); // установить 3-й бит в 1
peremennaya &= ~bit(5); // сбросить 5-й бит в 0
точно так же работайте и с портами - это будет воспринято адекватно любым компилятором Си.
а вот почему у вас переменная не меняется - тут надо смотреть код, вами написанный, ибо причин для этого может быть много - от вашей ошибки до стандартного поведения компилятора.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 21, 2010 09:20:36
ELcat
ARV, это очень удобно, а потому и хочется

А насчёт того что строка "col=col*2+1;" не работала, скажу ещё больше хохму - CV AVR вообще не умножает, не делит и не сдвигает беззнаковую шестнадцатибитную переменную, даже warning выводит, где говорит что результатом шифтинга будет 0. Всё заработало сразу же, как только переменную переобозвал signed int`ом.
Может всё таки кто подскажет как привязать переменную к регистру?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 21, 2010 11:13:51
avreal
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 заняла один байт
Это стандартный С, который должен компилироватья всеми компиляторами, претендующими на право называться "компиляторами языка С". Имеем
именованные биты, что ещё удобнее, чем variable.0 Заодно можно получить разные длины полей, не только в один бит.
Код: Выделить всё
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 в вопросах и ответах
Добавлено: Вс мар 21, 2010 17:27:50
bobr25
Еще раз всем здравствуйте. Отвечу на свой же вопрос, может кому пригодится.
Итак, чтобы задать переменной, массиву или структуре определенный адрес в 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 спрашивал
как привязать переменную к регистру?
точно также, указав адрес регистра.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 21, 2010 17:48:27
ARV
avreal писал(а):ELcat писал(а):ARV, это очень удобно, а потому и хочется

Ну тогда загляните в книжку по
С и попробуйте битовые поля
...
В зависимости от компилятора может быть разная эффективность полученного кода, но если это волнует меньше, чем удобство, флеша и скорости контроллера с запасом - то почему бы и не пользоваться? Это может быть вполне оправдано даже экономически.
для
WinAVR весьма эффективно работать с битовыми полями в регистровых переменных - во всяком случае ничуть не менее эффективно, чем с явным маскированием битов, сделанным вручную. но это, естественно, гораздо более наглядный способ.
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 21, 2010 18:32:11
ELcat
avreal, похоже так и есть, это именно С-подобный компилятор для программирования КОНТРОЛЛЕРОВ

Я лично С не знаю, учился и работал на паскале, васике. Знакомство с микроконтроллерами началось на ассемблере, а там именно с битами и работают. С CV AVR начал осваивать С. Он совмещает некоторые удобства С и Ассемблера.
bobr25, сорри за бестолковый вопрос, а где именно можно найти эти самые адреса?
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вс мар 21, 2010 18:44:20
bobr25
в даташите,
регистры находятся в начале памяти,
тоесть можно даже так:
Код: Выделить всё
char a @2; // переменная а будет хранится в регистре R2
char b @4; // переменная b в регистре R4
и так далее, единственное обнаруженное НО если компилятор решил хранить другую переменную в нужном нам регистре, то он регистр не отдает, ругается варнингами, а в асме присваивает обе переменные к этому регистру. (это видимо потому, что я в готовом проекте пробовал, поэтому компилятор отказался трогать занятые им регистры)
Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт мар 23, 2010 20:18:09
ELcat
Спасибо, подмогли, буду пробовать. Щас мучаю Mega16-ю и ls020b
