Raudonų šviesos diodų matrica

Čia straipsniukas tikriausiai ne apie kažkokią šviesos diodų matricą, bet labiau apie vieną iš technologijų kurią naudoju kai reikia padaryti “reverse engineering”.
Labai dažnai kokie nors senesni prietaisai ar šiuolaikinė Kiniška elektronika neturi jokios dokumentacijos. Matyt arba duomenys labai seni arba Kinai per savo bjaurų charakterį neviešina informacijos. Tačiau kartais norisi pasinaudoti esamais blokais, elementais ar prietaisais. Tačiau kaip? Informacijos nulis!
Pirmiausia apžiūrim ir nustatom kur yra žemė ir kur maitinimas. Pagal žinomas detales pabandom atspėti kiek voltų įtampos reikia paduoti. Visada naudojam kiek galima mažiau ir ribojam srovę. Vėliau bandom atspėti kur yra įėjimai, o kur išėjimai. O toliau prasideda mistika ir “метод научного тыка”.

Gyvas pavyzdys. “Berniukai” iš sandėlio parūpino kažkokią raudonų šviesos diodų matricų bloką. Jis atrodo taip, tiesa jis dar nešvietė. Tai 64 x 16 LED matrica iš Taito Corporation kažkokio žaidimų automato. Beja, ši firma sukūrė klasikinius Space Invaders. 🙂

Red LED matrix

Kiek pasinagrinėjus buvo nustatyta, kad visa matrica naudoja 5V matinimą. Tai buvo nustatyta pastebėjus, kad prie pagrindinių Vcc it GND laidų pajungta mikroschemos MC74HC04AN, AM26LS32, TD62C962 ir t.t. Jų maitinimų artimiausias standartinis bendras vardiklis- 5V.
Valdymas pajungtas prie jungties prie kurios prilituotos dvi 26LS32. Tai RS485 lygio keitikliai. Pagal PCB matosi, kad naudojami 8 laidininkai ir visi eina į matricą. Iš matricos signalų nerasta.
Bandant ieškoti Toshibos TD62C962LF mikroschemos aprašo nieko gero nerasta. Tik nustatyta, kad panašios mikroschemos naudojamos printerių termo galvom, keliems LED draiveriams. Bet nieko konkretaus.
Takelių treisinimas privedė, kad pora valdymo signalų eina tik į MC74HC161 (4-bit binary counter) ir MC74HC4514 (4-to-16 line decoder/demultiplexer) čipus. Tai kažkas panašaus į matricos eilučių skaitliuką ir dekoderį. Taip atsirado pradinė informacija. Tačiau likę 6 laidai sulindo į Tošibos krakajobą…

Toshiba TD62C962LF

O štai čia išlenda “reverse engineeringas” pagal “метод научного тыка”. Rusiškai nesuprantantiems ar tiems kurie nežino šio išsireiškimo: spaudžiojimas bet kur ir laukiant kažkokio rezultato.
Šiam reikalui galima pasinaudoti paprasčiausius perjungiklius (bent jau pradžiai). Tačiau žymiai įdomiau (ir paskutiniuose etapuose patogiau) pasinaudoti ką nors protingesnio. Tam tinka personalinis kompiuteris, mikrokontroleris arba CPLD/FPGA. Visi metodai turi savo pliusų ir minusų. Šiam konkrečiam projektui pasirinkau FPGA dev boardą, nes pirmiausia čia viskas sumontuota ir yra mygtukai, o antriausia- esamas softas labai galingas ir lankstus. Ypač padeda simuliacijos ir diagramų paišymas. Dar vienas FPGA pliusas, kad signalų greitis nėra ribojamas kompo ar MCU našumu. Čia dešimtys megahercų yra visiškas niekutis.
Nesigylinsiu į tai kiek buvo padaryta pakeitimų ir spėjimų. Tačiau parodysiu koks turi būti galutinis signalas į matricą:

timing diagram

