MAX6955 – galingas LED draiveris su galybe funkcijų 2018.03.26 at 14:37

Čia toks pažintinį darbelį susigalvojau, galima sakyti už bausmę ir kad nauda būtų. Istorija nutiko 2017.07.25 22:50 Lietuvos laiku. Tokai ir istorija – truputį viršijau greitį, tai gavau baudą su teisių atėmimu. Nu ten ne daug – 53 km virš leistino buvo. Taigi, kadangi tapau teroristu, sugalvojau, kad reiktų man laikrodžio, kuris rodytų kiek laiko dar būsiu teroristų sąraše. Toliau jau būtų galima galvoti – ar tik sekundes skaičiuoti, ar kažkaip kitaip išdėlioti informaciją. Pavyzdžiui, metuose yra 31536000 sekundės, tai 8 simboliai. Bet jeigu, tarkim, norėčiau parašyti datą, kada baigiasi bausmė, tai būtų [2018.07.25_22:50:00] 15~16 simbolių (žiūrint kaip pavyks su skirtukais – taškais ir tarpu susitvarkyti). Chm, o valdyti šešiolika 7 segmentų indikatorių jau yra iššūkis. Čia mums į pagalbą skuba „Maxim Integrated“ kūrinys – MAX6955 mikroschema. Tikrai daug funkcijų ir tokio dvilypo – patogiai nepatogaus valdymo ir konstrukcijos. Patogumas tame – kad ji daug darbo padaro pati, nuimdama apkrovą nuo procesoriaus. O nepatogumas sudėtingume (vien Čarlipleksingas ko vertas), gerai nors, kad aprašymas toks pusė velnio. Taigi, pakeliui į laikmačio (nes čia realiai ne laikrodis) sukūrimą, susiveikiau MAX6955 bandymų plokštę:

Ant jos gyvena dvi MAX6955 mikroschemos, valdančios 16 indikatorių po 14 segmentų. Sujungimas paprastas, standartinis I²C ir maitinimas (5V). Kad būtų greičiau pasikūriau viską ant Arduino UNO, ten visai patogi Wire biblioteka, padaranti pusę darbo. Internete radau ir biblioteką MAX6955 valdymui, bet ja naudotis nenoriu, kad išsiaiškinti kaip valdyti MAX6955 iš bet kokio procesoriuko. Pradėjau nuo paprastų dalykų – pasijungiau bandymų plokštę prie senuko PC, per LPT jungtį. Maxim’as turi demo programėlę, kuri valdo MAX6955.

Geras dalykas, kad apačioje rašo, ką siunčia į MAXus. Taigi, pradėjau aiškintis, kaip tas dalykas daromas. Viskas lyg ir aišku – siunčiam konfigūracinius duomenis, po to galima varyti duomenis ekraniukui. Čia porą dienų keikiausi, nes vyko nerealūs ir neįmanomi dalykai, greičiausiai dėl ateivių, rusų arba amerikonų įtakos – nu neveikė niekas. Niekaip. Prijungus prie PC – veikia, prijungus prie Arduino – ne. Galų gale sumasčiau pažiūrėti, kas man čia meluoja ir pasikabinau ocsilografą prie SCL ir SDA, kai duomenis siunčia PC. Gerai, kad pavyko nusilaužti MSO2072A dekodavimo licenzijas, tai mačiau iškoduotus duomenis. Pasirodo, PC rašo duomenis į 0xCA ir 0xC0 adresus (pirma ir antra mikroschema), o oscilografas rodo, kad rašo į 0x65 ir 0x60 adresus. CHA ! Va kur šuo pakastas. Netikėlis. Kad jį kur. Pakeičiau adresus programoje ir viskas pradėjo veikti. Beje, aprašyme irgi duoti 0xCA ir 0xC0… Toliau ir nebesigilinau kodėl čia tokia nesąmonė. Įdomu, su skaitymo adresais irgi tas pats ? Bet užtai dabar buvo galima mankštinti MAX6955 visom pozomis. Kad būtų lengviau – trumpas komandų sąrašas „для чайников“:

 

