74HC595 & LCD нужна подсказка

achechet
Offline
Зарегистрирован: 04.02.2012

Попробовал эту библиотеку:

http://arduino.cc/playground/Main/LiquidCrystal#Description

но что то не получается и с какого боку копать не понятно.

Может кто победил ее?

LCD напрямую работет, а вот через регистр никак.

step962
Offline
Зарегистрирован: 23.05.2011

 Первое, что приходит на ум - неправильное подключение микросхемы. Но на приведенной  фотографии ее не видно. Что-то посоветовать невозможно.

Второе, что приходит на ум - какая-то ошибка в программе. Но программа тоже не приведена. Обсуждать нечего.

Третье, что приходит на ум - требуется рабочее решение "с нуля". Едва ли кто-то бросится решать эту задачу для вас. Остается поиск... Google и Yandex вам в помощь. Почитайте, например, что советует известный персонаж на арене Arduino - ladyada (ответ #5). Может быть, что-то прояснится.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Рекомендую для прочтения статью на Робокрафте robocraft.ru/blog/arduino/541.html - там не только увеличивают количество входов и выходов, но и переопределяют драйвера управления пинами таким образом, чтобы стандартные библиотеки работали через расширенные порты. Там и найдете решение.

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Сейчас я тоже занялся lсd дисплеем через регистр. Попытался сделать как написано в статье. Тот же код так же подключил дисплей через 2 регистра. Толку 0. Стать я не очень хорошо написана. Я ничего не понял из неё. А особенно скажите откуда берётся переменная uint8_t. Я когда статью про регистры читал она тоже там присутствовала. Но не где не написано что это. 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

unit8_t это не переменная, это тип данных, соответствует unsigned char. У автора, наверно, хедер от атмеги подключен, и он привык к этому типу.

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

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

 

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Это ж просто "бегающий бит" по внешнему регистру.

В статье, на которую я указал много всего:

1. Определяется новый интерфейс:

2. Драйвер по-умолчанию

3. Расширяют (переопределяют) класс LiquidCrystal

4. Добавляют поддержку интерфейса LineDriver в класс для работы с SPI

5. Передают указатель на объект сдвигового регистра в конструктор объекта LCD

P.S. Все тексты программ взяты из статьи Подключаем кучу устройств к Arduino по 5 проводам / Arduino-мания :) / RoboCraft

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Это всё я уже видел. И ничего не понял из того что написано. В конечном итоге все эти манипуляции в библиотеке сводятся тому что мы её скачиваем и ставим к себе уже готовую. А что писать в скетче мне не ясно. И как подключить дисплей к регистру? Можно ли обойтись одним регистром? Об этом ничего не сказано.  

Про бегающий бит тоже есть вопросы.
Как работает это
void rotateLeft(uint8_t &bits)
{
uint8_t high_bit = bits & (1 << 7) ? 1 : 0;
bits = (bits << 1) | high_bit;
}
Что значит эта строка и что она хранит
static uint8_t nomad = 1; // это наш бегающий бит
как выставляются выходы если судя по записи мы туда послали единицу?
SPI.transfer(nomad);
 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Это просто зацикленный сдвиг битов. Вам, как я понимаю, она Вам вообще никаким боком не нужна.

Ну а работает она просто. В первой строке проверяется наличие старшего бита (1<<7) - маска, "переводится" как 1, сдвинутый влево 7 раз. То есть это ни что иное, как 0b10000000 (двоич.) Если старший бит есть, то промежуточная переменная устанавливается в 1 (0b00000001) - для переноса при сдвиге старшего бита в позицию младшего.

Во вторй строке содержимое bits сдвигается на одну позицию влево и, если был старший бит (high_bit), то он записывается в младшую позицию.

А чтобы было понятно, что писать в скетче, нужно понимать, "как это работает". Ну или хотя бы схему и скетч "в студию" - поможем разобраться.

Послать единицу, это послать 110=000000012 - то есть в 1 установится 1 выход из 8 на регистре

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

С самим регистром и статьёй я разобрался. Понял как работает SPI.transfer(nomad); или
shiftOut(dataPin, clockPin, MSBFIRST, numberToDisplay) (статья); только мне непонятна эта переменная MSBFIRST. А так всё ок. Возник вопрос в shiftOut можно задать пины какие хочеш (1,2,3) а в SPI.transfer я так понял нет?

Вторая часть моего вопроса. С регистром для одного проекта разобрался но для другого необходимо 2 регистра. На одном висит монитор на другом светодиоды.  Как подключить монитор (16/2) к регистру? Только необходимо монитор полностью к регистру привязать. И что писать в скетче? Ориентируюсь на статью.
 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Шикарно разобрался))))))

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Опять что то не работает. Перетыкал провода и снова не пашет 

