Op 18 januari 2011 21:00:26 schreef plantrekker:Als je zonder interrutps werkt dan moet de routine die het beeld update (uit eeprom halen / zelf berekenen / ontvangen van pc) elke keer even lang duren, anders krijg je een onregelmatige refreshrate.

Moet lukken, elke keer worden er altijd 8 bytes tegelijk opgevraagd uit het EEPROM, en worden er altijd weer 64 bits weggeschoven in de shiftregisters. Wanneer de cube en print gebouwd zijn kan ik uitsluitsel geven of het echt even lang duurt.

Ik zet trouwens sowieso een max232 PC verbinding aan de PIC, zodat de EEPROM makkelijk gevuld kan worden vanuit de PC. In de PIC komt dus ook een subroutinetje die na indrukken van een knop wacht op data van de PC en die meteen doorstuurt de EEPROM in.

Hmm, ik wou je eigenlijk laten aanvoelen dat interrupts juist hetgene is wat je moet gebruiken. Dan kan je bvb ook data van de pc ontvangen en in de eeprom plaatsen zonder dat je daar iets van merkt bij het refreshen van je kubus. Interrupts zijn echt niet moeilijk en eens je het onder knie hebt, maken ze het je net veel makkelijker, ze bestaan niet voor niets!

Ik ga binnenkort testen met het tmr1 interrupt, ik denk dat ik het begrijp (datasheet erbij gepakt).
Volgens mijn theorie is timer1 trouwens ongeschikt voor de cube, op prescaler 1:1 is er elke 13mSec. (0,2µ * 65536) een interrupt ,wat te langzaam voor multiplexing is. timer2 lijkt geschikter, die heeft op een prescaler van 1:16 om de 0,8mSec een overflow (0,2µ * 16 * 256).

De onderdelen van Dick Best zijn vandaag binnengekomen:D, dus ik kan beginnen.

Je kunt het maximum, wanneer ie terug naar nul gaat, ergens instellen. Zo kan je ieder aantal microseconden korter dan 13msec maken.

Je kan zover ik weet alleen de timer zelf op een beginwaarde zetten zodra er een interrupt plaatsvindt.

Update!

De print met de 8 74HC595's is klaar! (gewoon met 1 datalijn ;))
Sorry voor de jumpers trouwens ;), maar zo is het overzichtelijker.
http://i52.tinypic.com/2qmdjrt.jpg
achterkant:
http://i54.tinypic.com/10ojzm8.jpg

