Attiny13 и каскад сдвиговых регистров
- Войдите на сайт для отправки комментариев
Пнд, 06/04/2020 - 19:39
Хочу подсоединить сдвиговые регистры с прилагающимися семисегментниками к аттини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;
}
Код примера на сайте.
так у вас ваш код не работает, или даже стандартный пример не работает? если и стандартный тоже - то разбирайтесь с подключением.
Если с железом все нормально, ваш код хоть и не будет показывать вам возрастающие числа от 0 до 99, как вы хотели - но хотя бы ноль показать должен...
а вообще посоветую разделить задачу на программную и аппартную части. Атини13 - не лучший полигон для изучения программирования. Для начала отладьте свой код на стандартной Уно - поверьте. там есть что отлаживать, код мягко говоря кривой и не делает того. что вы задумали. а когда отладите на уно - попытаетесь перенести на тини, это отдельный геморой...
Попробовал с Уно, и что то произошло с регистрами. Один сгорел, а второй сошел с ума: стал выкидывать рандомные комбинации на сегментнике.
Регистр заменил, нарыл на флешке рабочую версию, работает на Уно каскадом. На аттини не пробовал.
//Пин подключен к 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; }Не судите пожалуйста строго за код.
функции decfun и prim можно заменить одним единственным оператором. Прочитайте как выполняется целочисленное деление и взятие остатка.
Почти все переменные. которые у вас описаны как int - надо заменить на byte. Это особенно актуально для Аттини13
Самое интересное, что оставив вчера нетронутой схему и загрузив сегодня скетч, она заработала как надо. Даже каскад к аттини 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); }Самое интересное, что оставив вчера нетронутой схему и загрузив сегодня скетч, она заработала как надо. Даже каскад к аттини 13 встал как родной...
Что это? Почему спустя день схема заработала как надо?
не знаю, что там у вас со схемой. но скетч из начала ветки был кривой - может в этом дело? :)))
Не, ну это понятно) Но сегодня со 2м скетчем аттини заработала как надо с первого раза. Может настроение у аттини после первого скетча испортилось)