реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Разница CodeVision и WinAVR
virtuality
сообщение Jul 22 2006, 10:15
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190



Гребаные идентификаторы....

Как просто было в CodeVision : PORTD.1=1; DDRD=1;
Пытаюсь в WinAVR сделать - достал примерно следующий код:

Код
  DDRD  &= ~(_BV(PD2));                            // Назначаем 2-ю линию порта D на вход
  PORTD |=  (_BV(PD2));                            // подключаем "подтягивающий" резистор


Нельзя ли попроще как-нибудь?


И еще вопрос - инициализирую АЦП - выдает беспорядочные хаотичные цифры. Понятно, что дело в том, что ловятся шумы. Вылечил резистором 4,7 кОм на питание. А как-нить программно нельзяли?
Go to the top of the page
 
+Quote Post
ksv198
сообщение Jul 22 2006, 12:30
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 177
Регистрация: 25-08-05
Из: Ставрополь
Пользователь №: 7 964



Цитата(virtuality @ Jul 22 2006, 14:15) *
Гребаные идентификаторы....

Как просто было в CodeVision : PORTD.1=1; DDRD=1;
Пытаюсь в WinAVR сделать - достал примерно следующий код:

Код
  DDRD  &= ~(_BV(PD2));                            // Назначаем 2-ю линию порта D на вход
  PORTD |=  (_BV(PD2));                            // подключаем "подтягивающий" резистор


Нельзя ли попроще как-нибудь?

Например так:

Код
//определяем частые действия
#define cs_active   PORTD &=~(_BV(PD2))
#define cs_inactive   PORTD |=_BV(PD2)
...

//используем
cs_active;

...

cs_inactive;
...


Не панацея, но хоть немного легче smile.gif
Go to the top of the page
 
+Quote Post
niccom
сообщение Jul 22 2006, 12:34
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-06-05
Пользователь №: 5 868



Цитата(virtuality @ Jul 22 2006, 14:15) *
Гребаные идентификаторы....

Как просто было в CodeVision : PORTD.1=1; DDRD=1;
Пытаюсь в WinAVR сделать - достал примерно следующий код:

Код
  DDRD  &= ~(_BV(PD2));                            // Назначаем 2-ю линию порта D на вход
  PORTD |=  (_BV(PD2));                            // подключаем "подтягивающий" резистор


Нельзя ли попроще как-нибудь?


конечно можно
вот так тоже будет работать
DDRD &= ~_BV(PD2);
PORTD |= _BV(PD2);
а в чем проблема то?
с логическими операциями?
Go to the top of the page
 
+Quote Post
xemul
сообщение Jul 22 2006, 14:20
Сообщение #4



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Код
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
bitclr(DDRD, PD2);
bitset(PORTD, PD2);


Или ввести свой тип, например, так:
Код
typedef mytype
union
{
   uchar i;
   struct
   {
      uchar _0: 1;
      uchar _1: 1;
      ...
   } b;
}

и переопределить все потребные регистры
Go to the top of the page
 
+Quote Post
pitt
сообщение Jul 22 2006, 16:13
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Разница CodeVision и WinAVR в том, что один пакет это IDE, предназначенное для тех, кто не является профессиональным software engineer, а другой именно пакет утилит для профессионалов или тех, кто на пути в этом направлении.

Сообщение отредактировал pitt - Jul 22 2006, 16:14


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
Laksus
сообщение Jul 22 2006, 16:39
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Цитата
xemul
#define bitset(var,bitno) ((var) |= 1 << (bitno))
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
bitclr(DDRD, PD2);
bitset(PORTD, PD2);

И еще можно добавить
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))
(Application Note "AVR035: Efficient C Coding for AVR")
______________

Извиняюсь, что влезаю со своим вопросом, но по моему он по этой теме.
Вопрос по поводу дефайнов в файлах io*.h в WinAVR.

Понятно использование имен бит типа:
/* UCSRA */
#define RXC 7
#define TXC 6 ...и так далее.

Понятно применение имен для адресов PINx, DDRx, PORTx.

Но не может ли кто нибудь объяснить какой смысл в
именовании бит в портах:
/* PORTD */
#define PD7 7
...
/* DDRD */
#define DDD7 7
...
/* PIND */
#define PIND7 7
...
Чем это лучше чем указывать биты портов просто цифрами?
По моему писать больше, а от ошибок не помогает.
__________
Александр
2006 07 22

Сообщение отредактировал Laksus - Jul 22 2006, 16:42
Go to the top of the page
 
+Quote Post
xemul
сообщение Jul 22 2006, 17:38
Сообщение #7



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(Laksus @ Jul 22 2006, 20:39) *
Понятно использование имен бит типа:
/* UCSRA */
#define RXC 7
#define TXC 6 ...и так далее.

Понятно применение имен для адресов PINx, DDRx, PORTx.

Но не может ли кто нибудь объяснить какой смысл в
именовании бит в портах:
/* PORTD */
#define PD7 7
...
/* DDRD */
#define DDD7 7
...
/* PIND */
#define PIND7 7
...
Чем это лучше чем указывать биты портов просто цифрами?
По моему писать больше, а от ошибок не помогает.
__________
Александр
2006 07 22


Никто же не мешает задать свои осмысленные имена
#define ORelay PD6
#define ISens PD7

Я стараюсь работать избегать битовых операций с портами ввода/вывода, где это возможно, и держу их копии вида
Код
union
{
   uchar i;
   struct
   {
      uchar Out0: 1;   // естественно, лучше дать осмысленное имя
      ...
   } b;
} PortAOut;

