Страница 1 из 421

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

Добавлено: Сб мар 17, 2007 12:30:55
Tohey
Надо типа массив для чтения, массив констант и что бы находился в программной памяти. На асме я делал так:
mas:
.db 1, 3, 5

Наверное, в CVAVR надо так,
flash unsigned char mas[] = {1,3,5}; ?

Добавлено: Сб мар 17, 2007 12:44:16
Aheir
Да. верно, надо использовать слово flash

Добавлено: Сб мар 17, 2007 13:42:31
Tohey
А есть в си функции для преобразования в 10тичную систему?

Добавлено: Сб мар 17, 2007 14:27:23
Abaktyсh
в CVAVR есть - посмотри в хелпе "BCD" типа. библиотека BCD.H

Добавлено: Сб мар 17, 2007 17:55:05
Tohey
Я ищу для 4 байтных значений, немного написал, но кода добавилось аж на 1К! :cry:
Мне нужно преобразовать 2-4байтное значение для вывода на 5 светодиодных индикаторов

Добавлено: Сб мар 17, 2007 18:28:54
Abaktyсh
Для преобразования числа в строку есть itoa() и ltoa()

Добавлено: Сб мар 17, 2007 18:43:05
Aheir
А как уВАс устроена функция вывода на индикаторы?

Я часто использую конструкцию типа

print (a, b, c, d, e, t),

где a..e - выводимые символы, t - время их отображения, мс.
Внутри функции используется switch для выбора отправляемого на индикатор кода.
Если надо вывести несколько разрядов переменной temp,
использую
a=temp/100 для вывода сотен
b=temp%100/10 для вывода десятков
с=temp%100%10 для вывода единиц
при этом case с номером 0..9 должен давать код соответствующей цифры

Добавлено: Вс мар 18, 2007 11:09:51
Tohey
Я так вывожу:
PORTD = 0b11111110;
j = digit[i];
PORTB = DcMatrix[j];
delay_ms(30);
(для одного символа)

Добавлено: Пн мар 19, 2007 11:16:55
Aheir
Пожалуй, проще всего будет деление...
А зачем такая большая задержка - 30ms?

Добавлено: Пн мар 19, 2007 14:43:05
Tohey
А зачем такая большая задержка - 30ms?

Я ещё не налаживал

Добавлено: Ср мар 21, 2007 06:50:16
Mamonth
Aheir писал(а):Пожалуй, проще всего будет деление...
А зачем такая большая задержка - 30ms?

А такой момент: в AVR-ах нет команды деления. Так что этот момент немного не удачен, но на практике все решается через BCD или деления, но немного не так. ))

Добавлено: Ср мар 21, 2007 08:09:19
Aheir
В общем-то, я это понимаю, но иногда вполне можно использовать, орсобенно когда ресурсы есть и быстродействия хватает.. :wink:
А Ваш вариант?

Добавлено: Ср мар 21, 2007 09:45:23
Abaktyсh
Mamonth писал(а):в AVR-ах нет команды деления.


Деление это умножение на число в степени -1. Удобно делать на Си вычисления.

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

