|
|
  |
Разница CodeVision и WinAVR |
|
|
|
Jul 22 2006, 10:15
|
Частый гость
 
Группа: Свой
Сообщений: 83
Регистрация: 17-05-06
Пользователь №: 17 190

|
Гребаные идентификаторы.... Как просто было в CodeVision : PORTD.1=1; DDRD=1; Пытаюсь в WinAVR сделать - достал примерно следующий код: Код DDRD &= ~(_BV(PD2)); // Назначаем 2-ю линию порта D на вход PORTD |= (_BV(PD2)); // подключаем "подтягивающий" резистор Нельзя ли попроще как-нибудь? И еще вопрос - инициализирую АЦП - выдает беспорядочные хаотичные цифры. Понятно, что дело в том, что ловятся шумы. Вылечил резистором 4,7 кОм на питание. А как-нить программно нельзяли?
|
|
|
|
|
Jul 22 2006, 12:30
|
Частый гость
 
Группа: Участник
Сообщений: 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; ... Не панацея, но хоть немного легче
|
|
|
|
|
Jul 22 2006, 12:34
|
Участник

Группа: Участник
Сообщений: 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); а в чем проблема то? с логическими операциями?
|
|
|
|
|
Jul 22 2006, 14:20
|
    
Группа: Свой
Сообщений: 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; } и переопределить все потребные регистры
|
|
|
|
|
Jul 22 2006, 16:39
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jul 22 2006, 17:38
|
    
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jul 23 2006, 20:15
|

кекс
     
Группа: Свой
Сообщений: 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
|
|
|
|
Guest_Serg79_*
|
Jul 24 2006, 04:59
|
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
|
|
|
|
|
Jul 24 2006, 06:31
|

кекс
     
Группа: Свой
Сообщений: 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; " можно себе позволить только если не приходиться сопровождать код. С этим нельзя не согласиться ;>
|
|
|
|
|
Jul 24 2006, 07:52
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Цитата(Serg79 @ Jul 24 2006, 08:59)  Писать: " TIMSK.1 = 1; TIMSK.7 = 1; " можно себе позволить только если не приходиться сопровождать код. Никто не мешает в CV написать TIMSK.OCIE0 = 1;
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
Guest_Serg79_*
|
Jul 24 2006, 08:55
|
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
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|