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
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):
Scheef dus :
De binnenkant met bekabeling:
Nu druk bezig om meer effecten te maken!
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?