CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
ot011
Родился
Сообщения: 3
Зарегистрирован: Вт мар 16, 2010 21:06:24

Re: CodeVision AVR в вопросах и ответах

Сообщение ot011 »

Добрый вечер всем. Скажите пожалуйста. С входного порто контролера (например 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;
}
}
}
Он сохранит мне значения входа или нет?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 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 - ноль. Данные запишутся в массив, начиная со старшего бита первого элемента.
ot011
Родился
Сообщения: 3
Зарегистрирован: Вт мар 16, 2010 21:06:24

Re: CodeVision AVR в вопросах и ответах

Сообщение ot011 »

Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?
ot011
Родился
Сообщения: 3
Зарегистрирован: Вт мар 16, 2010 21:06:24

Re: CodeVision AVR в вопросах и ответах

Сообщение ot011 »

PINB&0x01 - вот эта команда указывает на обновление порта?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение AI_Disable »

ot011 писал(а):Спасибо. А не получиться так что он быстро запишет в массив все нули или еденицы? Или он будет ждать пока я кнопку нажму?

Не получиться. Подождёт.
ot011 писал(а):PINB&0x01 - вот эта команда указывает на обновление порта?

Это наложение маски. Через неё обращаемся к конкретному биту. Это тот же PINB.1, только на Си.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: CodeVision AVR в вопросах и ответах

Сообщение bobr25 »

Всем здравствуйте, подскажите пожалуйста как в CVAVR принудительно назначить, для символьного массива, диапазон адресов размещения его в памяти. Мне это нужно чтобы с ним работать как в Си, так и в ассемблерных вставках.
kapitaneo
Родился
Сообщения: 15
Зарегистрирован: Пн ноя 23, 2009 13:19:17

Re: CodeVision AVR в вопросах и ответах

Сообщение kapitaneo »

Всем здрасте. Подскажите пожалуйста как проще округлить число float до сотой.
Я использую так:
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 в вопросах и ответах

Сообщение Александр 071 »

Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки? :sleep:
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

Александр 071 писал(а):Добрый вечер. Скажите пожалуйста как лучше в CodeVision написать код (при помощи какой функции), который будет изменять частоту выходного сигнала микроконтролера при нажатии кнопки? :sleep:
лучше всего написать код при помощи функции void change_frequence_on_button_pressed(void) :))) только эту функцию вам самим придется написать :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Александр 071
Открыл глаза
Сообщения: 61
Зарегистрирован: Сб янв 24, 2009 19:00:08
Откуда: Волгоград
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение Александр 071 »

Ну хорошо. Тогда переформулирую вопрос. Как сделать так чтобы можно было регулировать частоту выходного сигнала с кнопки? Как написать функцию?
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение AI_Disable »

Лучше всего – не надо никакой функции. Включаем таймер в режим CTC и подключаем к нему выход OCnA(B). Если основной цикл программы забит, то обрабатываем нажатие кнопки через внешнее прерывание, где инкрементируем/декрементируем регистр сравнения – OCRnA(B), в противном случаи можно опрашивать кнопку в цикле.
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение 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"?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 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

точно так же работайте и с портами - это будет воспринято адекватно любым компилятором Си.

а вот почему у вас переменная не меняется - тут надо смотреть код, вами написанный, ибо причин для этого может быть много - от вашей ошибки до стандартного поведения компилятора.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение ELcat »

ARV, это очень удобно, а потому и хочется :) А насчёт того что строка "col=col*2+1;" не работала, скажу ещё больше хохму - CV AVR вообще не умножает, не делит и не сдвигает беззнаковую шестнадцатибитную переменную, даже warning выводит, где говорит что результатом шифтинга будет 0. Всё заработало сразу же, как только переменную переобозвал signed int`ом.
Может всё таки кто подскажет как привязать переменную к регистру?
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение 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

В зависимости от компилятора может быть разная эффективность полученного кода, но если это волнует меньше, чем удобство, флеша и скорости контроллера с запасом - то почему бы и не пользоваться? Это может быть вполне оправдано даже экономически.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: CodeVision AVR в вопросах и ответах

Сообщение 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 спрашивал как привязать переменную к регистру?
точно также, указав адрес регистра.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: CodeVision AVR в вопросах и ответах

Сообщение ARV »

avreal писал(а):
ELcat писал(а):ARV, это очень удобно, а потому и хочется :)
Ну тогда загляните в книжку по С и попробуйте битовые поля
...
В зависимости от компилятора может быть разная эффективность полученного кода, но если это волнует меньше, чем удобство, флеша и скорости контроллера с запасом - то почему бы и не пользоваться? Это может быть вполне оправдано даже экономически.
для WinAVR весьма эффективно работать с битовыми полями в регистровых переменных - во всяком случае ничуть не менее эффективно, чем с явным маскированием битов, сделанным вручную. но это, естественно, гораздо более наглядный способ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение ELcat »

avreal, похоже так и есть, это именно С-подобный компилятор для программирования КОНТРОЛЛЕРОВ :)) Я лично С не знаю, учился и работал на паскале, васике. Знакомство с микроконтроллерами началось на ассемблере, а там именно с битами и работают. С CV AVR начал осваивать С. Он совмещает некоторые удобства С и Ассемблера.

bobr25, сорри за бестолковый вопрос, а где именно можно найти эти самые адреса?
bobr25
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср мар 10, 2010 16:19:15

Re: CodeVision AVR в вопросах и ответах

Сообщение bobr25 »

в даташите,
регистры находятся в начале памяти,
тоесть можно даже так:

Код: Выделить всё

char a @2; // переменная а будет хранится в регистре R2 
char b @4; // переменная b  в регистре R4

и так далее, единственное обнаруженное НО если компилятор решил хранить другую переменную в нужном нам регистре, то он регистр не отдает, ругается варнингами, а в асме присваивает обе переменные к этому регистру. (это видимо потому, что я в готовом проекте пробовал, поэтому компилятор отказался трогать занятые им регистры)
Аватара пользователя
ELcat
Друг Кота
Сообщения: 3258
Зарегистрирован: Вт май 19, 2009 09:27:30
Откуда: Украина

Re: CodeVision AVR в вопросах и ответах

Сообщение ELcat »

Спасибо, подмогли, буду пробовать. Щас мучаю Mega16-ю и ls020b :)
Ответить

Вернуться в «AVR»