Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 12.01.2010, 19:03  
Easyrider83
Гуру портала
 
Аватар для Easyrider83
 
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
Easyrider83 на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Я понял, чего хочет автор!!!
Попробуйте сделать так
вводим переменную:
_test as byte at portc
потом обращаемся к ней так:
_test[a]=ваш бит, где "а" - номер вывода порта С
У меня работает
Реклама:
Easyrider83 вне форума  
Сказали "Спасибо" Easyrider83
zerion (12.01.2010)
Непрочитано 12.01.2010, 19:17  
zerion
Частый гость
 
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
zerion на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Попробую еще раз объяснить. Может сам пойму что хочу .

Обявляю пины портов с какими будет работать функция.

переменная для вывода
выбор пина порта
вывод младшего байта переменной
выбор следующего пина порта
вывод младшего байта переменной
...
выбор пина порта
вывод старшего байта переменной
выбор следующего пина порта
вывод старшего байта переменной
__________________
С уважением, Игорь.
zerion вне форума  
Непрочитано 12.01.2010, 19:20  
zerion
Частый гость
 
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
zerion на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Сообщение от Easyrider83 Посмотреть сообщение
Я понял, чего хочет автор!!!
Попробуйте сделать так
вводим переменную:
_test as byte at portc
потом обращаемся к ней так:
_test[a]=ваш бит, где "а" - номер вывода порта С
У меня работает
Спасибо за совет. В CodeVision #define _test PORTC. Потом можно обращаться к _test как угодно, но мне нужно выбирать разные пины портов как бы по очереди которую я должен как то задать. Пока дело с пинами одного порта,то все в порядке, а если нужно задействовать так же пины другого порта то тупик. Как это все уместить в одной функции?
__________________
С уважением, Игорь.

Последний раз редактировалось zerion; 12.01.2010 в 19:50.
zerion вне форума  
Непрочитано 13.01.2010, 01:36  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Конечно, можно сделать и то что Вы просите. Как средствами макроопределений, так и прямыми средствами адресной арифмерики в режиме исполнения. Но зачем?!!!

Я, как программист со стажем, советую вам поступать по другому. Смысл объяснять долго. Вы его потом поймёте, когда при изменении одной ножки в схеме будете выискивать по всему проекту где вы обращались к этой ноге. Кроме того, нельзя воспринимать ваш проект настолько отвлечённо от реальности. Короткая программа на Си - отнюдь не самый короткий код. Отнюдь не самое быстрое исполнение. Например, чем обращаться к i-тому биту, лучше ввести новую переменную и двигать её в каждом цикле. На си будет длиннее. Результирующий код будет эффективнее в несколько раз.

Итак. Как делаю я.
1) Создаю файл port.h ( или local.h - это на ваше усмотрение).

2) Перечисляю все порты. Типа...
// Порт B
#define PB_24V 0
#define PB_PWM 1
....

3) Там же объявляю инициализацию портов при старте. Типа...
// Инициализация
#define DDRB_INIT DDRB = (1‹‹PB_24V)|(1‹‹PB_PWM_1)|(1‹‹PB_PWM_0)|(1‹‹PB_2)| (1‹‹PB_3)|(3‹‹PB_67)
#define PORTB_INIT PORTB = (1‹‹PB_PWM_0)
#define PB_INIT PORTB_INIT; DDRB_INIT
...

4) Там же объявляю работу с данным портом. Типа...
// Управление ШИМом
#define PIN_PWM_FREE PORTB |= (1‹‹PB_PWM_0); PORTB &= ~(1‹‹PB_PWM_1); DDRB &= ~(1‹‹PB_PWM)
#define PIN_PWM_USE PORTB |= (1‹‹PB_PWM_1); PORTB &= ~(1‹‹PB_PWM_0); DDRB |= (1‹‹PB_PWM)
// Управление внешним питанием
#define PWR_24V_ON PORTB |= (1‹‹PB_24V)
#define PWR_24V_OFF PORTB &= ~(1‹‹PB_24V)
....

====================

В тексте программы у меня идут только очевидные записи. Типа...
// Подпрограммы для работы с внешним питанием

void ExtPowerSwitch(void)
{
if(ext_power_en) // Если установлен признак питания
{
PWR_24V_ON; // то включить его
LED_ON; // и зажечь светодиод
}
else
{
PWR_24V_OFF; // или выключить его
LED_OFF; // и погасить светодиод
}
}

Легко увидеть, что если, к примеру, у меня изменится разводка платы, то изменится ТОЛЬКО 1 ФАЙЛ. Чаще всего пару строк всего. Аналогично произойдёт, если придётся поменять полярность сигнала. Например неважно чем зажигается светодиод. Прога сохранится, и что главное - она наглядна.

И ещё раз повторяю. Краткость текста си программы, не гарантирует её красоты. Она показывает всю глубину вашего непонимания, как всё это работает в МК.

========================================

Ну а если вы упорствуете, то вот так примерно ...

#define CBI(_PORT_,_BIT_) _PORT_ &= ~(1‹‹_BIT_) // Сброс бита
SasaVitebsk вне форума  
Эти 2 пользователя(ей) сказали Спасибо SasaVitebsk за это сообщение:
nml (13.01.2010), zerion (13.01.2010)
Непрочитано 13.01.2010, 09:48  
woroba
Гражданин KAZUS.RU
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
woroba на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Может указатели помогут?

void impuls ( uchar volatile *pp, uchar pinp)
{
*pp|=(1‹‹pinp);
delay_us(60);
*pp&=~(1‹‹pinp);
}

