побитовый вывод числа в пин

Обсуждаем контроллеры компании Atmel.
Ответить
neox
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Сб мар 10, 2012 21:14:01

побитовый вывод числа в пин

Сообщение 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 вить там пины портов назначаются по другому !?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение vitalik_1984 »

Код: Выделить всё


 for
(a=0; a<8; a++){  //цикл для вывода 8 бит данных из массива
 (buf[1] & 1<<a)?(PORTB|=_BV(PB0)):PORTB&=~_BV(PB0) //выводим в линию DATA текущий бит 
 

Что равносильно

Код: Выделить всё


 if 
(buf[1] & 1<<a){PORTB|=_BV(PB0);}
else {PORTB&=~_BV(PB0;}
 
В поисках истины человек развивается.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение DX168B »

А для большей переносимости, можно и так:

Код: Выделить всё


 
#define PORT_OUT  PORTB  //используемый порт
 #define PIN_OUT  PB0  //Ножка порта для вывода
 #define OUT_SIZE  8  //Количество битов
 
 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 уже будет тяжко перенести. Придется править везде.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение vitalik_1984 »

Точно, но вопрос был про студию.А пины лень было писать на телефоне :)
Так же можно сказать про тернарный оператор, тоже не везде есть его обработка.
А насчет макроса, так то можно сделать заголовочный файл - прокладку для облегчения переносимости. Неужели там нет макросов? Студия вроде как не сильно отступает от стандартов си.
Даже ЕЕПРОМ резервного слова нет, все только в макросах.

PS.Есть готовый проект для студии 5 с выводом на сдвиговый регистр.Я так понимаю этот код для этого нужен?
Если нужно могу скинуть.
В поисках истины человек развивается.
eufs
Опытный кот
Сообщения: 772
Зарегистрирован: Вс апр 10, 2011 02:24:06
Откуда: г.Северодонецк

Re: побитовый вывод числа в пин

Сообщение 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
...
C0FFEE=‭12648430‬
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение vitalik_1984 »

Неплохо бы пару комментов для сишников :)
В поисках истины человек развивается.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение 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
...                           ;Отправка завершена
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение vitalik_1984 »

Так почему порт определен железно?Тоже бы через макрос замутили :wink:
В поисках истины человек развивается.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение 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;
    }
  }
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: побитовый вывод числа в пин

Сообщение Совесть »

Можете пояснить зачем в данной функции вы используете volatile?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение YS »

Чтобы оптимизатор случаем переменную не снес и не заоптимизировал до неузнаваемости. Хотя и так не должен, но volatile не повредит.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение vitalik_1984 »

Я обычно делаю так.

А это получается только для асинхронного режима функция, то есть в нее придется дописывать команды сдвига регистра и защелки.Я правильно понял?
В поисках истины человек развивается.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: побитовый вывод числа в пин

Сообщение YS »

дописывать команды сдвига регистра и защелки


Да. Это каркас. Выдачу вспомогательных сигналов можно вставить по вкусу.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Ответить

Вернуться в «AVR»