Paaiškėjo, kad 4 bitai eina tik į LEDų grupę. T.y. matrica priima po 4 taškus per vieną taktinio laikrodžio impulsą. Todėl į šią diagramą tai neįtraukta. Tačiau matosi kaip skaičiuojasi matricos video atminties adresas.
Po daugybės nesėkmių buvo nustatyta, kad row_clock atlieka dvigubą vaidmenį- perjungia naudojamą matricos eilutę ir kartu užžiebia diodus (enable).
Visą šitą velniavą suformuoja šios kelios Verilog kalbos eilutės:

/* 
Taito K9100427B, J9100320B LED PCB reverse engineering test
This is 64x16 (Total 256 LEDs) board.
Original connection 8 differencial RS485 lines.
Serial data transfer, 4 LEDs at clock.

Data to board: row_clock, row_reset, column_clock, column_reset, d0-d3

Verilog module input: master clock (tested 5MHz), reset
Additional module outpur: Video RAM address.

(c)2010 by Savel. http://www.vabolis.lt
*/

module advanced (clock, reset, row_clock, row_reset, column_clock, column_reset, ram_adr);
input clock, reset;
output reg row_clock, row_reset,  column_reset,column_clock;
output [7:0]ram_adr;

reg [11:0]state;
reg [3:0]eilute;
reg [3:0]x;
reg fclock;

assign ram_adr[3:0]=x[3:0];
assign ram_adr[7:4]=eilute[3:0]+1;

always @(posedge clock)
begin
    fclock<=~fclock;
end

always @(posedge fclock)
begin
    if (reset==0) state<=state+1;
    else state<=0;
end

always @(posedge clock)
begin
    if (state[7:0]>=8'h01 && state[7:0]<8'h20)
    begin
        column_clock<=state[0];
    end
    else
    begin
        column_clock<=0;
    end

    if(state[7:0]>=8'h00 && state[7:0]<8'h02) column_reset<=1;
    else column_reset<=0;

    if(state[7:0]>8'h21 && state[7:0]<8'hFC) row_clock<=1;
    else row_clock<=0;

    if(eilute==8'h00 && state[7:0]>=8'h00 & state[7:0]<8'h0f) row_reset<=1;
    else row_reset<=0;
end

always @(posedge row_clock)
begin
    if (reset==0) eilute<=eilute+8'h01;
    else eilute<=0;
end

always @(negedge column_clock)
begin
    x<=x+1;
end

endmodule

Šis kodas nėra nei optimalus nei labai jau moksliškas. Tačiau būtent šiuo kodu buvo “atrakinta” matrica. Žinant reikiamus parametrus, Verilog kodą galima parašyti žymiai taisyklingiau.
Dabar, kai žinoma kas ir kaip jungiasi. Galima galvoti apie praktišką matricos panaudojimą. Dabar jau nebereikia FPGA, darbą gali atlikti ir bet koks nedidelis mikrokontroleris.

P.S. Ruošiant įliustracijas fotikas parodė, kad dar yra kažkokia taimingo problema:
Space Invaders
Kažkoks šėšėliavimas žemyn. Matyt eilutės persijungia kiek greičiau nei spėja užgesti.

Perdarius sistemą į MCU versiją su ATMEGA16, greitis stipriai nukrito ir šėšėliavimas dingo. Matyt su FPGA bandymais kiek užlenkiau dažnį.

8 replies on “Raudonų šviesos diodų matrica”

  1. Blemba blemba, kiek čia reikia smegenų, kad tokius biliburdą iššifruotum ir suprogramintum 🙂 Šaunuolis. Man tai čia beveik paukščių kalba atrodo 😀

  2. Baikit šnekėt apie mano smegenų kiekį. Nejaukiai jaučiuos. Manau kiekis standartinis, bet kiek pakeistas į vieną šoną, nes pastebiu pas save kai kurių dalykų trukumus 🙂 Matyt elektronika užpildė neteisingas spragas.

  3. Kas liecia fotika as galvos neguldyciau, nes fotkes metu o ypac tamsiu fonu uzlaikimas didelis, gali pagauti stipriai svieciancius objektus keliuose kadruose. Cia fotografai tau pasakys kaip vieno kadro metu vienas zmogus gali atsirasti trijose vietose kolektyvineje nuotraukoje 🙂 . Geras darbas

Leave a Reply

Your email address will not be published. Required fields are marked *