Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вопрос по си
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
d71
есть байт, надо его по битам выпихнуть на ногу МК
---
сижу туплю со сдвигом, смотрю в чужие исходники и нихрена не понимаю, подскажите, а
haker_fox
Цитата(d71 @ Feb 27 2006, 11:13) *
есть байт, надо его по битам выпихнуть на ногу МК
---
сижу туплю со сдвигом, смотрю в чужие исходники и нихрена не понимаю, подскажите, а


Может быть так:

Код
unsigned char byte;
for(unsigned char i=0;i<7;i++)
  if(byte & (1 << i))
    PORTA|=(1<<PB0);
  else
    PORTA&=~(1<<PB0);


Код написал на вскидку, не проверял.
defunct
Код

char c, i;

for (i = 0; i < 8; i++)
{
   PXX = (c & 0x80) > 0;
   c <<= 1;
   // +задержка..
}


или

Код

char c, i;

for (i = 0; i < 8; i++)
{
   PXX = c & 1;
   c >>= 1;
   // +задержка..
}


или учитывая особенности signed:
Код

signed char c;
for (i = 0; i < 8; i++)
{
   PXX = c < 0;
   c <<= 1;
   // +задержка..
}
d71
ну точно! smile.gif я же говорил что туплю, не в ту степь двигал вообще и получал кракозябры
огромное спасибо от начинающего
---
прикрепляю то над чем тупил
proteus проект
mega16 + 6 сдвиговых hc595 с семисегментными
iar проект внутре
defunct
Цитата(d71 @ Feb 27 2006, 06:55) *
прикрепляю то над чем тупил

скомпилированный код будет более оптимальным если написать так:

Код
  [u]signed[/u]  char a;
  ...
   a=CharString(str_out[i]);

    for (int y=0;y<8;y++){
      isp_ds= a < 0;
      isp_clk=1;
      isp_clk=0;
      a <<= 1;      
    }
d71
согласен, учту
пока не владею скорострельностью Си smile.gif
дельфист, пхпист, перлист - вобщем херней маялся раньше, вот и замашки соответствующей организации smile.gif
спасиба smile.gif
prottoss
Цитата(defunct @ Feb 27 2006, 12:05) *
Цитата(d71 @ Feb 27 2006, 06:55) *

прикрепляю то над чем тупил

скомпилированный код будет более оптимальным если написать так:

Код
  [u]signed[/u]  char a;
  ...
   a=CharString(str_out[i]);

    for (int y=0;y<8;y++){
      isp_ds= a < 0;
      isp_clk=1;
      isp_clk=0;
      a <<= 1;      
    }


можно и вот так:

Код


#define SSTB PB4// строб записи в параллельный регистр вывода 74595
#define SDATA PB5// последовательные данные
#define SCLK PB7// синхронизация для последовательных данных


........  

char count = 0x08; // счетчик выводимых бит  

do
    {   // формируем бит данных для вывода
        PORTB &= ~(1 << SDATA); // обнуляем порт данных
        if(data & (1 << 7)) // если бит 7 байта данных установлен , то устанавливаем порт данных
        {   PORTB |= (1 << SDATA);
        }
        data <<= 1; // сдвигаем байт данных

        // формируем строб записи в последовательный регистр 74595
        PORTB &= ~(1 << SCLK);
        PORTB |=  (1 << SCLK);
    }
    while(--count);
defunct
Цитата(prottoss @ Feb 27 2006, 08:30) *
можно и вот так:

Можно, но так будет нарушен изначальный алгоритм. К чему это приведет - неизвестно.
d71
вот-вот, пугающие исходники получаются
я остановлюсь пока на том что работает. дело в том что проект не маленький, и вот таких кусочков много. оптемизировать пока смысла нет, если войдет в мегу16, то мозможно вообще не надо будет оптемизации, но всё равно спасибо, думаю можно в факи эту тему smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.