Attiny13 и каскад сдвиговых регистров

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

Хочу подсоединить сдвиговые регистры с прилагающимися семисегментниками к аттини13.

На аттини пишу на процессинге, потому что на си пока что только светодиодом моргаю.

Код - это код с ардуино переделанный мной под аттини13. Собственно поменял только номера портов и убрал сериал. Код под каскад из двух регистров, но он не заработал вообще. Попробовал первый пример с одним регистром из http://arduino.ru/Tutorial/registr_74HC595

Он тоже не заработал. Подключение правильное, регистры и сегментники целые, питание есть, все провода подключены туда. Можете подсказать почему не работает?

Программатор - Arduino Uno as ISP.

Переделанный код каскада:

const int latchPin = PB2;
const int clockPin = PB4;
const int dataPin = PB3;
int i;
int t;
byte r;
byte y;
byte inf[10] {
  0b11111100,
  0b01100000,
  0b11011010,
  0b11110010,
  0b01100110,
  0b10110110,
  0b10111110,
  0b11100000,
  0b11111110,
  0b11110110
};
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}

void loop() {
  int x = 0;
  registerWrite(x);
  delay(500);
  registerWrite(x+=1);
  if(x==99){
    x = 0;
  }
}
void registerWrite(int whichState) {
  t = fun(whichState);
  i = prim(whichState);
  r = inf[t];
  y = inf[i];
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, y);
  shiftOut(dataPin, clockPin, LSBFIRST, r);
  digitalWrite(latchPin, 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;
}

Код примера на сайте.

b707
Offline
Зарегистрирован: 26.05.2017

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

Если с железом все нормально, ваш код хоть и не будет показывать вам возрастающие числа от 0 до 99, как вы хотели - но хотя бы ноль показать должен...

а вообще посоветую разделить задачу на программную и аппартную части. Атини13 - не лучший полигон для изучения программирования. Для начала отладьте свой код на стандартной Уно - поверьте. там есть что отлаживать, код мягко говоря кривой и не делает того. что вы задумали. а когда отладите на уно - попытаетесь перенести на тини, это отдельный геморой...

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

b707 пишет:
но хотя бы ноль показать должен...
Вы, однако, оптимист!

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

Попробовал с Уно, и что то произошло с регистрами. Один сгорел, а второй сошел с ума: стал выкидывать рандомные комбинации на сегментнике.

Регистр заменил, нарыл на флешке рабочую версию, работает на Уно каскадом. На аттини не пробовал.

//Пин подключен к ST_CP входу 74HC595
const int latchPin = 5;
//Пин подключен к SH_CP входу 74HC595
const int clockPin = 7;
//Пин подключен к DS входу 74HC595
const int dataPin = 6;
int i;
int t;
byte r;
byte y;
int h = 1000;
byte inf[10] {
  0b11111100,
  0b01100000,
  0b11011010,
  0b11110010,
  0b01100110,
  0b10110110,
  0b10111110,
  0b11100000,
  0b11111110,
  0b11110110
};
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  g = Serial.parseInt();
  registerWrite(g);
  delay(2000);
}


void registerWrite(int whichState) {
  t = decfunc(whichState);
  i = prim(whichState);
  r = inf[t];
  y = inf[i];
  digitalWrite(latchPin, LOW);

  shiftOut(dataPin, clockPin, LSBFIRST, y);
  shiftOut(dataPin, clockPin, LSBFIRST, r);

  digitalWrite(latchPin, HIGH);
}
int decfunc(int number) {
  int n = number / 10;
  return n;
}
int prim(int num) {
  int km = decfunc(num);
  int p = num - km * 10;
  return p;
}

 

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

Не судите пожалуйста строго за код.

b707
Offline
Зарегистрирован: 26.05.2017

функции decfun и prim можно заменить одним единственным оператором. Прочитайте как выполняется целочисленное деление и взятие остатка.

Почти все переменные. которые у вас описаны как int - надо заменить на byte. Это особенно актуально для Аттини13

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

Самое интересное, что оставив вчера нетронутой схему и загрузив сегодня скетч, она заработала как надо. Даже каскад к аттини 13 встал как родной...

Что это? Почему спустя день схема заработала как надо?

Скетч доработал по вашим советам:

//Пин подключен к ST_CP входу 74HC595
const int latchPin = PB2;
//Пин подключен к SH_CP входу 74HC595
const int clockPin = PB4;
//Пин подключен к DS входу 74HC595
const int dataPin = PB3;

const byte inf[10] {
  0b11111100,
  0b01100000,
  0b11011010,
  0b11110010,
  0b01100110,
  0b10110110,
  0b10111110,
  0b11100000,
  0b11111110,
  0b11110110
};
void setup() {
  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}

void loop() {
  for(byte i = 0; i < 100; i++){
    registerWrite(i);
    delay(100);
  }
}


void registerWrite(int &whichState) {
  byte t = whichState / 10;
  byte i = whichState % 10;
  byte r = inf[t];
  byte y = inf[i];
  digitalWrite(latchPin, LOW);

  shiftOut(dataPin, clockPin, LSBFIRST, y);
  shiftOut(dataPin, clockPin, LSBFIRST, r);

  digitalWrite(latchPin, HIGH);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Paul_it пишет:

Самое интересное, что оставив вчера нетронутой схему и загрузив сегодня скетч, она заработала как надо. Даже каскад к аттини 13 встал как родной...

Что это? Почему спустя день схема заработала как надо?

не знаю, что там у вас со схемой. но скетч из начала ветки был кривой - может в этом дело? :)))

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

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