// Test 74LS90 — licznik dekadowy
// Arduino generuje zegar i sprawdza wyjścia QA QB QC QD
//
// Podłączenie:
// Arduino D2 → 74LS90 CKA
// 74LS90 QA → 74LS90 CKB (tryb BCD ÷10)
// 74LS90 QA → Arduino D4
// 74LS90 QB → Arduino D5
// 74LS90 QC → Arduino D6
// 74LS90 QD → Arduino D7
// 74LS90 R0(1) + R0(2) → Arduino D3 (reset do 0)
// 74LS90 R9(1) + R9(2) → GND (reset do 9 nieaktywny)
// 74LS90 VCC → 5V
// 74LS90 GND → GND
const uint8_t PIN_CLK = 2;
const uint8_t PIN_RST = 3;
const uint8_t PIN_QA = 4;
const uint8_t PIN_QB = 5;
const uint8_t PIN_QC = 6;
const uint8_t PIN_QD = 7;
void pulse() {
digitalWrite(PIN_CLK, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_CLK, LOW);
delayMicroseconds(10);
}
void reset() {
digitalWrite(PIN_RST, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_RST, LOW);
delayMicroseconds(10);
}
int readBCD() {
return digitalRead(PIN_QA) |
(digitalRead(PIN_QB) << 1) |
(digitalRead(PIN_QC) << 2) |
(digitalRead(PIN_QD) << 3);
}
void setup() {
Serial.begin(115200);
pinMode(PIN_CLK, OUTPUT);
pinMode(PIN_RST, OUTPUT);
pinMode(PIN_QA, INPUT);
pinMode(PIN_QB, INPUT);
pinMode(PIN_QC, INPUT);
pinMode(PIN_QD, INPUT);
digitalWrite(PIN_CLK, LOW);
digitalWrite(PIN_RST, LOW);
Serial.println("=== TEST 74LS90 ===");
// --- TEST 1: reset do 0 ---
Serial.println("\nTEST 1: reset do 0");
reset();
Serial.print("Po resecie: ");
Serial.println(readBCD()); // oczekiwane: 0
// --- TEST 2: liczenie 0-9 ---
Serial.println("\nTEST 2: liczenie 0-9");
reset();
for (int i = 0; i <= 9; i++) {
int val = readBCD();
Serial.print("Impuls ");
Serial.print(i);
Serial.print(": QD="); Serial.print(digitalRead(PIN_QD));
Serial.print(" QC="); Serial.print(digitalRead(PIN_QC));
Serial.print(" QB="); Serial.print(digitalRead(PIN_QB));
Serial.print(" QA="); Serial.print(digitalRead(PIN_QA));
Serial.print(" → BCD="); Serial.print(val);
if (val == i) Serial.println(" ✓");
else { Serial.print(" ✗ (oczekiwane "); Serial.print(i); Serial.println(")"); }
pulse();
}
// --- TEST 3: przepełnienie — po 9 wraca do 0 ---
Serial.println("\nTEST 3: przepełnienie po 9");
int val = readBCD();
Serial.print("Po 10 impulsach: ");
Serial.print(val);
if (val == 0) Serial.println(" ✓ (wrócił do 0)");
else Serial.println(" ✗ (powinno być 0)");
// --- TEST 4: reset w połowie ---
Serial.println("\nTEST 4: reset w połowie liczenia");
reset();
pulse(); pulse(); pulse(); pulse(); pulse(); // dojdź do 5
Serial.print("Przed resetem: "); Serial.println(readBCD()); // oczekiwane: 5
reset();
Serial.print("Po resecie: "); Serial.println(readBCD()); // oczekiwane: 0
Serial.println("\n=== KONIEC TESTÓW ===");
}
void loop() {
// Wolny zegar — obserwuj na oscyloskopie lub LEDach
pulse();
delay(500);
}