Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Управление на регистри
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9562
Страница 1 от 1

Автор:  perro_iv [ Пон Ное 28, 2011 10:10 pm ]
Заглавие:  Управление на регистри

Трябва ми малко помощ, че не мога да захапя.
Става въпрос за следното - трябва да пълня периодично 8 външни регистъра свързани последователно.
До сега винаги ползвах MSSP модула в SPI Mode. Сега обаче трябва да ползвам паралелно и EUSART-а, а пиновете им съвпадат. Поради това трябва да си напиша комуникацията, обаче на C не съм ротейтвал байтове и нямам идея, как да обхождам битовете в байта та да вдигам и свалям съответно управляващия пин.
Дайте малко идеи, ако някой вече си е блъскал главата.
Става въпрос за MICROCHIP.

Автор:  ike [ Пон Ное 28, 2011 10:29 pm ]
Заглавие:  Re: Управление на регистри

Код:
uint8_t bitCounter = 0;
   while(bitCounter < 8) {
      (sout & BIT7) ? (P1OUT |= DataPin) : (P1OUT &= ~DataPin);   // <- магията става тук
      sout <<= 1;                                                 // <- и тук
      
      P1OUT |= ClockPin;
      _nop();
      P1OUT &= ~ClockPin;
      
      bitCounter++;
     }
     P1OUT |= StrobePin;
     _nop();
     P1OUT &= ~StrobePin;

Надявам се можеш да се ориентираш.

Автор:  perro_iv [ Пон Ное 28, 2011 10:38 pm ]
Заглавие:  Re: Управление на регистри

:rolleyes: Ами ще ми трябва малко време да захапя този кошмарен синтаксис ... :)

... C# направо ме е разглезил ...

Автор:  Cekins [ Вто Ное 29, 2011 10:18 am ]
Заглавие:  Re: Управление на регистри

А що не си го нацвъкаш на асемблер?
примерно така:

MOVLW 0x08
MOVWF counter
label1:
BZ end
BSF outport,outbit
BTSS data_byte,7
BCF outport,outbit
BSF outport,clockbit
NOP - ако си под 16 MHz - няма нужда
BCF outport,clockbit
RLNCF data_byte,1
DEC counter
goto label1
end:
BSF outport,strobebit
{NOP}
BCF outport,strobebit

Автор:  palavrov [ Вто Ное 29, 2011 4:31 pm ]
Заглавие:  Re: Управление на регистри

perro_iv написа:
:rolleyes: Ами ще ми трябва малко време да захапя този кошмарен синтаксис ... :)

... C# направо ме е разглезил ...

Една безумна идея - вземи разгледай .NET MicroFramework - има разни контролери по $30-на ако не ме лъже паметта, направо си го програмираш на C# от Visual Studio - иначе лично аз не бих го ползвал ... 10-на инструкции на асемблер ще ги замениш с няколкостотин КБ итнерпретатор и виртуална машина :D

Автор:  perro_iv [ Вто Ное 29, 2011 4:55 pm ]
Заглавие:  Re: Управление на регистри

Ето го :

Код:
void initDspl1()
{

   //ShiftEnable LATBbits.LATB0

   //Shift_CLK LATBbits.LATB1

   //Shift_Data LATBbits.LATB2

   for (p = 0; p <= 7; p++)
   {
      char sout = 201; //11001001;
      unsigned int  bitCounter = 0;
      
      while(bitCounter < 8)
      {
          (sout & (1 << 7)) ? (Shift_Data = 1) : (Shift_Data = 0);   // <- магията става тук
          sout <<= 1;                                                 // <- и тук
              
          Shift_CLK = 1;
          Nop();
          Shift_CLK = 0;
              
          bitCounter++;
       }    
      
   }

   while (!PORTBbits.RB4);

   ShiftEnable = 0;
   Nop();
   ShiftEnable = 1;   
            
}


Благодаря за отговорите!
Магията не е чак толкова страшна:

(sout & (1 << 7)) ? (Shift_Data = 1) : (Shift_Data = 0)
този израз проверява седмия бит на sout, ако е единица - вдига информационния пин, ако не - обратно, следва завъртане

sout <<= 1;

и те така до 8

Тенкю още веднъж, просто ми трябваше малка подсказка ...

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/