impuls(&PORTC,0);
__________________
Не ошибается лишь тот, кто ни чего не делает!
woroba вне форума  
Сказали "Спасибо" woroba
zerion (13.01.2010)
Непрочитано 13.01.2010, 11:15  
zerion
Частый гость
 
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
zerion на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Сообщение от woroba Посмотреть сообщение
Может указатели помогут?

void impuls ( uchar volatile *pp, uchar pinp)
{
*pp|=(1‹‹pinp);
delay_us(60);
*pp&=~(1‹‹pinp);
}

impuls(&PORTC,0);
У меня вопрос. Как задать порт в функции. Вызов функции impuls(&PORTC,0) в CodeVision выдает ошибку несовместимости 1-й переменной
или неприменимости оператора &.
__________________
С уважением, Игорь.
zerion вне форума  
Непрочитано 13.01.2010, 11:36  
woroba
Гражданин KAZUS.RU
 
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
woroba на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Сообщение от zerion Посмотреть сообщение
У меня вопрос. Как задать порт в функции. Вызов функции impuls(&PORTC,0) в CodeVision выдает ошибку несовместимости 1-й переменной
или неприменимости оператора &.
В IAR это работает а с CVAVR разбирайтесь сами!
Похоже CV не поддерживает указатели на регистры I/O.
__________________
Не ошибается лишь тот, кто ни чего не делает!

Последний раз редактировалось woroba; 13.01.2010 в 11:53.
woroba вне форума  
Непрочитано 13.01.2010, 14:25  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Ещё раз, для тех кто в танке. Перечитайте первые строки моего поста.
Можно эту задачу выполнить на уровне препроцессора (это значит, что все подстановки будут сделаны компилятором ещё до выполнения программы), и на уровне исполнения (это значит, что значения битов порта и имена портов неизвестны на момент написания программы, а вычисляются в процессе исполнения).

Те предложения которые вам сделал Easyrider83 и я - это для препроцессора. Те которые сделал woroba, а я только обозначил как "адресная арифметика" - это рантайм.

Вам какие именно надо? Это важно.

А уж потом мы будем с деталями разбираться.

Надо понимать, что CV вам оказывает медвежью услугу.
Вы не понимаете что пишете.
Например написали PORTC.5 = 1
это скомпилируется в SBI PORTC,5
А если вы напишите PORTC.5 = i, к примеру,
то это скомпилируется примерно так
cbi PORTC,5
ld r16,i
breq ex
sbi PORTC,5
ex:

Ну или что-то подобное ч/з бит T

А если вы напишите PORTC.i = 1, то, скорее всего это приведёт к вызову ф-ции вида

ldi zl, low(sdv)
ldi zh, high(sdv)
ld r16,i
cpi r16,8
brsh xx1
ret
rl r16
rl r16
ldi r17,0
add zl,r16
adc zh,r17
sdv:
sbi PORTC,0
ret
sbi PORTC,1
ret
sbi PORTC,2
ret
....
sbi PORTC,7
ret

и так далее
SasaVitebsk вне форума  
Непрочитано 13.01.2010, 16:01  
zerion
Частый гость
 
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
zerion на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

SasaVitebsk я Ваш метод оценил и понял. СПАСИБО. Буду делать через define макросами.
__________________
С уважением, Игорь.

Последний раз редактировалось zerion; 13.01.2010 в 16:31.
zerion вне форума  
Непрочитано 13.01.2010, 16:37  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера

Сообщение от zerion Посмотреть сообщение
Если нельзя, тогда буду делать через define.
Блин...
Когда у меня заказчик спрашивает "можно ли" я всегда отвечаю ДА. Так устроено программирование. Здесь можно всё. Правильный вопрос только "целесообразно ли".

Можно сделать робота с чел интелектом? Да. Только это займёт хх человеколет труда, и будет стоить хх $. Это отступление...

Сообщение от zerion Посмотреть сообщение
Если нельзя, тогда буду делать через define.
Можно. Просто я не пойму что именно вам надо. Да вы и сами пока не понимаете. Просто подтыкаете как пазл то, что вам предлогают.

Формулирую задачу сам и сам её решаю. Чиста па нашаму.
Лаконично записать в теле программы вывод бита в порт.

Итак 2 варианта.
1) Уровень препроцессора.
#define OUTPORTBIT(_PORT_,_BIT_,_DATA_) _PORT_ &= ~(1‹‹_BIT_);if(_DATA_) _PORT_ |= (1‹‹_BIT_)

Пример
OUTPORTBIT(PORTC,5,1);

Ограничения: Имя порта должно быть определено на этапе компиляции. То есть написание типа OUTPORTBIT(i,5,0) не прокатит. OUTPORTBIT(PORTA,i,j) - запросто.

2) Уровень исполнения
void OutPortBit( uint8_t volatile *pport, uint8_t bit, uint8_t data)
{
*pport &= ~(1‹‹bit);
if(data) *pport |= (1‹‹bit);
}

Пример
OutPortBit(&PORTA,i,j);
или
// объявление
uint8_t volatile * pportarray[MAXPORT];

// инициализация указателей
pportarray[0] = &PORTC;
pportarray[1] = &PORTE;
pportarray[2] = &PORTD;

// перебираем все порты в объявленном порядке и в выбранном порте
// поочерёдно перебираем пины
for(i=0;i‹MAXPORT;i++)
{
for(j=0;j‹8;j++)
{
OutPortBit(pportarray[i],j,1);
wait1s();
OutPortBit(pportarray[i],j,0);
wait1s();
}
}
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
zerion (13.01.2010)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33


Часовой пояс GMT +4, время: 00:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot