Hallo,

Ik heb even niets van me later horen, maar ben inmiddels iets verder met het ontrafelen van het seriele protocol van de CPLD.

Ik had al ontdekt dat het patroon 0x2a<n> ervoor zorgt dat lijn <n> oplicht.
Inmiddels weet ik ook dat het display in twee verschillende modi kan staan. In de ene modus licht de lijn slechts kort op, in de tweede blijft de lijn branden tot een andere lijn geselecteerd wordt. Wissellen gebeurd met een patroon van minder dan 16 bits, maar welk patroon precies weet ik nog niet.

Verder heb ik gezien dat een continu hoog signaal elke 11 bitperioden een 1 in het schuifregister klokt.
Als je echter in slechts twee bitperioden hoog doet, en daarbuiten alles laag dan schuif je een 0 in het schuifregister. Het blijkt dat de 8e bit na de '11' ingeklokt wordt. De andere 7 bits zijn don't care.

Oftewel; 0x0301 klokt een '1' in, 0x0300 een '0'.

Ik vermoed dat de CPLD 11 bits commandos verwacht; het '11' patroon hierboven is alleen te herkennen als er een 0 voorstaat ('011'dus eigenlijk). Ook geeft 011 0000 0000 11 twee klokken op de schuifregisters, en 011 0000 0001 10 maar een.

Afijn, mocht je nog een display hebben met originele CPLD: Doe er je voordeel mee.

Propere reverse engineering!

Op 31 maart 2013 23:15:16 schreef blurp:
Hallo,

Ik heb even niets van me later horen, maar ben inmiddels iets verder met het ontrafelen van het seriele protocol van de CPLD.

Ik had al ontdekt dat het patroon 0x2a<n> ervoor zorgt dat lijn <n> oplicht.
Inmiddels weet ik ook dat het display in twee verschillende modi kan staan. In de ene modus licht de lijn slechts kort op, in de tweede blijft de lijn branden tot een andere lijn geselecteerd wordt. Wissellen gebeurd met een patroon van minder dan 16 bits, maar welk patroon precies weet ik nog niet.

Verder heb ik gezien dat een continu hoog signaal elke 11 bitperioden een 1 in het schuifregister klokt.
Als je echter in slechts twee bitperioden hoog doet, en daarbuiten alles laag dan schuif je een 0 in het schuifregister. Het blijkt dat de 8e bit na de '11' ingeklokt wordt. De andere 7 bits zijn don't care.

Oftewel; 0x0301 klokt een '1' in, 0x0300 een '0'.

Ik vermoed dat de CPLD 11 bits commandos verwacht; het '11' patroon hierboven is alleen te herkennen als er een 0 voorstaat ('011'dus eigenlijk). Ook geeft 011 0000 0000 11 twee klokken op de schuifregisters, en 011 0000 0001 10 maar een.

Afijn, mocht je nog een display hebben met originele CPLD: Doe er je voordeel mee.

top :)

Ja mooi werk.
@Blurp: ik ben nu ook met jouw bitpatronen aan het spelen maar krijg er niets uit.
Welke bitlengte gebruik je nu? Ik test nu op 217 ns.

Edit: krijg nu 5 verticale lijnen.

16MHz/4, dus 250ns per bit. Dat is wel met een 16MHz kristal op het bord, met het originele 18.432 kristal zou je een iets kortere bit nodig hebben.

Wellicht ten overvloede: tussen de bitpatronen door doe ik alleen maar 0, anders ga je enen in de schuifregisters schuiven, en dat geeft welliswaar een beeld, mar ook een erg saai beeld.

Heb de FDS132 nu ook aan de praat. Met beleid de CPLD er af gestookt (hetelucht) en de Arduino Uno er aan geknoopt.

Kwam er achter dat het tooltje waarmee ik de letters ontwerp (binhex2) de kolommen in plaats van de rijen in hexcodes omzet. Vergeten om de optie 'Horiz' ipv 'Vert' te selecteren ...

Resultaat: Letters zijn 90 graden gedraaid:
http://i50.tinypic.com/2li94xg.jpg

Als je de tekst wilt lezen: Je hoofd naar rechts draaien en van onder naar boven lezen.

Letters zijn 7x7 bits groot. Het 8e bit is een spatie. Op deze manier is ieder karakter met één enkele SPI schrijfactie naar het display te sturen.

Scrollen van de tekst is straks eenvoudig te implementeren: Iedere byte een bit naar links schuiven en het carry-bit ORen met het vorige byte.

Gebruikte code:


#include <delay.h>
#include <SPI.h>

const int strobe = 10;
const int resred = 9;
const int row_c  = 7;
const int row_b  = 6;
const int row_a  = 5;

unsigned char character_map[10][7] = {
    0x3E,0x41,0x41,0x41,0x41,0x41,0x22,  // 'C'
    0x41,0x41,0x41,0x7F,0x41,0x41,0x41,  // 'I'
    0x7F,0x09,0x09,0x09,0x19,0x29,0x46,  // 'R'
    0x3F,0x40,0x40,0x40,0x40,0x40,0x3F,  // 'U'
    0x01,0x01,0x01,0x7F,0x01,0x01,0x01,  // 'T'
    0x26,0x49,0x49,0x49,0x49,0x49,0x32,  // 'S'
    0x3E,0x41,0x41,0x41,0x41,0x41,0x3E,  // 'O'
    0x7F,0x02,0x04,0x08,0x10,0x20,0x7F,  // 'N'
    0x7F,0x40,0x40,0x40,0x40,0x40,0x40,  // 'L'
    0x7F,0x49,0x49,0x49,0x49,0x41,0x41   // 'E'
};

void zeroDisp()
{
  int i;
  
  for(i=0; i<34; i++)
  {
    SPI.transfer(0x00);
  }
}

void setDisp(int row)
{
  SPI.transfer(character_map[9][row]<<1);  // 'E'
  SPI.transfer(character_map[7][row]<<1);  // 'N'
  SPI.transfer(character_map[1][row]<<1);  // 'I'
  SPI.transfer(character_map[8][row]<<1);  // 'L'
  SPI.transfer(character_map[7][row]<<1);  // 'N'
  SPI.transfer(character_map[6][row]<<1);  // 'O'
  SPI.transfer(character_map[5][row]<<1);  // 'S'
  SPI.transfer(character_map[4][row]<<1);  // 'T'
  SPI.transfer(character_map[1][row]<<1);  // 'I'
  SPI.transfer(character_map[3][row]<<1);  // 'U'
  SPI.transfer(character_map[0][row]<<1);  // 'C'
  SPI.transfer(character_map[2][row]<<1);  // 'R'
  SPI.transfer(character_map[1][row]<<1);  // 'I'
  SPI.transfer(character_map[0][row]<<1);  // 'C'
}

void setRow (int row)
{
  digitalWrite (row_a, row & 1);
  digitalWrite (row_b, row & 2);
  digitalWrite (row_c, row & 4);
}

void setup()
{
  pinMode (strobe, OUTPUT);
  pinMode (resred, OUTPUT);
  pinMode (row_c,  OUTPUT);
  pinMode (row_b,  OUTPUT);
  pinMode (row_a,  OUTPUT);
  
  digitalWrite (strobe, HIGH);
  digitalWrite (resred, HIGH);
  
  SPI.setBitOrder(LSBFIRST);
  SPI.begin();
};

void loop()
{
  int p;
  int i = 0;
  while (1)
  {
    for (p=0; p<7; p++)
    {
      digitalWrite (resred, LOW);
      digitalWrite (strobe, LOW);
      setRow(p);
      zeroDisp();
      setDisp(p);
      digitalWrite (resred, HIGH);
      digitalWrite (strobe, HIGH);
      delayMicroseconds (1500);
    }
  }
}

Letters even gedraaid en de SPI-output mode van LSBFIRST naar MSBFIRST gezet:

http://i47.tinypic.com/2pydp9y.jpg

Van mij werkt dat dus niet he, vandaar dat ik vermoed dat ik iets verkeerd doe met de aansluitingen van het FDS-132 bord zelf. Ik heb er dus de CPLD af gehaald, alsook U1 die de CLK, RESRED, STROBE en DR aanstuurt.Daar zitten dan mijn stuurlijnen aan vast, aan R1, R2, R3 en R6. De lijnen a, b en c liggen aan pennen 1,2 en 3 van U4. Dan ook nog de pennen 4 en 5 van U4 (G2A en G2B) aan massa gelegd. Dan daar een Arduino UNO aangekoppeld, nu laatst mer het programma van zerobase: dus strobe aan 10, resred aan 9, a,b,c naar 5,6,7.
Noch met het programma van jeip of zerobase krijg ik iets zinnigs op het display. Wat doe ik verkeerd? Kan er mij iemand helpen aub?

Ik heb alleen de CPLD verwijderd. De 74HC365 is op mijn bord niet aanwezig. Ik gebruik een Arduino Uno om het bord aan te sturen.

Ik heb eea zo aangesloten:
http://i47.tinypic.com/2a9tojb.jpg

1 = Clock (Arduino pin 13 - SPI Clock)
2 = Data (Arduino pin 11 - SPI MOSI)
3 = Strobe (Arduino pin 10)
4 = Massa (Arduino GND pin)
5 = A (Arduino pin 5)
6 = B (Arduino pin 4)
7 = C (Arduino pin 3)
8 = RESRED (Arduino pin 9)

