Нужна помощь в реализации программного SPI

Жора
Offline
Зарегистрирован: 23.05.2015




Доброго времени суток, форумчане. Помогите советом, программировать начал совсем недавно проблема в том, что не могу корректно ни отправить, ни забрать значение переменных из функций  Read, Write. Вроде прием работает но чувствую шкурой как то через ж….у .

 

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int latchPinOut = 8;
int latchPinIn = 11;
int datapin = 9;
int clkpin = 10;
int Value;
int Val;
int Key;
void setup(){
  lcd.begin(16, 2);
  pinMode(latchPinIn, OUTPUT);
  pinMode(latchPinOut, OUTPUT);
  pinMode(clkpin, OUTPUT);   
}
 void one(){ 
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("one");
}
void two(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("two");
}      
void three(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("three");
}
void four(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("four");
}
void five(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("five");
}
void six(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("six");
}
void seven(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("seven");
}
void eight(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("eight");
}
void nine(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("nine");
}
void ten(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("ten");
}
void eleven(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("eleven");
}
void twelve(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("twelve");
}
void ButtonPress(){            
  switch (Value/2){
  case 9:     one();break;  
  case 17:    two();break;  
  case 33:  three();break;   
  case 65:   four();break; 

  case 10:   five();break;   
  case 18:    six();break;                 
  case 34:  seven();break;   
  case 66:  eight();break;   

  case 12:   nine();break; 
  case 20:    ten();break;   
  case 36: eleven();break;   
  case 68: twelve();break;  
  }
}
//Запись
void Write(){
  pinMode(datapin, OUTPUT);
  digitalWrite(latchPinOut, 1);
  shiftOut(datapin, clkpin, MSBFIRST, 0b11111111);
  digitalWrite(latchPinOut, 0);
}
     //Чтение
void Read(){  
  pinMode(datapin, INPUT);
  digitalWrite(latchPinIn, 0);
  digitalWrite(latchPinIn, 1);
  Value = shiftIn(datapin, clkpin, MSBFIRST);
}
void loop()
{   
  Read();
  Val=0b00001111&Value;
  if(Val>0){  
  ButtonPress(); 
  Write();  
  } 
}
  

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а для чего это все? как бы не совсем понятно

Жора
Offline
Зарегистрирован: 23.05.2015

Не получается загрузить картинку, на схеме было бы понятнее. Задача подключить матричную клавиатуру через ch165

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
Жора
Offline
Зарегистрирован: 23.05.2015

На форуме есть возможность загрузить проект из PROTEUS?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

неа. может стоит почитать статью

Жора
Offline
Зарегистрирован: 23.05.2015

Знаком с этой статьей, я не пойму как дороботать библиотеку keypad, а здесь почти все готово. только недопрет как работать с Write и Read ?

 
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

помнишь может у Райкина (вроде Райкин, не помню, но не суть): к пуговицам претензии есть?

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

Жора
Offline
Зарегистрирован: 23.05.2015

Так и есть, клава читаеться отлично.Вывод на LCD коректно, а вот как раз ch595 троит.Обрати внимание на 98ю строку я там в наглую забил значение 0b11111111 а она мне выводит то что я жму в ch165ю. Отсюда и вопрос что я делаю не так?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не помню откуда (настроение такое): ты хочешь научиться или сделать?

вот для 165

http://robocraft.ru/blog/arduino/520.html

https://www.arduino.cc/en/Reference/ShiftIn

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

Жора
Offline
Зарегистрирован: 23.05.2015

И научиься ,и зделать хочу. По поводу ссылок, я тоже их видел. Мне непонятно почему 595 выводит 0b10010000  (этот код выдает клава при нажатии кнопки 1)  В место того чтобы выводить 0b11111111 shiftOut(datapin,clockPin,LSBFIRST,0b11111111);  Логика следующая: через 165 я слушаю клаву,принимаю значение,вывожуна LCD нажатую кнопку и.т.д. через 595 управляю исполнительными механизмами. А 595я слушает не ардуинку а тупо копирует байт из 165й

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

протеус реально соответсвует по твоему реальной железке?

Жора
Offline
Зарегистрирован: 23.05.2015

Эта схема также и на столе себя ведет

Жора
Offline
Зарегистрирован: 23.05.2015

Нашел свою ошибку. По приведенной выше схеме запись и чтение информации производилась по одному проводнику (я встречал такие схемы в нете74HC165 and 74HC595), когда развел MISO и MOSI на разные пины 595 стала принимать значения с дуины. Но опять вопрос, почему приходится вызывать Write() из функции ButtonPress() строка 89 и в основном цикле loop() строка 123. Иначе не работает.

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int latchPinOut = 10;
int latchPinIn = 9;
int datapinOut = 11;
int datapinIn = 12;
int clkpin = 13;
int Value;
int Val;
int Key;
void setup(){
  lcd.begin(16, 2);
  pinMode(latchPinIn, OUTPUT);
  pinMode(datapinIn, INPUT);
  pinMode(latchPinOut, OUTPUT);
  pinMode(datapinOut, OUTPUT);
  pinMode(clkpin, OUTPUT);   
}
 void one(){ 
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("one");  
  lcd.setCursor(0,0);
  lcd.print(Key);
}
void two(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("two");  
  lcd.setCursor(0,0);
  lcd.print(Key);
}      
void three(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("three");  
  lcd.setCursor(0,0);
  lcd.print(Key);
}
void four(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("four");  
  lcd.setCursor(0,0);
  lcd.print(Key);
}
void five(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("five");
}
void six(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("six");
}
void seven(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("seven");
}
void eight(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("eight");
}
void nine(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("nine");
}
void ten(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("ten");
}
void eleven(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("eleven");
}
void twelve(){
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print("twelve");
}
void ButtonPress(){            
  switch (Value/2){
  case 9:     one();Key=2;Write();break;// <- И ЗДЕСЬ
  case 17:    two();Key=4;Write();break;  
  case 33:  three();Key=8;Write();break;   
  case 65:   four();Key=16;Write();break; 

  case 10:   five();break;   
  case 18:    six();break;                 
  case 34:  seven();break;   
  case 66:  eight();break;   

  case 12:   nine();break; 
  case 20:    ten();break;   
  case 36: eleven();break;   
  case 68: twelve();break;  
  }
}
//Запись
void Write(){  
  digitalWrite(latchPinOut, 1);
  shiftOut(datapinOut, clkpin, MSBFIRST, Key);
  digitalWrite(latchPinOut, 0);
}
     //Чтение
void Read(){   
  digitalWrite(latchPinIn, 0);
  digitalWrite(latchPinIn, 1);
  Value = shiftIn(datapinIn, clkpin, MSBFIRST);
}
void loop()
{   
  Read();
  Val=0b00001111&Value;
  if(Val>0){  
  ButtonPress(); 
  Write();  // <-ЗДЕСЬ
  } 
}