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

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

Сообщение 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;}
 
В поисках истины человек развивается.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

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

Сообщение vitalik_1984 »

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

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

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

Сообщение vitalik_1984 »

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

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

Сообщение vitalik_1984 »

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

Сообщение 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

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

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

Сообщение YS »

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

Сообщение vitalik_1984 »


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

Сообщение YS »

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

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