Tussen draadje 3 en 4 zit een soldeerpad (G2B van de 74HC238) die is doorverbonden met draadje 4 (massa). En ook het 1e pad rechts(boven) van draadje 7 hangt aan massa (G2A).

Hmm, er zijn blijkbaar 2 verschillende FDS132-borden. Rondom de CPLD ziet het er heel anders uit. Maar de 74HC365 staat puur als buffer geschakeld dus dat zou niet mogen uitmaken.
Tenminste, als je Arduino genoeg 'drive' heeft om die hele riedel ic's te sturen.

[Bericht gewijzigd door Zonnepaneeltje op (19%)]

We zitten hier dus met twee verschillende versies denk ik, De mijne hebben trouwens groene leds, hieronder mijn aansluitingen en een stukje uit het schema:

https://www.dropbox.com/s/5ul7ooaraf1syh8/fds132%20wijzigingen.pdf

https://www.dropbox.com/s/ap25wgkehcilju7/display-2.jpg

@zonnepaneeltje: De arduino zal zeker drive genoeg hebben, trouwens die cpld moet het ook alleen afmaken he

[Bericht gewijzigd door Muffin op (16%)]

@Muffin: wij hebben zo te zien dezelfde borden. er zit bij mij ook een 74HC365 op, en de aansluitingen kloppen ook met het schema.

[Bericht gewijzigd door Zonnepaneeltje op (27%)]

Op 1 april 2013 19:58:58 schreef Zonnepaneeltje:
@Muffin: wij hebben zo te zien dezelfde borden. er zit bij mij ook een 74HC365 op, en de aansluitingen kloppen ook met het schema.

En werkt er bij jou al iets? Ik dacht toch niet dat ik iets verkeerds bezig was?

Bij draad 3 en 4 is op je foto niet goed te zien of het wel klopt. Je zou dat nog eens kunnen nakijken.

Ik ben nog steeds aan het proberen om via de optische link aan te sturen. Nu weer bezig met dat andere bord, de FDS184. Wil niet lukken.

YES! Gelukt! alle draden lagen wel juist aan, maar wat ik vermoedde is waarheid geworden: In het program van zerobase zijn de pinnen data en clock niet vermeld, ik had ze dan ook niet aangesloten ... mis dus!
Hartelijk dank aan diegenen die me geholpen hebben, nu eens het programma deftig uitvlooien.

Hallo,

Ik heb gister weer een paar commando's voor de originele CPLD gevonden:
0x0211 : Blokker schuifregister updates
0x020f : Sta schuifregisterupdates weer toe

Behalve 0x0211 zijn er nog een paar codes die hetzelfde lijken te doen. Of die ook hetzelfde zijn (zuinige decodeerlogica in de CPLD) of stiekem wat anders betekenen is een open vraag.

Verder vermoed ik dat het commando voor "Lijn blijft aan staan na het selecteer-lijn-commando(0x02a<x>)" wat ingewikkelder is, een voor een alle 256 0x02xx commando's proberen heeft hem niet boven water gehaald.

@blurp,

Goed bezig, ik ben bezig met een testopstelling die alle mogelijke commandos af zal gaan en controleert op een trigger van het bord. Ik gebruik daarvoor een atmega324P omdat deze 2 serieele poorten heeft, eentje hang ik aan het bord ander kan ik via de uart mee babbelen.

Heb je iets van een latch commando gevonden waarmee je de bits in het schuifregister kan laten latchen? Dus dat je een lijn actief kan houden terwijl je de volgende inklokt qua data?

@squant: Goede keus, die AVR met twee uarts. Ik heb alleen 328P liggen, dus dat is een beetje behelpen.

Maar qua commando's: 0x02a<x>, waarbij <x> een 4-bits lijnnummer is activeert een bepaalde lijn voor korte tijd. Er is een manier om de lijn actief te houden tot de volgende geactiveerd wordt, maar ik weet nog niet precies hoe. (ik ben er met random proberen wel eens tegenaangelopen, maar heb het nog niet uitgezocht).

Meestal stuur ik dat 0x02a<x> commando elke 300us met een interrupt op een timer, dat geeft genoeg licht om verder te zoeken.
0x02a<x> geeft ook een strobe naar de schuifregisters, zodat de schuifwaarde naar de uitgang gaat.

0x0301 klokt een '1' in je schuifregister, 0x0300 een '0'.
Continu '1' klokt elke 2250us een 1 in je schuifregister, continu '0' doet niets.

Commando's versuur ik MSB eerst, met de uart in SPI mode (dus zonder start, stop en/of parity bits. Klok is display-klok gedeeld door 4.