с которыми производятся все необходимые операции, и которые переписываются наружу (например, в PortA) с требуемой частотой.
С вводом поступаю примерно также - при этом проще фильтровать медленные сигналы (та же клавиатура, например).
Ну а с быстрыми сигналами приходится работать непосредственно на портах.
И при этом мне намного симпатичнее описание для PIC'ов вида
Код
/* GPIO Bits */
static volatile bit    GPIO0    @ (unsigned)&GPIO*8+0;

Под WinAVR у меня такое не прокатило, хотя я еще не слишком упирался.

Сообщение отредактировал xemul - Jul 22 2006, 17:40
Go to the top of the page
 
+Quote Post
vesago
сообщение Jul 23 2006, 06:41
Сообщение #8


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Цитата(pitt @ Jul 22 2006, 19:13) *
Разница CodeVision и WinAVR в том, что один пакет это IDE, предназначенное для тех, кто не является профессиональным software engineer, а другой именно пакет утилит для профессионалов или тех, кто на пути в этом направлении.

Как однако вы точно сказали. Недостаток PORTD.1 потом если надо код перегнать под другую платформу, менять больше придется. Приятнее когда PORTD=(1<<LED) - везде пройдет и понятнее имхо.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 23 2006, 20:15
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(vesago @ Jul 23 2006, 09:41) *
Недостаток PORTD.1 потом если надо код перегнать под другую платформу, менять больше придется. Приятнее когда PORTD=(1<<LED) - везде пройдет и понятнее имхо.

Приятнее спору нет, однако это совсем не равносильно с PORTD.1 = 1. И сгенеренные команды будут совсем разными.

Для PORTD.1 = 1 будет сгенерено
SBI PORTD, 1


Для PORTD = (1 << LED):
LDI Rxx, (1 << LED)
OUT PORTD, Rxx
Go to the top of the page
 
+Quote Post
pitt
сообщение Jul 23 2006, 21:32
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Во-первых,
PORTD.1 = 1 эквивалентно PORTD |= ( 1 << 1 ); // ни в коем случае не PORTD = ( 1 << 1 );;
Во-вторых, WinAVR достаточно умен и генерирует код:
PORTD |= ( 1 << 1 );
+0000007E: 9A58 SBI 0x0B,1 Set bit in I/O register


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 24 2006, 04:59
Сообщение #11





Guests






Цитата(defunct @ Jul 24 2006, 00:15) *
Цитата(vesago @ Jul 23 2006, 09:41) *

Недостаток PORTD.1 потом если надо код перегнать под другую платформу, менять больше придется. Приятнее когда PORTD=(1<<LED) - везде пройдет и понятнее имхо.

Приятнее спору нет, однако это совсем не равносильно с PORTD.1 = 1. И сгенеренные команды будут совсем разными.

Для PORTD.1 = 1 будет сгенерено
SBI PORTD, 1


Для PORTD = (1 << LED):
LDI Rxx, (1 << LED)
OUT PORTD, Rxx

Ну это вы зря, WinAVR может позволить себе токое невежество только при отключенной оптимизации (-О0) и то не всегда.

Писать: " TIMSK.1 = 1; TIMSK.7 = 1; " можно себе позволить только если не приходиться сопровождать код.
Зато как приятно через полгода поднять код и увидеть там " TIMSK |= (1<<OCIE0)|(1<<OCIE2); ", сразу становиться понятно что у тебя сдесь делается.

А на счет того какой компилятор лучше смотри тему http://electronix.ru/forum/index.php?showtopic=12284
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 24 2006, 06:31
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Serg79 @ Jul 24 2006, 07:59) *
Ну это вы зря, WinAVR может позволить себе токое невежество только при отключенной оптимизации (-О0) и то не всегда.

Ну почему же.
Выражение PORTD = (1 << LED) однозначно указывает, что бит LED надо установить, а остальные сбросить.

Цитата
Писать: " TIMSK.1 = 1; TIMSK.7 = 1; " можно себе позволить только если не приходиться сопровождать код.

С этим нельзя не согласиться ;>
Go to the top of the page
 
+Quote Post
vesago
сообщение Jul 24 2006, 07:14
Сообщение #13


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Цитата(pitt @ Jul 24 2006, 00:32) *
Во-первых,
PORTD.1 = 1 эквивалентно PORTD |= ( 1 << 1 ); // ни в коем случае не PORTD = ( 1 << 1 );;


smile.gif Я имел ввиду общий подход. Я имел ввиду, что лучьше сразу писать стандартно и использовать конструкции вроде PORTD |= ( 1 << blabla ); PORTD &= (1<<blabla) if((PORTD & (...))!=0)и т.п. Во всех нормальных компиляторах и на всех платформах будет работать.
Go to the top of the page
 
+Quote Post
vet
сообщение Jul 24 2006, 07:52
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Цитата(Serg79 @ Jul 24 2006, 08:59) *
Писать: " TIMSK.1 = 1; TIMSK.7 = 1; " можно себе позволить только если не приходиться сопровождать код.

Никто не мешает в CV написать TIMSK.OCIE0 = 1;


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Guest_Serg79_*
сообщение Jul 24 2006, 08:55
Сообщение #15





Guests






Цитата(vet @ Jul 24 2006, 11:52) *
Цитата(Serg79 @ Jul 24 2006, 08:59) *

Писать: " TIMSK.1 = 1; TIMSK.7 = 1; " можно себе позволить только если не приходиться сопровождать код.

Никто не мешает в CV написать TIMSK.OCIE0 = 1;

Я прикрепил заголовочный файл для ATMega64 из CV, так попробуй там найти флаг OCIE0. Это тебе придется все самому ручками прописывать.
Это один из минусов CV, кстати не самый маленький.

Сообщение отредактировал Serg79 - Jul 24 2006, 08:57
Прикрепленные файлы
Прикрепленный файл  MEGA64.zip ( 1.16 килобайт ) Кол-во скачиваний: 66
 
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016