Ook zijn al 3 van de 8 verdiepingen klaar (= 192 LED's):
http://i55.tinypic.com/29e6hyq.jpg

loopycoaster zou jij mij misschien kunnen helpen met het schema. Ik ben ook een 8x8x8 LED kubus aan het maken. Ik maak het schema van http://www.boudewijnbruinsma.nl/Led-Cube-8x8x8.pdf
Ik weet niet of jij deze ook maakt? Maar ik zit met die dikke blauwe lijnen. Is hier alles met elkaar doorverbonden of gewoon alles appart?
Ik hoor het wel.
Alvast bedankt.

[Bericht gewijzigd door Guus Berens op (17%)]

Ik gebruik niet hetzelfde schema als in de instructable. Wel de indeling van de kubus zelf.

Ik heb zelf geen schema gemaakt, er zit er alleen 1 in mijn hoofd, die ik helaas niet via een USB'tje kan overzetten...

Ik gebruik dus 8 74HC595's om de + te schakelen. De 3 datalijnen gaan aan de uC. De 8 - draden van de Led's worden geschakeld door een ULN2003 (transistor array). Die 8 draden gaan ook in de uC.

Wat bedoel je met de blauwe draden. paginanr?

okee toch bedankt.
Ik bedoel die dikgedrukte blauwe lijnen op pagina 35, en dan het rechtse schema. Bedoelen ze daarmee dat al die datalijnen 8x hetzelfde is of is dat allemaal met elkaar doorverbonden.

alvast bedankt

Het betekent dat de datalijnen parallel zijn aangesloten. Dat wil zeggen dat D0 van de ene chip op de D0 van de andere zit. D1 van de ene zit aan de D1 van de andere. Een wat dikkere (blauwe) lijn is overzichtelijker, anders wordt het een warboel aan lijnen en kruisingen.

okee dank je. Ik merk dat jij hier beter in bent dan mij:P

Ik heb nog een vraag. Misschien is het helemaal niet moeilijk maar ik kom er niet uit.
Zou iemand mij kunnen vertellen hoe het zit met IC4P, IC8P enz. Verder zie ik ook nog JP1, JP2 enz. staan. En die SV1 en SV2 en SV3 zijn dat aansluitingen voor flatcables?
Ik weet niet waar deze voor zijn of waar ze naar toe gaan?
Ik vind het lastig dat het 2 schema's zijn. ik weet niet hoe ik die 2 schema's moet koppelen?
Kan iemand mij helpen?

Alvast bedankt

Update:

De printen zijn nu beiden klaar (een uC-print en een 595-print), en de cube zelf ook!

kuch*scheef*kuch :+ :
http://i55.tinypic.com/dniqeb.jpg

http://i52.tinypic.com/2cxyd6g.jpg
Deze moeten alleen nog samenkomen in de behuizing, maar die moet nog geverft worden... Tot die tijd ben ik even aan het proberen met de tmr1. Zoals op de foto te zien is zitten er 8 leds (die elk parallel staan met een verdieping). Daarmee heb ik al gezien dat het tmr1 te traag is; de flikkering is duidelijk zichtbaar. Ik heb nu het tmr0 erbij gepakt, en deze flikkerde op een prescaler van 1:256 ook nog, en ik ben het daarna gaan afbouwen. Nu ben ik uitgekomen op een prescaler van 1:32 waarbij hij niet flikkert. Daarmee zou de tijd die 1 verdieping aanstaat uitkomen op:
256*32*(1/(20.000.000/4))= 1638µSec. (~600Hz)
In die tijd moet ik dus alles doen.

Zou iemand mij globaal kunnen vertellen hoe ik dat zou moeten doen met inlezen, aansturen, interrupts ed.? Zelf denk ik dat het zo moet:

pseudocode:

while 1 = 1
   data inlezen
   data in de 595's schuiven
   wachten op de interrupt
wend

interrupt:
   595's latchen
   flag resetten
terugkeren naar de while

Zit ik zo in de goede richting?
(En gaat dat uberhaupt wel lukken in 1638µSec. :S?)

Info uit de externe EEPROM lezen kan zo(als je de I2C datalijnen goed hebt ingesteld):

HBusIn %10100001, Data_Adres,[Data]

Een HC595 aansturen is ook niet al te moeilijk:

SHOUT DataPin, ClockPin, MSBFIRST, [Bit1\8]
PULSOUT LatchPin, 5 

Nee, ik gebruik de softwarematige i²C. Maar ik gebruik dus het BUSIN commando.

En voor de 595's, die stuur ik aan met een zelfgemaakte subroutine i.p.v. het SHOUT commando, de subroutine kan ik zo snel zetten als ik wil ;).

Ok, kun je dan van beiden een voorbeeldje plaatsen (code) wat je bedoelt?

vervanger van SHOUT:

Uitvoer:

  FOR Byteselect = 0 TO 7
    FOR Y = 7 TO 0 STEP -1
            ;bd1 = ledbyte[byteselect]
            DAT = GETBIT BD1, Y         ;het goede databit klaarzetten op de portpin DAT
            DELAYUS 50 
            PULSOUT CLK, 1  ;Clockpuls geven
            DELAYUS 50
    NEXT
  NEXT
    PULSOUT LATCH, 1 ;de bytes van een hele verdieping inschakelen  
RETURN

Met BUSIN is I²C tot nu toe niet gelukt, wel al met het I2CIN/I2COUT commando. Met deze code heb ik ook meteen gekeken hoeveel tijd een 8-byte array inlezen in beslag neemt:

HSERIAL_BAUD  = 38400          
HSERIAL_RCSTA = %10010000 ;declares voor serieele communicatie met PC  
HSERIAL_TXSTA = %00100000    

SYMBOL TMR1IF = PIR1.0 ' TMR1 Overflow Interrupt Flag bit
SYMBOL TMR1IE = PIE1.0 ' TMR1 Overflow Interrupt ESYMBOL TMR1ON = T1CON.0     ' Timer1 ON
                                                 
SYMBOL TMR1ON = T1CON.0     ' Timer1 ON
SYMBOL TMR1CS = T1CON.1     ' Timer1 Clock Source Select                            -OP 0 ZETTEN, ZORGT ERVOOR DAT ER GEEN EXTERNE OSSCILATOR NODIG IS.
SYMBOL NOT_T1SYNC = T1CON.2 ' Timer1 External Clock Input Synchronization Control   -ALS HIERBOVEN OP 0 IS, WORDT DIT BIT GENEGEERD.
SYMBOL T1OSCEN = T1CON.3    ' Timer1 Oscillator Enable Control                     -op 0
SYMBOL T1CKPS0 = T1CON.4    ' Timer1 Input Clock Prescale Select bits               b10
SYMBOL T1CKPS1 = T1CON.5    ' Timer1 Input Clock Prescale Select bits                00 = 1:1

T1CKPS0 = 0
T1CKPS1 = 0 ;prescaler op 1:1
TMR1ON  = 0 ;timer nog niet aanzetten
TMR1CS = 0  ;interne osscilator gebruiken
T1OSCEN = 0

SYMBOL SCL = PORTC.0
SYMBOL SDA = PORTC.1
DIM DATARRAY[8] AS BYTE
DIM RECARRAY[8] AS BYTE

DATARRAY[0] = %10000000 ;even wat data verzinnen
DATARRAY[1] = %01000000
DATARRAY[2] = %00100000
DATARRAY[3] = %00010000
DATARRAY[4] = %00001000
DATARRAY[5] = %00000100
DATARRAY[6] = %00000010
DATARRAY[7] = %00000001

Address = 0                         ' vanaf adres 0 
I2COUT SDA, SCL, ControlW , Address , [STR DATARRAY ]  ' Send the bytes to the eeprom
DELAYMS 100       
TMR1H = 0 ;de timer1bytes echt leegmaken
TMR1L = 0 ; "    "         "      "
TMR1ON  = 1; de timer inschakelen
I2Cin SDA, SCL, ControlR , Address , [STR RECARRAY ]  ; en meteen de bytearray inlezen
TMR1ON  = 0;waarna de TMR stopt.
    
HSEROUT ["TMR1 value: ",DEC (TMR1H * 255 + TMR1L),$D];deze waarde naar de PC sturen
END

Daaruit volgde een TMR1 waarde van 4520.
4520 * 0,2µSec = 904µSec.
Dan heb ik nog 1638 - 904 = 734µSec. over voor het uitsturen van de data naar de 595's.

In plaats van GETBIT kun je natuurlijk ook schuiven, het lijkt me dat dat sneller gaat.

Hoe bedoel je?

Zo?

DAT = BD1.Y

Zo krijg ik een error...

UPDATE!

De cube is klaar!
Filmpju: http://www.youtube.com/watch?v=w1sNyYFWhWs
De effecten die er nu in zitten zitten nu nog in het interne geheugen van de 16F877A, maar wanneer er meer effecten komen zal ik het externe moeten gebruiken, of een verbinding met de PC moeten maken. Ben benieuwd hoe dat gaat uitpakken.

En wat foto's:
De cube op de behuizing (de zwarte verf is zwarter dan het eruitziet, het glanst een beetje):
http://i56.tinypic.com/29ooppu.jpg

http://i55.tinypic.com/16hvuqo.jpg
Scheef dus :+ :
http://i54.tinypic.com/2yye0yr.jpg

De binnenkant met bekabeling:
http://i54.tinypic.com/2gujpfk.jpg

Nu druk bezig om meer effecten te maken!

Wat is de grootte van die print?

Op 1 februari 2011 15:16:20 schreef loopycoaster:
Hoe bedoel je?

Zo?

DAT = BD1.Y

Zo krijg ik een error...

Nee, ik bedoel:
Bitwise Shift Left '<<'. Shifts the bits of a value left a specified number of places.
Bitwise Shift Right '>>'. Shifts the bits of a value right a specified number of places.
Dat compileert, als het goed is, naar 1, hooguit 2, instructie(s) en is dus poepie-rap.

Op 7 februari 2011 18:42:20 schreef Stekke_stim:
Wat is de grootte van die print?

Het zijn 2 experimenteerprints van Dick (10x16cm), wat zorgt voor een totale print van 20x26cm. Ik heb onwijs veel geluk gehad met de kist waar alles in gebouwd is: de prints passen precies naast elkaar, en de prints zitten schuin in de kist, waardoor de adapter nog onder de prints kon komen te zitten.

@hadv: Ik had het gisteren in de proton help file bij GETBIT gelezen ja ;), bedankt :).