Ik vermoed dat alleen de laatste 11 bits significant zijn, maar uit practische overwegingen stuur ik er altijd 16.

Tot slot, de 328 maakt de uart uitgang hoog als er geen data te versturen is. Dat wil je niet (klok je namelijk alleen maar '1' in je schuifregister. Dat kun je voorkomen door continu data (0 dus) aan te bieden.

Succes en ik ben benieuwd wat je vindt.

Voor mensen die nog een andere toepassing voor hun FDS132 lichtkrant zoeken, het ding is ook geschikt om dienst te doen als VU-meter:

http://i46.tinypic.com/jil4hy.jpg

De meesten zullen het bouwpakket van Velleman wel kennen met de 10-leds VU meter. Hetzelfde principe gebruik je om het audio om te zetten naar een gelijkspanning die je vervolgens aanbiedt aan een van de ADC ingangen van de Arduino.

De meest geschikte opamp is een rail-to-rail exemplaar. Die kun je dan op 5V voeden (+ ingang op 2,5V) en de uitgang knoop je dan aan bijv ADC0.

Ik heb even geen geschikte opamps liggen, daarom zie je in het plaatje een potmeter hangen aan analoge ingang A0 van de Arduino Uno.

Goedenavond,

Ik ben inmiddels wat verder. Hier ongeveer:
http://www.uploadarchief.net/files/download/resized/7854b79cd962193f4e84e5c831b98227.jpg

De code voor dit saaie plaatje kun je hier vinden:
http://www.uploadarchief.net/files/download/fds184.c

Ik kan nu met een FDS184:
- Het schuifregister bedienen
- willekeurige rijen aansteken
- zorgen dat de rij blijft branden terwijl ik het schuifregister update voor de volgende lijn.

Nu nog uitvogelen hoe je twee FDS184 displays daisy-chained...

Ohja, als je nu nog een stapel FDS185 hebt liggen en je wil dat ik die ook reverse engineer: Geef mij er twee en je krijgt of de display, of de code terug :-P

Holy cow, je bent "wat verder" ?
Je hebt hem gewoon helemaal gehackt :D
Super!

Op 5 april 2013 21:11:37 schreef blurp:
Goedenavond,

Ik ben inmiddels wat verder. Hier ongeveer:
[afbeelding]

De code voor dit saaie plaatje kun je hier vinden:
http://www.uploadarchief.net/files/download/fds184.c

Ik kan nu met een FDS184:
- Het schuifregister bedienen
- willekeurige rijen aansteken
- zorgen dat de rij blijft branden terwijl ik het schuifregister update voor de volgende lijn.

Nu nog uitvogelen hoe je twee FDS184 displays daisy-chained...

Ohja, als je nu nog een stapel FDS185 hebt liggen en je wil dat ik die ook reverse engineer: Geef mij er twee en je krijgt of de display, of de code terug :-P

ik heb wel 2 stuks FD185... en ik wil erg graag een reverse-engineer.. maar ik wil de panelen wel terug want anders kan ik er niks mee :-P

Druk gehad met examens, nu gelukkig weer een beetje tijd om te hobbyen (Beter laat dan nooit)

Ik heb em aan gestuurd via een PIC, de cpld is er af gesloopt. Ik stuur nu de schuif registers aan met de SHOUT instructie in PIC basic, vanavond maar even kijken of het lukt om hem aan de SPI te knopen.

http://i46.tinypic.com/10msg3l.jpg

Hoi blurp,

Ik heb zaterdag een FDS132 gekocht en ff het testen gegaan, 7.2v accu aan gesloten en een laserpointer even op de optische ingang gezet, en ik zie dat de leds reageren.

Nou was ik ff verder aan het zoeken en het blijkt dat de borden door surtronic gemaakt zijn, deze club maakt heel veel producten voor het openbaar vervoer, en in het openbaar vervoer is het IBIS protocol nog al veel gebruikt. (en surtronic gebruikt dit nogsteeds heel veel......)

Over dit protocol is best veel te vinden, heb je daar mischien iets aan?

Ik hoop dat deze matrix displays ooit goed aan de gang komen!! Happy hacking!
Gr,

Bodil

een plaatje zegt meer dan 1000 woorden.
https://dl.dropboxusercontent.com/u/17502333/t%20werkt.jpg

Toch wat toelichting, dit zijn 5 panelen met elk een 18LF25k22(3v? ja, was goedkoper namelijk 1,25€). Die micro draait via ene pll op 64Mhz wat ervoor zorgt dat een display flikkervrij word aangestuurd. Op het moment loopt de onderlinge communicatie op 9600 wat er bij het vernieuwen nogal brak uitziet, maar op de bedoelde 115200 verloor er af en toe een byte..

Code wil ik wel delen, is compleet opgebouwd op interrupts.