Как управлять 74HC595 без Arduino

ich
Offline
Зарегистрирован: 10.06.2012

Здравствуйте, я собрал себе простейшую схему на 74HC595 для изучения Регистра с помощью Arduino.

Пользуясь описанием функции shiftOut() я наглядно увидел работу 74HC595 а прочитав вот эту статью я понял что регистрам можно управлять и без контроллера.

Так вот мой вопрос в том, как можно спомощью обычных кнопок управлять регистром?

Такой вот у меня ход мысли:

Выжные Pin's дла меня это DATA IN, LATCH и CLK.

С помощью DATA IN я сообщаю какой бит должен быть передан, при + двигаю 1 а при - двигаю 0.

С помощью CLK даю знать что я начинаю двигать бит, при + двигаю а при - нет.

С помощью LATCH я сообщаю что всё готово и передаю данный на "паралелльный порт", при + выдаю данные на паралельные Pin's.

Я пробывал с помощью 6-ти кнопок это дело обмануть, т.е на каждый из входов по две кнопки, для + и -.

При тесте я ставил LATCH на -,затем CLK на + (наченаю двигать), затем DATA IN на + (чтобы двинуть 1) после чего CLK на - (больше не двигаю), LATCH на + (вывожу на паралельные выходы).

По моим рассуждениям должен гореть первый светодиод. Но ничего не происходит.

 

Пожалуйста подкажите как можно управлять регистром с помощью кнопок и без контроллера.

maksim
Offline
Зарегистрирован: 12.02.2012

Для управления регистром помимо 3 кнопок вам необходимо  3 резистора (на 5 - 10 кОм) и 3 конденсатора (10 - 50 кмФ). Все это нужно для того, что бы исключить дребезг кнопок. 

mixail844
Offline
Зарегистрирован: 30.04.2012

а вашу схему подключения кнопк к сдвигомому регисру можно увидеть ?

у вас учтено что (LE)' выдает содержимое регистров  на выходы при логическом "0"?

то есть пока вы тыкаете по кнопкам входов(DS-Data In,SHCP- CLK),положение кнопки (LE )' - (LATCH ENABLE)' должно быть,как следует из даташита, нажатым - вположении '+',а при "отжимании"(закарачивании на Gnd),то есть после перехода из пложения '+' -> '-' она даст "добро" на вывод содержимого регистров.

к тому же как мне кажеться желательно все входы подключить через подтягивающие резисторы(1k-10k) для избежания дребезгов кнопок

maksim
Offline
Зарегистрирован: 12.02.2012

Подключить можно так

Tamer
Tamer аватар
Offline
Зарегистрирован: 24.06.2012

maksim

напишите плз номиналы кондеров и резисторов для устранения дребезга,  а то плохо видно

maksim
Offline
Зарегистрирован: 12.02.2012

Выше написано. На схеме резисторы по 10 кОм, а конденсаторы по 10 кмФ.

ich
Offline
Зарегистрирован: 10.06.2012

Спасибо всем огромное за быстрый ответ.

Я думаю главной моей проблемой всётаки было то, что я думал для вывода регистра надо LE перевести с "-" на "+" а не наоборот.

Плюс ко всему по моей схеме видно, что переключение с "+" на "-" и обратно соправаждается " не определённым сосоянием" т.е. когда кнопка и не на "+" и не на "-". На схеме от maksim ,благодоря резистарам, достаточно одной кнопки, чтобы переключится с "+" на "-", что конечно избавляет схему от "не определённого состояния" и переключения проходит непосредственно с "+" к "-". Гениально !!!

П.С. Я извеняюсь за такие выражения как ("не определённое состояние"), я не знаю как это состояние называется правельно ;-). И примитивность моей схемы связанно с тем что я Хобби-самоделкин и увлёкся электроникой совсем недавно. Практически ничего ещё не знаю :-D

ich
Offline
Зарегистрирован: 10.06.2012

Хочу в догонку утачнить пару деталей.

Для чего конкретно нужен Конденсатор. С сопротивлениями вроде всё понятно, но вот Конденсаторы. И ещё, это елекролитические коденсаторы по 10 микрофарад или что значит "к" перед "мф"? Может всёже "мкФ"?

maksim
Offline
Зарегистрирован: 12.02.2012

Конденсаторы нужны для устранения дребезга контактов, без них за одно нажатие на кнопку вы будете получать несколько срабатываний. Тип конденсаторов любой. А кмФ - это очепятка мкФ (микрофарад). 

maksim
Offline
Зарегистрирован: 12.02.2012

Можно и меньшей емкости, в данном случае (10 кОм и 10 кмФ) конденсатор заряжается - разряжается примерно за пол секунды. В принципе это очень долго, но гарантировано исключен дребезг.

mixail844
Offline
Зарегистрирован: 30.04.2012

главная инрига,заработало или нет?)) 

ich
Offline
Зарегистрирован: 10.06.2012

mixail844 пишет:

главная инрига,заработало или нет?)) 