Ik kaap je topic even met mijn driver voor een 8 * 8 * 8 kubus:
http://dl.dropbox.com/u/699251/blaaaaaaaaaargh.png

Heb er nu al spijt van dat ik de kubus al gebouwd heb... :)

Heb mijn versie gemaakt met high-side drivers omdat ik die schuifregisters niet teveel wil belasten en omdat ik een fatsoenlijke hoeveelheid licht uit mijn kubus wil. Maar ik vroeg me af... Is er geen makkelijkere manier?

De behuizing van je kubus ziet er goed uit... Dat moet ik onthouden. :)

Waarom overigens zo'n beestachtige micro als de 16F877? Je hoeft, voor zover ik het begrijp, maar 2 kloklijntjes, 1 data lijn en 8 "verdieping"-lijnen aan te sturen...

Poeh, UDN2981's. Die zijn toch best prijzig? (2-3 euro?)
Het is dat je de cube inderdaad al gebouwd hebt, maar had je anders beter geen ULN2803's achter elke 74HC595 kunnen nemen, en 1 UDN2981 in de highside?

Op 7 februari 2011 23:32:22 schreef TheCrazyInventor:Waarom overigens zo'n beestachtige micro als de 16F877? Je hoeft, voor zover ik het begrijp, maar 2 kloklijntjes, 1 data lijn en 8 "verdieping"-lijnen aan te sturen...