Добавлено: Сб июн 16, 2007 13:11:31
Negor
Начал заниматся изучением ШИМ и столкнулся вот с такой проблемой. При настройке таймера пользовался конструкциец тима TCR0A=1<<WGM00 и подобными. КодВижн выдал сообщение о неизвестности WGM00. Просмотр tinyn2313.h (девайс собран на Attony2313) показал что нет зарезервированных слов названий битов таймеров(др. названий битов там тоже нет). После пересадки из tn2313def.inc (такие же библиотекаи только с АВРСттудио) (естесствено с заменой .equ на #define) компилятор выдаёт ошибку "must be lvalue" и подсвечивает строку TCR0A=1<<WGM00. Я бы может и не сильно страдал, но в шестнадцатиричн. формате устанавливать биты в регистрах не удобно, а в двоичном формате надо выкидывать зарезервированные биты(допустим из восьми зарезервирован бит 3 и 4(отсчёт с 0), тогда установка 0b00000001 катит а при записи 0b01000001 уже нет реакции на установленный бит 6). Помогите разобратся

Re: Вопрос по CodeVision

Добавлено: Сб июн 16, 2007 15:08:51
Барсик
Negor писал(а):...а в двоичном формате надо выкидывать зарезервированные биты(допустим из восьми зарезервирован бит 3 и 4...

Извините, но я не въехал насчёт зарезервированных битов. В регистре TCR0A зарезервированы биты 2 и 3. Они контроллером не используются вообще, и никуда их выкидывать не надо. Вместо них можно спокойно прописывать нули. От этого контроллеру не будет ни горячо и не холодно...

Ели же речь идёт о том, как изменить определённые биты в регистре, а остальные при этом не трогать, то тогда надо применять логические операции "И", если биты надо установить в "0", или "ИЛИ", если биты надо установить в "1" . Например, так:

ACSR &= 0B11110111; //запретить прерывания от аналог. компаратора (устанавливаем бит 3 в "0", а остальные не трогаем)
ACSR |= 0B10000000; // выключить аналог. компаратор, чтоб не жрал энергию (устанавливаем бит 7 в "1", а остальные не трогаем)

Оператор &= означает, что надо считать значение из регистра, сделать с ним и указанным операндом операцию "И" и присвоить результат обратно этому регистру.

Оператор |= аналогично для "ИЛИ".

Добавлено: Сб июн 16, 2007 16:42:20
Negor
Ну для установки битов мне нравится больше контрукция вроде TCR0A|=1<<WGM,
А то что вы спрашивали(т.е. я спрашивал а вы процитировали) вобщем забил я в TCR0A что-то вроде 0b01100001 кажется так... а в отладчике установился только первый бит(Пользуюсь АВРстудио), а когда записал в шестнацатиричном всё заработало... вот так вот

Re: CodeVision : Просто вопрос

Добавлено: Сб июн 16, 2007 23:05:40
tych
Negor писал(а):КодВижн выдал сообщение о неизвестности WGM00. Просмотр tinyn2313.h (девайс собран на Attony2313) показал что нет зарезервированных слов названий битов таймеров(др. названий битов там тоже нет).


Я просто дополнительный хидер .h сделал с названиями битов.
В моем профиле линк.

Re: CodeVision : Просто вопрос

Добавлено: Сб июн 16, 2007 23:13:47
Negor
tych писал(а):
Negor писал(а):КодВижн выдал сообщение о неизвестности WGM00. Просмотр tinyn2313.h (девайс собран на Attony2313) показал что нет зарезервированных слов названий битов таймеров(др. названий битов там тоже нет).


Я просто дополнительный хидер .h сделал с названиями битов.
В моем профиле линк.


Так я тоже делал *.h файл где забивал названия битов к их номерам. в результате получал "must be lvalue".... и самое отвратительное - нет никаких справок по ошибкам

Добавлено: Вс июн 17, 2007 00:13:01
tych
CVAVR 2.03.4 без коклюша и ветрянки !

там же: ШАБЛОН-заготовка - НАСТРОЕНЫЕ проекты для быстрого начала работы в CVAVR PROTEUS WinAVR VMLAB

CodeVisionAVR 1.25.8 2007-12

Изображение

===========

заголовки удобно брать из ICC или IAR

Вот вам .h для attiny2313 из ICC

Скопируйте из него определения битов в заголовок CVAVR.

Добавлено: Вс июн 17, 2007 22:52:13
Negor
Спасибо тов. tych! Единственное что меня смущает - это то, что INT0 и INT1 были переназначены(was redefined) но это я думаю говорит только о том что и в либе родной CodeVision забиты эти биты и в вашей(от вас)... но я надеюсь они не покусаются :)) Просмотрел я приведённый вами Либ и понял что забиты они в 16-ричном формате как беззначные на один байт(char занимает же один байт,так?)... только не понял что означает volitile и не могу понять зачем звёздочки(знаю что связано с понятием "указатель")... вы мне разъясните окончательно, пожалуйста, а то не комфортно изучать дальше не разобравшись.... заранее большое спасибо :roll: