18.03.2010, 17:11
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
Я смотрю тема с установкой/сбросом продолжает жить своей жизнью
Вот кстати - в предыдущем посте отцитирована конструкция:
Код:
|
in temp,PORTA
andi temp 0b00010000
out PORTA ,temp |
Порождает ее что то типа:
Это по сути - групповой сброс разрядов в регистре и такая конструкция никак не сможет быть преобразована в команды сброса/установки бита. Ну и макроса выше для именно этого случая и нет Ну и вообще такие макросы слишком заточены именно под один разряд, а в жизни часто приходится оперировать группами разрядов. В результате будут по тексту перемешаны и макросы и (1‹‹bit0)|(1‹‹bit1) - ИМХО некрасиво.
|
|
|
|
19.03.2010, 00:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: на WinAVR + AVR Studio c CVAVR
Сообщение от ut1wpr
|
Я пишу в ИАРе. И пользуюсь такими макросами:
Код:
|
#define SETBIT(x,y) (x|=(1‹‹y))
#define CLRBIT(x,y) (x&=~(1‹‹y))
#define INVBIT(x,y) (x^=(1‹‹y))
#define CHKBIT(x,y) (x&(1‹‹y))
#define BITON(x,y) (x&(1‹‹y))
#define BITOFF(x,y) (!(x&(1‹‹y))) |
|
Мне кажется с макросами ОЧЕНЬ НЕУДОБНО. Гораздо удобнее писать с ИМЕНАМИ ножек... Привык на ассемблере писать с именами...
Я пишу для HITECH PICC16 и IAR AVR, одну программу под оба компилятора. Примерно под одинаковые кристаллы. Например под PIC12F675 и ATtiny13.
Пишу так:
Файл хидера: пишется под оба компилятора под разные МК.
Код:
|
//определим ножки для AVR
#ifdef __IAR_SYSTEMS_ICC_ //IAR AVR-------------------
#define pin_out 1 //направление ножки для вывода
#define pin_inp 0 //направление ножки для ввода
//сегменты АЛС
#define segmenta_dir DDRB_Bit0 //для направленния
#define segmenta_out PORTB_Bit0 //для вывода
//разряды АЛС
#define razrad0_dir DDRB_Bit0 //для направленния
#define razrad0_out PORTB_Bit0 //для вывода
//клавиши
#define key0_dir DDRB_Bit0 //для направленния
#define key0_inp PINB_Bit0 //для ввода
#endif
//определим ножки для PIC
#ifdef _HTC_H_ //HiTech PIC16--------------------
#define pin_out 0 //направление ножки для вывода
#define pin_inp 1 //направление ножки для ввода
//сегменты АЛС
#define segmenta_dir TRISB0 //для направленния
#define segmenta_out RB0 //для вывода
//разряды АЛС
#define razrad0_dir TRISB0 //для направленния
#define razrad0_out RB0 //для вывода
//клавиши
#define key0_dir TRISB0 //для направленния
#define key0_inp RB0 //для ввода
#endif |
Файл кода, уже не зависит каой компилятор и МК:
Код:
|
temp=0;
key0_dir=pin_inp; //конфигурируем ножку на ввод
if(key0_inp==0){temp= temp | 1;} //считываем состояние ножки в переменную темп
segmenta_dir =pin_out; //конфигурируем ножку на вывод
if(temp & 0x01==0){segmenta_out=0;}//выводим состояние на ножке =0
else{segmenta_out=1;} //выводим состояние на ножке =1 |
Думаю, что таким образом можно будет писать и для других МК, ARM итд... Дописывая хидеры.
Может быть покажется что компилируемый код слишком велик? Поверьте, десяток команд погоды не сделают. Зато гибкость переопределения ножек когда переносим какой либо модуль в новый проект. Если же нужно укоротить код и работать с целым портом а не с отдльными ножками, то пишем так:
хидер:
Код:
|
//определим ножки для PIC
#ifdef _HTC_H_ //HiTech PIC16--------------------
#define port_out 0x00 //направление ножки для вывода
#define port_inp 0xFF //направление ножки для ввода
#define SEGMENT_DIR TRISB //для направленния
#define SEGMENT_PORT RB //для вывода
#define KEYS_DIR TRISB //для направленния
#define KEYS_INP RB //для ввода
#endif
//определим ножки для AVR
#ifdef __IAR_SYSTEMS_ICC_ //IAR AVR-------------------
#define port_out 0xFF //направление ножки для вывода
#define port_inp 0x00 //направление ножки для ввода
#define SEGMENT_PORT PORTB //для вывода
#define SEGMENT_DIR TRISB //для направленния
#define KEYS_DIR TRISB //для направленния
#define KEYS_INP PINB //для ввода
#endif |
Теперь код СИ компилится короче, но мы всё равно работаем с именами.
Код:
|
KEYS_DIR=port_inp; //конфигурируем на ввод
TEMP_KEYS=KEYS_INP; //считываем состояние порта в переменную
SEGMENT_DIR=port_out; //конфигурируем на вывод
SEGMENT_PORT=stat_segments;//выводим состояние в порт из переменой |
Последний раз редактировалось picavr; 19.03.2010 в 00:52.
|
|
|
|
19.03.2010, 01:49
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
picavr, Да все верно , и биты обозвать проще именами и работать с ними типа :
И в ассемблере обоих микро есть бит ориентированные команды.
Но в С для стандарта /совместимости ( в старых компах , да и в новых нет таковых команд) приходится извращатся с логическими выражениями.
__________________
Осторожно , злой кот
|
|
|
|
19.03.2010, 05:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
Сообщение от dosikus
|
проще именами и работать с ними типа :
|
Да неудобно, в голове держать за что отвечает PIN_A,0. Удобно так:
Код:
|
LED_GREEN_INDICATOR_POWER=1; |
Сообщение от dosikus
|
Но в С для стандарта /совместимости ( в старых компах , да и в новых нет таковых команд) приходится извращатся с логическими выражениями.
|
Пишем для МК, а не компа. А какой компилятор для МК не понимает операции с портами?
Вот переменую BIN (понимает HITECH, не понимает IAR) лучше пользовать флаги в структурах.
|
|
|
|
19.03.2010, 10:22
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.05.2006
Адрес: Москва
Сообщений: 3,559
Сказал спасибо: 76
Сказали Спасибо 326 раз(а) в 230 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
1) ИМХО еще удобней
2) переменные типа BIT есть в CVAVR
__________________
Обучалка AVR PIC ARM начинающим программирование курс самоучитель шаг за шагом с нуля, CVAVR, PROTEUS, MPLAB, WinAVR, IAR, KEIL электроника - http://proavr.narod.ru
|
|
|
|
19.03.2010, 10:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,802
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
В соседней ветке есть вопрос по функции delay.
При больших задержках корректнее будет, наверное, выдерживать время с помощью таймера. Я обьявлял переменную, и при прерывании таймера увеличивал ее значение на единицу. В функции задержки подсчитывал нужное количество прерываний. А как это лучше сделать?
Компилятор WinAVR.
|
|
|
|
19.03.2010, 11:55
|
|
Вид на жительство
Регистрация: 03.05.2006
Сообщений: 312
Сказал спасибо: 30
Сказали Спасибо 144 раз(а) в 52 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
Я, признаться, прочитав название ветки, ожидал здесь увидеть что-то вроде "Как перенести программу из CVAVR в WinAVR" и необходимые для этого макросы или примеры преобразований.
Вместо этого нашел здесь филиал "ххх - это очень просто".
Жаль...
|
|
|
Сказали "Спасибо" EagleB3
|
|
|
19.03.2010, 13:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.02.2008
Сообщений: 1,802
Сказал спасибо: 124
Сказали Спасибо 602 раз(а) в 419 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
Насколько смог определить, одно из отличий CVAVR и WinAVR, это обращение к портам. В CVAVR например
PORTB.4=1;
а в WinAVR
PORTB |= (1‹‹4);
Если использовать макрос типа
#define sbi(reg, bit) (reg|= (1‹‹bit))
то в WinAVR будет
sbi(PORTB,4);
Это одно из отличий. Была бы небходимость, тогда можно и портировать.
Давайте проект попробуем совместно.
Последний раз редактировалось andries5; 19.03.2010 в 13:43.
|
|
|
|
19.03.2010, 17:07
|
|
Прописка
Регистрация: 05.02.2008
Сообщений: 251
Сказал спасибо: 34
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
Разобрался немного с AVR studio. Восторгу нет предела. Все очень удобно. Особенно понравилась работа с програмамтором и удобство работы с фьюзами. Все расписано нормальным языком, ошибиться очень тяжело.
Сообщение от andries5
|
В CVAVR например
PORTB.4=1;
|
Это конечно все очень удобно, но это отклонение от стандарта ANSI С и такие конструкции не способствуют переносимости программ.
Сообщение от andries5
|
а в WinAVR
PORTB |= (1‹‹4);
|
Тоже вроде удобно но зачем зря нагружать контроллер лишним сдвигом если можно сразу вписать нужное число прямым текстом
PORTB |= 16;
да нужно его рассчитать но с опытом прийдт и в программе будет меньше мусора.
Кстати нигде не нашел чтобы автор написал что в настройках AVR Studio нужно было прописать "include directory", по умолчанию то заголовочных файлов нет и студия должна их брать из библиотеки WINAVR.
|
|
|
|
19.03.2010, 17:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: На WinAVR + AVR Studio c CVAVR
Сообщение от Yegorvin
|
если можно сразу вписать нужное число прямым текстом
PORTB |= 16;
|
Никто не пишет (1‹‹4), а пишут например (1‹‹PB4). Сразу понятно что это такое. Или (1‹‹CS10) ну и т.п.
Сообщение от Yegorvin
|
Кстати нигде не нашел чтобы автор написал что в настройках AVR Studio нужно было прописать "include directory", по умолчанию то заголовочных файлов нет и студия должна их брать из библиотеки WINAVR.
|
А зачем студии заголовочные файлы? Она не является компилятором. Компилирует именно WinAvr, а ему прекрасно известно где находятся стандартные заголовки.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:16.
|
|