een latchlijn is niet echt een kloklijn trouwens, maar dat terzijde. Waarom een 16F877A? Inderdaad heb ik voor de kubus zelf maar 11 lijnen nodig. Maar dat is niet het enige:

8x verdiepinglijnen
3x 74HC595
2x MAX232 (PC-verbinding)
2x 24LC1025 (I²C EEPROM IC)
4x drukknop (ik heb nog geen echte functies daarvoor bedacht, behalve een testknop (alle leds aan))
3x Status/debug LED's
------------------
22 IO's totaal

Dat is dus te weinig voor een 16F628A/648A. Op de 16F877A na had ik geen andere PIC's die >18 pins waren. Dus stouwde ik er maar de 16F877A in :).

Het Toshiba equivalent is een stuk goedkoper (TD62783APG). Die heb ik eens op een beurs opgepikt. 5 euro voor 10 stuks.

En je hebt inderdaad gelijk wat betreft IO. Ik denk dat ik er een 16f876 aan ga knopen. Ding heeft genoeg IO voor de kubus + nog wat rand-shizzle.

Ik vind wel dat er nog een controle-LEDje op de led kubus moet...

Op 24 januari 2011 21:17:08 schreef loopycoaster:
Het betekent dat de datalijnen parallel zijn aangesloten. Dat wil zeggen dat D0 van de ene chip op de D0 van de andere zit. D1 van de ene zit aan de D1 van de andere. Een wat dikkere (blauwe) lijn is overzichtelijker, anders wordt het een warboel aan lijnen en kruisingen.

Dat wil dus zeggen dat wat er van SV1 afkomt, bijvoorbeeld pin 14, gaat die lijn naar alle 74HC574N pin 2? Dus gaat de lijn van pin 14 8x naar pin 2 van de IC's?

En is dat zo bij alle lijnen?