achechet
Offline
Зарегистрирован: 04.02.2012

Я вроде разобрался с подключением и библиотеками.

Их много и разные, поэтому много путаницы.

В результате схема:

Библиотека к ней LiquidCrystal_v1.1.7.1.zip

И скетч:

01#include <LiquidCrystal_SR.h>
02 
03LiquidCrystal_SR lcd(11,12,8);
04//                   |  |  | Enable Pin
05//                   |  \-- Clock Pin
06//                   \---- Data Pin
07 
08// Creat a set of new characters
09byte armsUp[8] = {0b00100,0b01010,0b00100,0b10101,0b01110,0b00100,0b00100,0b01010};
10byte armsDown[8] = {0b00100,0b01010,0b00100,0b00100,0b01110,0b10101,0b00100,0b01010};
11 
12void setup(){
13 
14  lcd.begin(16,2);               // initialize the lcd
15 
16  lcd.createChar (0, armsUp);    // load character to the LCD
17  lcd.createChar (1, armsDown);    // load character to the LCD
18 
19  lcd.home ();                   // go home
20  lcd.print(F("LiquidCrystal_SR"));
21}
22 
23void loop(){
24  // Do a little animation
25  for(int i = 0; i <= 15; i++) showHappyGuy(i);
26  for(int i = 15; i >= 0; i--) showHappyGuy(i);
27}
28 
29void showHappyGuy(int pos){
30  lcd.setCursor ( pos, 1 ); // go to position
31  lcd.print(char(random(0,2))); // show one of the two custom characters
32  delay(150); // wait so it can be seen
33  lcd.setCursor ( pos, 1 ); // go to position again
34  lcd.print(F(" ")); // delete character
35}

Ну и наконец на бредборде:

 Буду рад если кому то это помогло!

anton_kulibin
Offline
Зарегистрирован: 28.10.2012

Всем добрый день, никак не могу разобраться с подключение lcd через регистр, может есть у кого нибудь схемка? Делал все как в статье  robocraft.ru/blog/arduino/541.html, но чтото не выходит

dimka
dimka аватар
Offline
Зарегистрирован: 21.09.2012

с Arduino (назовем её мама) отправляем команды через Serial Pin (D1 - TX) символы например // Serial.println('W');..

Atmega328 (назовем её дочка) слушает команды через ВХод Serial Pin (D0 - RX) ..

В зависимости от пришедшего символа от мамы,дочка выполнит что хотим.

Таким способом через всего один пин на Arduino 

мы можем управлять дополнительно 18 пинами.



Постскриптум В этом уроке я демонстрирую взаимодействия 2 ARDUINO через Serial

саму идею можно расширять до бесконечности.

Учитывая падение цен на Microcontrolle?r ATMEGA328, 

получается довольно приятная альтернатива, микросхемам сдвиговым регистрам 74HC595,74HC165



----------------------------------------­-- 

скетч sketch: v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins

http://yadi.sk/d/lIVZHuBq7GMhG

================================ 

что нам понадобиться. 

Аппаратное:

1. Arduino -1 штука.

2. ATMEGA328P-PU Microcontrolle?r With ARDUINO UNO Bootloader -1 штука.

3. 16.000MHZ 16MHZ 16M HZ HC-49S Crystal Oscillator -1 штука.

4. Светодиоды нужны только для визуального контроля за процессом.

