Страница 1 из 1
побитовый вывод числа в пин
Добавлено: Вс сен 09, 2012 21:00:19
neox
Здравствуйте! помогите пожалуйста с кодом
Код: Выделить всё
char buf[] = { //массив с цифрами
0b00000011, //0
0b10011111, //1
0b00100101, //2
0b00001101, //3
0b10011001, //4
0b01001001, //5
0b01000001, //6
0b00011111, //7
0b00000001, //8
0b00001001, //9
0b11111111
};
unsigned char a;
for(a=0; a<8; a++){ //цикл для вывода 8 бит данных из массива
PORTB.0 = buf[1] & 1<<a; //выводим в линию DATA текущий бит
Это пример из CVAVR всем известно что там есть такая фишка как " PORTB.0 ="," PORTC.4 =" и.т и.п а как его переделать под AVR STUDIO вить там пины портов назначаются по другому !?
Re: побитовый вывод числа в пин
Добавлено: Вс сен 09, 2012 21:26:16
vitalik_1984
Код: Выделить всё
for(a=0; a<8; a++){ (buf[1] & 1<<a)?(PORTB|=_BV(PB0)):PORTB&=~_BV(PB0)
Что равносильно
Код: Выделить всё
if (buf[1] & 1<<a){PORTB|=_BV(PB0);}
else {PORTB&=~_BV(PB0;}
Re: побитовый вывод числа в пин
Добавлено: Вс сен 09, 2012 21:58:46
DX168B
А для большей переносимости, можно и так:
Код: Выделить всё
for(int i=0; i<OUT_SIZE; i++)
{
(buf[1] & (1<<i)) ? (PORT_OUT |= (1<<PIN_OUT)) : (PORT_OUT &= ~(1<<PIN_OUT));
}
Это в виду того, что макрос _BV(Pxy) отсутствует в других средах (типа IAR, Keyl и прочих). К примеру, на STM32 уже будет тяжко перенести. Придется править везде.
Re: побитовый вывод числа в пин
Добавлено: Вс сен 09, 2012 23:02:04
vitalik_1984
Точно, но вопрос был про студию.А пины лень было писать на телефоне

Так же можно сказать про тернарный оператор, тоже не везде есть его обработка.
А насчет макроса, так то можно сделать заголовочный файл - прокладку для облегчения переносимости. Неужели там нет макросов? Студия вроде как не сильно отступает от стандартов си.
Даже ЕЕПРОМ резервного слова нет, все только в макросах.
PS.Есть готовый проект для студии 5 с выводом на сдвиговый регистр.Я так понимаю этот код для этого нужен?
Если нужно могу скинуть.
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 00:04:11
eufs
Не для холивара...
Код: Выделить всё
MOV TEMP, ...
LDI TEMP2,8
LOOP:
SBRC TEMP,0
SBI PORTB,_OUT
SBRS TEMP,0
CBI PORTB,_OUT
ROR TEMP
DEC TEMP2
BRNE LOOP
...
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 00:11:30
vitalik_1984
Неплохо бы пару комментов для сишников

Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 00:15:09
DX168B
vitalik_1984 писал(а):Точно, но вопрос был про студию.А пины лень было писать на телефоне

Так же можно сказать про тернарный оператор, тоже не везде есть его обработка.
А насчет макроса, так то можно сделать заголовочный файл - прокладку для облегчения переносимости. Неужели там нет макросов? Студия вроде как не сильно отступает от стандартов си.
Даже ЕЕПРОМ резервного слова нет, все только в макросах.
Ну, можно и самому слепить этот макрос.
Я какбэ уже стараюсь писать код полностью переносимым, так как те или иные куски потом сгодятся в других проектах. Сокращает время разработки.
Как-то слепил 25 классов (С++) для работы с кое-каким оборудованием. Изначально, они предназначались для x86 (писалась софтина под вынь)
потом надо было научить МК работать с этим оборудованием. Взял исходники и заголовочники из MVSC 2008 и сунул в проект IAR.
Изменил только содержимое функций обмена с устройствами и индикации\обслуживания GUI (надо было вывести все на графический LCD и программные кнопки заменить на аппаратные)
Ну и лишнее тупо выкинул. Все закомпилировалось и заработало с полпинка.
Затрата времени на перенос - 2 часа.
vitalik_1984 писал(а):Неплохо бы пару комментов для сишников

Код: Выделить всё
MOV TEMP, ... ;копирование отправляемого байта в регистр TEMP
LDI TEMP2, 8 ;загрузка константы количества отправляемых битов
LOOP: ;Метка LOOP (цикл отправки)
SBRC TEMP, 0 ;пропустить следующую инструкцию, если бит 0 в регистре TEMP сброшен
SBI PORTB, _OUT ;установка бита в PORTB
SBRS TEMP, 0 ;пропустить следующую инструкцию, если бит 0 в регистре TEMP установлен
CBI PORTB, _OUT ;сброс бита в PORTB
ROR TEMP ;сдвиг в право содержимого регистра TEMP
DEC TEMP2 ;декремент регистра TEMP2
BRNE LOOP ;Если не ноль, то переходим к метке LOOP
... ;Отправка завершена
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 13:47:11
vitalik_1984
Так почему порт определен железно?Тоже бы через макрос замутили

Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 17:24:29
YS
Я обычно делаю так.
SO_PORT - выходной порт, SO_PINMASK - маска выходного пина.
Код: Выделить всё
void ShiftByte(uint8_t byte)
{
volatile uint8_t mask;
for (mask=0x80; mask; mask=mask >> 1)
{
if (byte & mask)
{
SO_PORT|=SO_PINMASK;
}
else
{
SO_PORT&=~SO_PINMASK;
}
}
}
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 19:53:40
Совесть
Можете пояснить зачем в данной функции вы используете volatile?
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 20:22:21
YS
Чтобы оптимизатор случаем переменную не снес и не заоптимизировал до неузнаваемости. Хотя и так не должен, но volatile не повредит.
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 20:53:28
vitalik_1984
Я обычно делаю так.
А это получается только для асинхронного режима функция, то есть в нее придется дописывать команды сдвига регистра и защелки.Я правильно понял?
Re: побитовый вывод числа в пин
Добавлено: Пн сен 10, 2012 21:15:48
YS
дописывать команды сдвига регистра и защелки
Да. Это каркас. Выдачу вспомогательных сигналов можно вставить по вкусу.