Держу интригу дальше. Пока нет времени проверить, надеюсь на выходных получится попробывать. Отпешусь обязательно.

ich
Offline
Зарегистрирован: 10.06.2012

Значит так. Всё как в схеме от maksim'а наминалы те же 10мкФ и 10кОм.

При отправки единицы всё работает идеально, тоесть если я отправляю друг за другом только еденици то видно как светодеоды зажигаются друг за другом. После того как все выходы стоят на 1, эфекта уже ни кокого не видно, всё деоды просто горят, так как регистр просто двигает дальше.

Примерно выглядит так (при первом старте все деоды на 0, я двигаю только 1)

А: 00000000 (старт, ни чего не двигал)

Б: 00000001 (двигаю 1)

В: 00000011 (...)

Г: 00000111 (...)

Д: 00001111 (...)

Е: 00011111 (...)

Ё: 00111111 (...)

Ж:01111111 (...)

З: 11111111 (...) (конец, так как у меня тольно один регистр дальше ничё не меняется, некуда двигать)

Но вот стоит послать 0, все выходы устанавливаются на 0 и деоды гаснут.

А: 11111111 (старт все диоды на 1)

Б: 00000000 (двигаю 0) всё погасло, а хотелось 11111110 -> 11111100 -> 11111000 и так далее

И еще, я делаю эту схемку для наглядного пособия, чтобы разобраться по подробнее. По этому от управления контролером я тоже не отказался, т.е. хочу чтобы ввод был и кнопками и контроллером. Для того чтобы кнопки случайно не нажать во время работы контроллера, я установил выключатель на плюс кнопок.

Синими проводками это моя отсебячена, так вот выглядит моя схема. МК- это Микроконтроллер

Но вот проблема в том, что теперь контроллер тоже не может двигать я пологаю что это из за кондёров. Микроконтроллер очень коротко отправляет сигнал на CLK и из за зарядки кондёра сигнал просто не успевает дойти.

Дла этого я переписал функцию shiftOut и встроил паузу, чтобы успевал зарядится кондёр, но это тоже ничего не изменило.

Стоит только отпаять кондёры от ног регистра, сразу всё начинает работать.

Вот скеч которым я играюсь:

//**************************************************************//
//  Name    : shiftOutCode, Hello World                                
//  Author  : Carlyn Maw,Tom Igoe, David A. Mellis 
//  Date    : 25 Oct, 2006    
//  Modified: 23 Mar 2010                                 
//  Version : 2.0                                             
//  Notes   : Code for using a 74HC595 Shift Register           //
//          : to count from 0 to 255                           
//****************************************************************

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
////Pin connected to DS of 74HC595
int dataPin = 11;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;




void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void shiftOutM(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, byte val)
{
	int i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));

		digitalWrite(clockPin, HIGH);
                delay(100);
		digitalWrite(clockPin, LOW);
	}
}

void loop() {
  // count from 0 to 255 and display the number 
  // on the LEDs
  for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) {
    // take the latchPin low so 
    // the LEDs don't change while you're sending in bits:
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOutM(dataPin, clockPin, MSBFIRST, numberToDisplay);  

    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
  }
}

Может вообще убрать кондёры, и надеятся что дребезга не будит?

maksim
Offline
Зарегистрирован: 12.02.2012

Для RC цепи 10 кОм и 10 мкФ задержки в 100 миллисекунд мало, как минимум 500, а лучше 1000 и где задержка задвижки и задержка данных??? По поводу "все светодиоды тухнут" подробнее опишите, что в какой момент нажимаете...

ich
Offline
Зарегистрирован: 10.06.2012

Для начало хочу извениться за не правельную информацию. Я дал ссылку на не правельное описание регистра. Вот тут правельное.

К счастью разницы почти нет.

Теперь обратно к проблеме: Я добавил задержку на задвижку и данные. Везде задержка 1000.

После этого регистр стал себя васти (при управлении МК) точно так же как и кнопками. Т.е. единицы записываются, а при отправки нуля весь регистр сбрасывается на 0. После того как я убрал Конденсатор с CLK, контроллер начал правельно писать в регистр. К тому же управление кнопками стало возможным (еденицы и нули можно записывать кнопками) с одним НО.

Теперь про но. Дребезг кнопки CLK иногда приводит к тому, что за место одного такта срабатывают два и более. Пробывал ставить кондёр на 1мкф эфект такойже как и с 10мкф.

Может мне лучше резистор поменьше выбрать, если да то каой?

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте, уменьшить сопративление до 1 кОм.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Постоянную времени R1C1 - выбираем миллисекунд 50.....100.  А цепочка R2C1 - дребезг не уберёт....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ich
Offline
Зарегистрирован: 10.06.2012

Всё это уже опробованно, путём вырешевания и подбора. Не что это от дребезга не освобождает. Пробовал даже катушку подключать. Тоже не помогло.

Две веши каторые помогли решить проблемму: либо "тригер шмитта" либо "негаторы".