Неправильно работают 7-сегментные индикаторы.

Paul_it
Offline
Зарегистрирован: 25.06.2019

Здравствуйте! Я школьник, интересуюсь ардуиной. Хочу сделать термометр с выводом на 2 одноразрядных семисегментных индикатора с сдвиговыми регистрами 74HC595. Код для термометра пашет отлично, а вот с каскадом все плохо. Семисегментники горят всеми огнями и не реагируют на цифры вводимые в последовательный порт. Железо поставил правильно, получается проблема в коде. Код брал отсюда: http://arduino.ru/Tutorial/registr_74HC595 , думал доработать но не смог. Вот мой код:

#define CLOCK 13
#define DATA 12 //замена слов на порты к сдвиговикам
#define LATCH 8

int i;
int t;
int r;          //переменные
int y;
int g;
int w;
int firtemp;
int h = 1000;
byte inf[10] {                                     
  0b11111100,
  0b01100000,
  0b11011010,
  0b11110010,
  0b01100110,
  0b10110110,
  0b10111110,                //массив с байтами, посылаемыми в сдвиговики
  0b11100000,
  0b11111110,
  0b11110110
};
void setup() {
  pinMode(CLOCK, OUTPUT);
  pinMode(DATA, OUTPUT);                //пинмоды
  pinMode(LATCH, OUTPUT);
//  digitalWrite(LATCH, HIGH);  //не знаю нужна ли эта строчка
  Serial.begin(9600);            //открыл порт
}
void loop() {
  w = Serial.parseInt();              //ввод в порт числа
  g = fun(w);   //выделение десятков из числа
  Serial.println(g);    //печать десятков
  g = inf[g];     //присвоение числу десятков, байта из массива, соответствующего числу
  y = prim(w); 
  Serial.println(y);           //то же с единицами
  y = inf[y];
  shift(y);          //продвигаем байты в регистры, сначала второй, потом первый
  shift(g);
  delay(h);        //задержка(потом переделаю)
}
void shift(int ry) {
  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLOCK, LSBFIRST, ry);    //продвигалка
  digitalWrite(LATCH, HIGH);
}
void outshift(int ry) {
  digitalWrite(LATCH, LOW);
  shiftOut(DATA, CLOCK, MSBFIRST, ry);   //продвигалка наоборот                                 //блоки функций
  digitalWrite(LATCH, HIGH);
}
int fun(int number) {
  int r = number / 10;           //вычисление десятков
  return r;
}
int prim(int num) {
  int g = fun(num);
  int t = num - g * 10;               //вычисление единиц
  return t;
}

Забыл прочитать как вставлять код. Сделал наобум. Извиняюсь.

svm
Offline
Зарегистрирован: 06.11.2016

А если выкинуть все лишнее и просто присвоить g и y какие-то значения (допустим 1 и 2 ), работает? А 29 строка скорее всего нужна.

Paul_it
Offline
Зарегистрирован: 25.06.2019

Нет не реагирует вообще. Насчет 29 строки спасибо. учту

svm
Offline
Зарегистрирован: 06.11.2016

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

Paul_it
Offline
Зарегистрирован: 25.06.2019

Ок. Сделаю - отпишусь.

svm
Offline
Зарегистрирован: 06.11.2016

А в сериал правильные цифры выводит?. Усли Да, то скорее всего ошибки в монтаже.

Paul_it
Offline
Зарегистрирован: 25.06.2019

Работает. Все таки это скетч.

svm
Offline
Зарегистрирован: 06.11.2016

Paul_it пишет:

Работает. Все таки это скетч.

И что было?

Paul_it
Offline
Зарегистрирован: 25.06.2019

 

svm пишет:

А в сериал правильные цифры выводит?. Усли Да, то скорее всего ошибки в монтаже.

Цифры выводит правильные, но это только маленький кусок кода. Я уже даже пробовал и MSBFIRST и подключать по другому. Не получается.

Paul_it
Offline
Зарегистрирован: 25.06.2019

 

svm пишет:

Paul_it пишет:

Работает. Все таки это скетч.

И что было?

Поочередно загорается каждый сегмент второго индикатора, а затем первого. (для ардуины наоборот).

Потом тухнет.

svm
Offline
Зарегистрирован: 06.11.2016

Это работает последний пример?

Paul_it
Offline
Зарегистрирован: 25.06.2019

Самый последний. 2.2

svm
Offline
Зарегистрирован: 06.11.2016
 
  // "проталкиваем" байты в регистры
  shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
  shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
 
  // "защелкиваем" регистр, чтобы биты появились на выходах регистра
  digitalWrite(latchPin, HIGH); 

Замени во 2 и 3 строке последние параметры на любые цифры из массива inf твоего кода и посмотри что получится

Paul_it
Offline
Зарегистрирован: 25.06.2019

Работает просто збс! Даже 7-сегментники не глючат!

Paul_it
Offline
Зарегистрирован: 25.06.2019

Может надо переписать массив под MSBFIRST?

svm
Offline
Зарегистрирован: 06.11.2016

А зачем? Что не так? Думаю дальше сам разберешься.

Paul_it
Offline
Зарегистрирован: 25.06.2019

Ладно, сейчас попробую. Но не факт: в программировании я новичок, так что могу быть тупым на совершенно очевидных вещах. Так что могу потом еще спросить.

svm
Offline
Зарегистрирован: 06.11.2016

Paul_it пишет:

Ладно, сейчас попробую. Но не факт: в программировании я новичок, так что могу быть тупым на совершенно очевидных вещах. Так что могу потом еще спросить.

Если мозги работают, то пара тройка дней и сам будешь новичков учить. Удачи!

Paul_it
Offline
Зарегистрирован: 25.06.2019

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Paul_it пишет:

Неправильно работают 7-сегментные индикаторы

Никогда так не говорите (не пишите). Просто, никогда. Такие формулировки сразу же вызывают отторжение, неприятие и желание ответить "Это мозги у тебя неправильно работают". Техника всегда работает так, как сделана, а программа так, как написана.

Это не наезд, просто совет как писать вопросы, чтобы не вызывать раздражение первой же фразой.

svm
Offline
Зарегистрирован: 06.11.2016

Вот на всякий случай для общего развития http://arduino.ru/forum/apparatnye-voprosy/displei-16kh1-ot-kkm-elves-mikro#comment-417911 правда там 8 разрядов, но управление регистрами очень похожее. Может что-нибудь прояснит.