ELEKTROS
Jul 8 2011, 10:17
Подскажите другой вход из такой вот проблемы: настраиваю шим от таймера 3 на ножках порта PC 6, 7, 8,9, через ремап, потом в определённый момент работы мне не нужен ШИМ, а нужно прямое управление этими ножками, пока вижу только два варианта выхода из этого:
1) Переконфигугрирование ножки темже ремапом и настройка ножки по новому через структуру.
2) Установка в регистр сравнения значений 0 или 0xFFFF и вкрючая и выключая соответствующий канал сравнения (но что то мне подсказывает что работать будет криво).
Вообщем оба метода относительно долгие по времени.
Remap-то зачем трогать? Просто меняете режим работы ноги с альтернативного выхода на пушпульный выход. Это пара команд.
ELEKTROS
Jul 8 2011, 11:48
Ну например вот так:
Код:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7_GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIO_PORT[Pin_number], &GPIO_InitStructure);
или по короче как подскажите?
Цитата(ELEKTROS @ Jul 8 2011, 15:48)

или по короче как подскажите?
Ясно как. Отказаться от GPIO_Init(). Программировать регистры напрямую. В руководстве по МК все регистры описаны.
Цитата(ELEKTROS @ Jul 8 2011, 17:48)

или по короче как подскажите?
Если вы пишете на C++, то посмотрите
вот сюда. Это удобная обёртка для работы с ножками. Если на простом си, то вот:
Нажмите для просмотра прикрепленного файлаЭто так называемые макросы им. Волкова. Пользоваться так:
Код
// Объявляем ножку:
#define PC6 C, 6, L // порт "C", нога номер 6, активный уровень - низкий.
#define PC7 C, 7, H // порт "C", нога номер 6, активный уровень - высокий
// Конфигурируем ножку:
pmode(PC6, PIN_CFG_OPP_50MHZ); // выход
pmode(PC7, PIN_CFG_AI); // альтернативный вход
// Используем ножку:
on(PC6); // переводим в активный уровень (в низкий в данном случае)
off(PC7); // переводим в неактивный уровень (высокий)
//и так далее.
ELEKTROS
Jul 8 2011, 15:23
Так а разница между: on(PC6) и off(PC6) например тогда какая, если там активный или нет уровень на выходе определяется самым первым дефайном, где объявляем ножку?
Я так понял что это условность что приймем за активный а что нет, поэтому ипользовать впринципе без разницы on или off, или я не так понял?
Здесь мне кажеться правильно так коментай:
off(PC7); // переводим в неактивный уровень (в данном случае низкий)
Цитата(ELEKTROS @ Jul 8 2011, 21:23)

off(PC7); // переводим в неактивный уровень (в данном случае низкий)
Да, конечно. Я перепутал.
ELEKTROS
Jul 8 2011, 15:42
Спасибо, достаточно просто и в регистры лезть не надо. А такой вопрос не по теме, может знаете почему используются сплошь битовые маски, хотя память сегментированая и можно напрямую писать биты. Или компилятор сделает не по битовым маскам, а как положено когда в асемблер перебьёт?
Цитата(ELEKTROS @ Jul 8 2011, 21:42)

А такой вопрос не по теме, может знаете почему используются сплошь битовые маски, хотя память сегментированая и можно напрямую писать биты.
Извините, я не понял, о чём речь. Что значит "память сегментированная"?
Битовые маски оттого, что в одном регистре конфигурации (например, CRL) хранятся настройки сразу восьми ножек микроконтроллера. Поэтому для того, чтобы настроить одну ножку, не трогая другие, приходится применять битовые маски.
А вообще, по первой ссылке, которую я приводил, вариант более правильный, посмотрите как там сделано. Там и масок поменьше.
Цитата(ELEKTROS @ Jul 8 2011, 18:42)

Спасибо, достаточно просто и в регистры лезть не надо...
Рискну предложить посмотреть на мой вариант конфигурирования битов порта. Здесь, рядом, недалеко...
http://electronix.ru/forum/index.php?showt...st&p=918437
ELEKTROS
Jul 8 2011, 20:16
Ну сегментированная, т.е. каждый бит имеет свой адрес, например в referens manual на эту серию контроллеров приводят даже формулу как расчитать адрес конкретного бита, т.е. не нужны битовые маски вовсе в таком случае, меньше команд тратиться, странно что вы об этом не слышали, или я не так выразился.
Это называется bit-band:)
Собственно говоря, в варианте C++, который я привёл первым, bit-band используется в паре-тройке мест. Но особого выигрыша он не даёт. Особенно в конфигурировании ног. Ибо там не один бит, и маска всяко быстрее выходит.
А сишный вариант я оказывается загрузил старый. Вот поновее, тут всё сделано как надо:
Нажмите для просмотра прикрепленного файла
ELEKTROS
Jul 11 2011, 17:10
Еще вопрос всегда меня мучал: зачем устанавливается частота выходной ножки, что это даёт, по моему разумению бесполезная функция, все всёравно используют настройку 50МГц?
IgorKossak
Jul 11 2011, 19:58
Цитата(ELEKTROS @ Jul 11 2011, 20:10)

... все ...
Очень самонадеянное заявление.
ELEKTROS
Jul 12 2011, 17:54
Был не прав, но на вопрос то ответьте?
Снижение максимальной частоты работы ноги приводит к сглаживанию фронтов и сужению спектра. Кароче наводок меньше будет испускать. ЭМС лучше.
Насчет битовых масок - да, программисты, пишушие на языках высокого уровня надеются на разумность компилятора. Это дает легко переносимый код. Кому хочется выжимать все соки из проца - те пишут на ассемблере. Но это, ИМХО, они делают ради собственного удовольствия. А кто деньги зарабатывает - не тратят время на возню с асмом. Ну кроме критичных мест, разумеется.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.