Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
12.01.2010, 19:03
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера
Я понял, чего хочет автор!!!
Попробуйте сделать так
вводим переменную:
_test as byte at portc
потом обращаемся к ней так:
_test[a]=ваш бит, где "а" - номер вывода порта С
У меня работает
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
12.01.2010, 19:17
|
|
Частый гость
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
|
Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера
Попробую еще раз объяснить. Может сам пойму что хочу .
Обявляю пины портов с какими будет работать функция.
переменная для вывода
выбор пина порта
вывод младшего байта переменной
выбор следующего пина порта
вывод младшего байта переменной
...
выбор пина порта
вывод старшего байта переменной
выбор следующего пина порта
вывод старшего байта переменной
__________________
С уважением, Игорь.
|
|
|
|
12.01.2010, 19:20
|
|
Частый гость
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
|
Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера
Сообщение от Easyrider83
|
Я понял, чего хочет автор!!!
Попробуйте сделать так
вводим переменную:
_test as byte at portc
потом обращаемся к ней так:
_test[a]=ваш бит, где "а" - номер вывода порта С
У меня работает
|
Спасибо за совет. В CodeVision #define _test PORTC. Потом можно обращаться к _test как угодно, но мне нужно выбирать разные пины портов как бы по очереди которую я должен как то задать. Пока дело с пинами одного порта,то все в порядке, а если нужно задействовать так же пины другого порта то тупик. Как это все уместить в одной функции?
__________________
С уважением, Игорь.
Последний раз редактировалось zerion; 12.01.2010 в 19:50.
|
|
|
|
13.01.2010, 01:36
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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_) // Сброс бита
|
|
|
Эти 2 пользователя(ей) сказали Спасибо SasaVitebsk за это сообщение:
|
|
|
13.01.2010, 09:48
|
|
Гражданин KAZUS.RU
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
|
Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера
Может указатели помогут?
void impuls ( uchar volatile *pp, uchar pinp)
{
*pp|=(1‹‹pinp);
delay_us(60);
*pp&=~(1‹‹pinp);
}
impuls(&PORTC,0);
__________________
Не ошибается лишь тот, кто ни чего не делает!
|
|
|
|
13.01.2010, 11:15
|
|
Частый гость
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
|
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-й переменной
или неприменимости оператора &.
__________________
С уважением, Игорь.
|
|
|
|
13.01.2010, 11:36
|
|
Гражданин KAZUS.RU
Регистрация: 13.06.2005
Адрес: РК г.Павлодар
Сообщений: 866
Сказал спасибо: 99
Сказали Спасибо 216 раз(а) в 140 сообщении(ях)
|
Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера
Сообщение от zerion
|
У меня вопрос. Как задать порт в функции. Вызов функции impuls(&PORTC,0) в CodeVision выдает ошибку несовместимости 1-й переменной
или неприменимости оператора &.
|
В IAR это работает а с CVAVR разбирайтесь сами!
Похоже CV не поддерживает указатели на регистры I/O.
__________________
Не ошибается лишь тот, кто ни чего не делает!
Последний раз редактировалось woroba; 13.01.2010 в 11:53.
|
|
|
|
13.01.2010, 14:25
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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
и так далее
|
|
|
|
13.01.2010, 16:01
|
|
Частый гость
Регистрация: 24.04.2005
Сообщений: 35
Сказал спасибо: 10
Сказали Спасибо 6 раз(а) в 2 сообщении(ях)
|
Re: Как поочередно выводить одну и ту же информацию на разные выводы AVR контроллера
SasaVitebsk я Ваш метод оценил и понял. СПАСИБО. Буду делать через define макросами.
__________________
С уважением, Игорь.
Последний раз редактировалось zerion; 13.01.2010 в 16:31.
|
|
|
|
13.01.2010, 16:37
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
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
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 00:21.
|
|