roboforum.ru

Технический форум по робототехнике.

Подключение сдвиговых регистров

Подключение сдвиговых регистров

Vikidor » 13 сен 2011, 14:17

Я делаю первые шаги в освоении Arduino и микроконтроллеров вообще. Так что вопросы могут быть глупые, заранее извиняюсь.
В общем захотел подключить сдвиговый регистр для мигания светодиодами. Как это лучше сделать? Может кто видел в интернете что-нибудь похожее с описанием для новичков?
В описании atmega168 написано, что там уже есть Serial peripheral interface. Как до него добраться из Arduino IDE? Может уже есть там где библиотека? Как считывать/записывать регистры микроконтроллера, отвечающие за настройку работы этого интерфейса (да и вообще все настроечные регистры)?

Re: Подключение сдвиговых регистров

Vikidor » 13 сен 2011, 18:51

Сам задал вопрос, сам на него ответил, стоило только немного поискать :)
Информации, которая тут http://robocraft.ru/blog/arduino/519.html мне вполне достаточно

Re: Подключение сдвиговых регистров

avr123.nm.ru » 13 сен 2011, 19:05

Vikidor писал(а):Может уже есть там где библиотека?
наверняка есть. в google спрашивайте arduino и компонент, например: arduino spi или arduino hc595 - и получите много ответов с примерами.

Re: Подключение сдвиговых регистров

Vikidor » 19 сен 2011, 12:25

Не стал я использовать SPI. Решил напрямую управлять битами для тренировки. Написал программку, типа "Helo world". Программа выводит 2 байта в 3 последовательных регистра с параллельным выходом. Выходы регистров подключены к LED дисплею, который показывает цифирки.
Код: Выделить всёРазвернуть
#define OE_Reg 10 //Output Enable
#define LE_Reg 11 //Latch Enable
#define CLK_Reg 12 //Clock
#define SDI_Reg 13 //Serial Data Input

void setup()
{
  pinMode(OE_Reg, OUTPUT);
  pinMode(LE_Reg, OUTPUT);
  pinMode(CLK_Reg, OUTPUT);
  pinMode(SDI_Reg, OUTPUT);
}

void loop()
{
  digitalWrite(OE_Reg, HIGH);
  digitalWrite(LE_Reg, LOW);
  NumberToSymbol(555);
  digitalWrite(LE_Reg, HIGH);
  digitalWrite(OE_Reg, LOW);
  digitalWrite(LE_Reg, LOW);
  while(true){
  continue;
  }
}

void ByteSerialTransfer(byte Data)
{ // Последовательный вывод байта
  byte SendData = 0;
  for (int i=0; i < 8; i++)
  {
    digitalWrite(CLK_Reg, LOW);
    SendData = Data & B10000000;
    if (SendData == B10000000)
    {
      digitalWrite(SDI_Reg, HIGH);
    }
    else
    {
      digitalWrite(SDI_Reg, LOW);
    }
    Data = Data << 1;
    digitalWrite(CLK_Reg, HIGH);
  }
  digitalWrite(CLK_Reg, LOW);
}

void NumberToSymbol(int Number)
{ //Перевод числа в 3 байта символов дисплея
  byte symbol[10] = {
    B00101000, // 0
    B01101111, // 1
    B10100010, // 2
    B00100110, // 3
    B01100101, // 4
    B00110100, // 5
    B00110000, // 6
    B00101111, // 7
    B00100000, // 8
    B00100100  // 9
  };
  int SendNumber;
  SendNumber = Number;
  for (int i=0; i < 3;i++)
  {
    ByteSerialTransfer(symbol[SendNumber%10]);
    SendNumber /= 10;
  }
}

Собственно это моя первая программа. Хотел бы чтобы её кто-то покритиковал. Может что-то сделал не так или можно что-то улучшить.
На досуге спаяю схемку, проверю как работает.


Rambler\'s Top100 Mail.ru counter