// Komnandos struktūra (adresas, funkcija, reikšmė)
// Funkcija: Dekodavimas                                                  -- 0x01
/* Reikšmės: Nėra dekodavimo (simboliai 7-0)                              -- 0x00
             HEX dekodavimas: simboliui 0, be dekodavimo: simboliai 7-1   -- 0x01
             HEX dekodavimas: simboliui 2-0, be dekodavimo: simboliai 7-3 -- 0x07
             HEX dekodavimas: simboliams 7-0                              -- 0xFF
*/
// Funkcija: Globalus šviesumas                                           -- 0x02
/* Reikšmės: Minimalus šviesumas                                          -- 0x00
             Maksimalus šviesumas                                         -- 0x0E
             Tarpinės reikšmės kas 0x01
*/
// Funkcija: Skanavimo limitas                                            -- 0x03 (kiek simbolių turi dirbti)
/* Reikšmės: Rodyti 0, 1, 2 simbolius                                     -- 0x02
             Rodyti 0, 1, 2, 3 simbolius                                  -- 0x03
             Rodyti 0, 1, 2, 3, 4 simbolius                               -- 0x04
             Rodyti 0, 1, 2, 3, 4, 5 simbolius                            -- 0x05
             Rodyti 0, 1, 2, 3, 4, 5, 6 simbolius                         -- 0x06
             Rodyti 0, 1, 2, 3, 4, 5, 6, 7 simbolius                      -- 0x07
*/
// Funkcija: Konfigūracija                                                -- 0x04
/* Reikšmės: Viskas išjungta                                              -- 0x80
             Konfigūracijos sumuojasi prie 0x80
             Išjungta                                                     -- 0x00
             Įjungta                                                      -- 0x01
             Lėtas mirksėjimas                                            -- 0x00
             Greitas Mirksėjimas                                          -- 0x04
             Miksėjimas išjungtas                                         -- 0x00
             Mirksėjimas įjungtas                                         -- 0x08
             Mirksėjimo skaitliukas nereaguoja                            -- 0x00
             Mirksėjimo skailiukas perkraunamas 2wire ack signalu         -- 0x10
             Simboliai P0 ir P1 neliečiami                                -- 0x00
             Simboliai P0 ir P1 ištrinami                                 -- 0x??
             Skaičių šviesumas - globalus nustatymas                      -- 0x00
             Skaičių šviesumas - individualus kiekvienam simboliui        -- 0x40
*/
// Funkcija: Displėjaus testas                                            -- 0x07
/* Reikšmės: Normalus veikimas                                            -- 0x00
             Displėjaus testas                                            -- 0x01
*/
// Funkcija: Simbolių tipas                                               -- 0x0C
/* Reikšmės: 14 segmentų simboliai                                        -- 0xFF
             16 arba 7 segmentų simboliai                                 -- 0x00
*/

Čia ne visa konfigūracija, bet pakankama, kad pradėti dirbti. Toliau duomenys (segmentai kaip pirmoje foto, numeracija iš kairės į dešinę):

// Duomenų rašymo struktūra (adresas, segmento ID, reikšmė)
/*
   Segmento ID:
   1 -- 0x20
   2 -- 0x21
   3 -- 0x22
   4 -- 0x23
   5 -- 0x24
   6 -- 0x25
   7 -- 0x26
   8 -- 0x27

   Taškas -- prie ASCII simbolio HEX reikšmės pridėti 0x80, prie DEC reiktų pridėti 128
*/

Štai ir viskas. Šitą žinant jau galima siųsti konfigūraciją į MAX6955 (užtenka vieną kartą, kol yra maitinimas – atsimins).

 

  Wire.beginTransmission(ID_MAX1_write);                                  // Inicializuojama pirma mikroschema
  Wire.write (0x01);                                                      // Dekodavimas visiems simboliams
  Wire.write (0xFF);                                                      // Dekodavimas visiems simboliams
  Wire.endTransmission();

  Wire.beginTransmission(ID_MAX1_write);                                  // Inicializuojama pirma mikroschema
  Wire.write (0x02);                                                      // Globalus šviesumas 0 lygio iš 16
  Wire.write (0x16);                                                      // Globalus šviesumas 0 lygio iš 16
  Wire.endTransmission();

  Wire.beginTransmission(ID_MAX1_write);                                  // Inicializuojama pirma mikroschema
  Wire.write (0x03);                                                      // Visi simboliai aktyvūs
  Wire.write (0x07);                                                      // Visi simboliai aktyvūs
  Wire.endTransmission();

  Wire.beginTransmission(ID_MAX1_write);                                  // Inicializuojama pirma mikroschema
  Wire.write (0x04);                                                      // Funkcijų rinkinys
  Wire.write (0x81);                                                      // Funkcijų rinkinys
  Wire.endTransmission();

  Wire.beginTransmission(ID_MAX1_write);                                  // Inicializuojama pirma mikroschema
  Wire.write (0x07);                                                      // Displėjaus testas įjungtas
  Wire.write (0x00);                                                      // Displėjaus testas įjungtas
  Wire.endTransmission();

  Wire.beginTransmission(ID_MAX1_write);                                  // Inicializuojama pirma mikroschema
  Wire.write (0x0C);                                                      // 14 elementų segmentai
  Wire.write (0xFF);                                                      // 14 elementų segmentai
  Wire.endTransmission();

Po to belieka tik nuspręsti ką noriu rodyti. Laikmatį programuoti kol kas patingėjau, bus vėliau, bet vaizdelis yra:

Gėris tame, kad mikroschema „moka“ beveik visus simbolius, tereikia nusiųsti teisingą kodą arba parašyti ASCII simbolius klaviatūra (čia 14 segmentų indikatoriams):

Ok, toliau vieną iš patogių funkcijų – segmento adreso automatinis padidinimas. Dėl to, jeigu nereikia kontroliuoti kiekvieno segmento atskirai, galima rašymą daryti taip:

  Wire.beginTransmission(ID_MAX1_write);                                  // Rašom į pirmą MAX6955
  Wire.write(0x20);                                                       // Pirmo segmento adresas
  Wire.write(0x00);                                                       // Į pirmą segmentą rašo 0
  Wire.write(0x01);                                                       // Į antrą segmentą rašo 1
  Wire.write(0x02);                                                       // ir t.t.
  Wire.write(0x03);                                                       //
  Wire.write(0x04);                                                       //
  Wire.write(0x05);                                                       //
  Wire.write(0x06);                                                       //
  Wire.write(0x07);                                                       // Į 8 sekmentą rašo 7
  Wire.endTransmission();

Patogiau 🙂

Leave a Reply

*