001/*             v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins
002 sketch  №1  мама - mother                              
003  
004 ****************************
006 v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins
007 Version 0.1-2013/07/27
008 -----------------------------
009 изменения; в Version 0.1-2013/07/27
010 1.
011 2.
012 ------------------------------
013 идеология;
014 с Arduino (назовем её мама) отправляем команды через Serial Pin (D1 - TX)  символы например // Serial.println('W');..
015 Atmega328 (назовем её дочка) слушает команды через ВХод Serial Pin (D0 - RX) ..
016 В зависимости от пришедшего символа от мамы,дочка выполнит что хотим.
017 Таким способом через всего один пин на Arduino
018 мы можем управлять дополнительно 18 пинами.
019  
020 Постскриптум  В этом уроке я демонстрирую взаимодействия 2 ARDUINO через Serial
021 саму идею можно расширять до бесконечности.
022 Учитывая падение цен на Microcontrolle?r ATMEGA328,
023 получается довольно приятная альтернатива, микросхемам сдвиговым регистрам 74HC595,74HC165
024  
025 ------------------------------------------
026 скетч sketch: v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins
028 ================================
029 что нам понадобиться.
030 Аппаратное:
031 1. Arduino -1 штука.
032 2. ATMEGA328P-PU Microcontrolle?r With ARDUINO UNO Bootloader -1 штука.
033 3. 16.000MHZ 16MHZ 16M HZ HC-49S Crystal Oscillator -1 штука.
034 4. Светодиоды нужны только для визуального контроля за процессом.
035 --------------------------------
036 программное:
037 =======================================================
038 подробную видео инструкцию выложу здесь
039  
040 ++++++++++++++++++++++++++++++
041 Вспомогательные видео обзоры, скетчи.....
042  
043 Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
045  
046 */
047 
048 
049void setup() {
050  //Инициирует последовательное соединение и задает скорость передачи данных в бит/c (бод). Для обмена данными
051  Serial.begin(9600);
052}
053 
054void loop() { 
055  //отправляем дочке команды 
056  Serial.println('W');
057  delay(1000);
058  Serial.println('E');
059  delay(1000);        
060  Serial.println('R');
061  delay(1000);
062  Serial.println('T');
063  delay(1000);        
064  Serial.println('Y');
065  delay(1000);
066  Serial.println('U');
067  delay(1000);        
068  Serial.println('I');
069  delay(1000);
070  Serial.println('O');
071  delay(1000);        
072  Serial.println('P');
073  delay(1000);
074  Serial.println('A');
075  delay(1000);        
076  Serial.println('S');
077  delay(1000);
078  Serial.println('D');
079  delay(1000);        
080  Serial.println('F');
081  delay(1000);
082  Serial.println('G');
083  delay(1000);        
084  Serial.println('H');
085  delay(1000);
086  Serial.println('J');
087  delay(1000);        
088  Serial.println('K');
089  delay(1000);
090  Serial.println('L');
091  delay(1000);
092}
093 
094 
095**************************************************************************************************************
096 
097 
098/*             v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins
099 sketch  №2  дочка - child                              
100  
101 ****************************
103 v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins
104 Version 0.1-2013/07/27
105 -----------------------------
106 изменения; в Version 0.1-2013/07/27
107 1.
108 2.
109 ------------------------------
110 идеология;
111 с Arduino (назовем её мама) отправляем команды через Serial Pin (D1 - TX)  символы например // Serial.println('W');..
112 Atmega328 (назовем её дочка) слушает команды через ВХод Serial Pin (D0 - RX) ..
113 В зависимости от пришедшего символа от мамы,дочка выполнит что хотим.
114 Таким способом через всего один пин на Arduino
115 мы можем управлять дополнительно 18 пинами.
116  
117 Постскриптум  В этом уроке я демонстрирую взаимодействия 2 ARDUINO через Serial
118 саму идею можно расширять до бесконечности.
119 Учитывая падение цен на Microcontrolle?r ATMEGA328,
120 получается довольно приятная альтернатива, микросхемам сдвиговым регистрам 74HC595,74HC165
121  
122 ------------------------------------------
123 скетч sketch: v.01 Arduino увеличиваем кпличество пинов Atmega328 Increase pins
125 ================================
126 что нам понадобиться.
127 Аппаратное:
128 1. Arduino -1 штука.
129 2. ATMEGA328P-PU Microcontrolle?r With ARDUINO UNO Bootloader -1 штука.
130 3. 16.000MHZ 16MHZ 16M HZ HC-49S Crystal Oscillator -1 штука.
131 4. Светодиоды нужны только для визуального контроля за процессом.
132 --------------------------------
133 программное:
134 =======================================================
135 подробную видео инструкцию выложу здесь
136  
137 ++++++++++++++++++++++++++++++
138 Вспомогательные видео обзоры, скетчи.....
139  
140 Самый дешевый Arduino Uno 5$ Minimal Atmega328 without Arduino Board
142  
143 */
144 
145 
146int ledPin2 = 2;
147int ledPin3 = 3;
148int ledPin4 = 4;
149int ledPin5 = 5;
150int ledPin6 = 6;
151int ledPin7 = 7;
152int ledPin8 = 8;
153int ledPin9 = 9;
154int ledPin10 = 10;
155int ledPin11 = 11;
156int ledPin12 = 12;
157int ledPin13 = 13;
158 
159int ledPin14 = 14;
160int ledPin15 = 15;
161int ledPin16 = 16;
162int ledPin17 = 17;
163int ledPin18 = 18;
164int ledPin19 = 19;
165 
166int incomingByte;  // для хранения полученных команд от Arduino - мамы  
167 
168void setup() {
169  //Инициирует последовательное соединение и задает скорость передачи данных в бит/c (бод). Для обмена данными
170  Serial.begin(9600);
171 
172  pinMode(ledPin2, OUTPUT);
173  pinMode(ledPin3, OUTPUT);
174  pinMode(ledPin4, OUTPUT);
175  pinMode(ledPin5, OUTPUT);
176  pinMode(ledPin6, OUTPUT);
177  pinMode(ledPin7, OUTPUT);
178  pinMode(ledPin8, OUTPUT);
179  pinMode(ledPin9, OUTPUT);
180  pinMode(ledPin10, OUTPUT);
181  pinMode(ledPin11, OUTPUT);
182  pinMode(ledPin12, OUTPUT);
183  pinMode(ledPin13, OUTPUT);
184 
185  pinMode(ledPin14, OUTPUT);
186  pinMode(ledPin15, OUTPUT);
187  pinMode(ledPin16, OUTPUT);
188  pinMode(ledPin17, OUTPUT);
189  pinMode(ledPin18, OUTPUT);
190  pinMode(ledPin19, OUTPUT);
191 
192}
193 
194void loop() {
195  if (Serial.available() > 0)  //если есть доступные данные
196 
197    incomingByte = Serial.read();
198 
199  if (incomingByte == 'W') digitalWrite(ledPin2, HIGH),delay(1000),digitalWrite(ledPin2, LOW);
200  if (incomingByte == 'E') digitalWrite(ledPin3, HIGH),delay(1000),digitalWrite(ledPin3, LOW); 
201  if (incomingByte == 'R') digitalWrite(ledPin4, HIGH),delay(1000),digitalWrite(ledPin4, LOW);
202  if (incomingByte == 'T') digitalWrite(ledPin5, HIGH),delay(1000),digitalWrite(ledPin5, LOW);
203  if (incomingByte == 'Y') digitalWrite(ledPin6, HIGH),delay(1000),digitalWrite(ledPin6, LOW);
204  if (incomingByte == 'U') digitalWrite(ledPin7, HIGH),delay(1000),digitalWrite(ledPin7, LOW);
205  if (incomingByte == 'I') digitalWrite(ledPin8, HIGH),delay(1000),digitalWrite(ledPin8, LOW);
206  if (incomingByte == 'O') digitalWrite(ledPin9, HIGH),delay(1000),digitalWrite(ledPin9, LOW); 
207  if (incomingByte == 'P') digitalWrite(ledPin10, HIGH),delay(1000),digitalWrite(ledPin10, LOW);
208  if (incomingByte == 'A') digitalWrite(ledPin11, HIGH),delay(1000),digitalWrite(ledPin11, LOW);
209  if (incomingByte == 'S') digitalWrite(ledPin12, HIGH),delay(1000),digitalWrite(ledPin12, LOW); 
210  if (incomingByte == 'D') digitalWrite(ledPin13, HIGH),delay(1000),digitalWrite(ledPin13, LOW);
211 
212  if (incomingByte == 'F') digitalWrite(ledPin14, HIGH),delay(1000),digitalWrite(ledPin14, LOW);
213  if (incomingByte == 'G') digitalWrite(ledPin15, HIGH),delay(1000),digitalWrite(ledPin15, LOW); 
214  if (incomingByte == 'H') digitalWrite(ledPin16, HIGH),delay(1000),digitalWrite(ledPin16, LOW);
215  if (incomingByte == 'J') digitalWrite(ledPin17, HIGH),delay(1000),digitalWrite(ledPin17, LOW);
216  if (incomingByte == 'K') digitalWrite(ledPin18, HIGH),delay(1000),digitalWrite(ledPin18, LOW);
217  if (incomingByte == 'L') digitalWrite(ledPin19, HIGH),delay(1000),digitalWrite(ledPin19, LOW);
218}

 

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Тогда уж лучше связывать по SPI или TWI.

А теперь сравним быстродействие :) Ведомая ардуина имеет смысл только, если занимается еще чем-то, скажем, динамической индикачией. А просто плодить таким образом выходы... я бы не стал. Контроллер и повиснуть может...

Slavin
Offline
Зарегистрирован: 04.02.2013

Случаем не подскажете что может означать ошибка:

In file included from sketch_jan12a.ino:4:
E:\arduino\libraries\LiquidCrystal_SR/LiquidCrystal.h:86: error: conflicting return type specified for 'virtual void LiquidCrystal::write(uint8_t)'
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/Print.h:48: error:   overriding 'virtual size_t Print::write(uint8_t)'

MexaH
Offline
Зарегистрирован: 06.07.2014

не могу найти LiquidCrystal_v1.1.7.1.zip выложите пожалуйста

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

MexaH пишет:
не могу найти LiquidCrystal_v1.1.7.1.zip выложите пожалуйста

Первая же ссылка в гугле - https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

MexaH
Offline
Зарегистрирован: 06.07.2014

спасибо большое! всё заработало

MexaH
Offline
Зарегистрирован: 06.07.2014

спасибо большое! всё заработало