loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Beste CO-ers,
Pas kwam ik een topic tegen waarin gevraagd werd hoe een 8³ led cube aan te sturen was. Ik had al een 3³ cube gemaakt, en mij lijkt dit een gave opvolger
!
Microcontroller: PIC16F877A, i.c.m. 20Mhz Xtal
Programmeertaal: Proton PIC Basic (full version)
Ik heb de instructable gezien (die overigens wel gratis is), en ga volgens die werkwijze bouwen. Alleen ik ben van plan de aansturing anders te doen: met 74HC595's. Hier heb ik al een tijdje mee geëxperimenteerd. En hier heb ik een vraag over:
Zie de blokschema's:
Deze zou dan toegepast worden op 8 74HC595's.
Situatie 2 is de meest gangbare manier van schuifregisters koppelen, situatie 1 heb ik nog nooit gezien. Maar omdat bij led cubes snelheid belangrijk is, i.v.m. multiplexing, dacht ik dat het slim was om de Datalijnen apart aan te sturen. Zo kan je in 1 keer 8 bits wegklokken (8x 74HC595), en zijn alle 64 bits geladen wanneer er 8 keer is geklokt. Het kost wel 7 pins op de uC meer, maar omdat ik een 40-pins uC heb, kan ik die missen.
1. Klopt mijn beredenering, en is het inderdaad slimmer om Situatie 1 toe te passen?
Ik ben van plan om de PIC zijn data voor de effecten te geven d.m.v. een I²C EEPROM IC, de 24LC1025 (1024Kbytes (128k*8 bits)), waardoor ik (128.000*8)/512 = 2000 situaties kan maken. Of d.m.v. PC, alleen heb ik de voorkeur van een stand-alone cube.
2. Is I²C snel genoeg om daarnaast nog te kunnen multiplexen? Totaal moeten er 64 bytes (512bits/8) uit de EEPROM gelezen worden, per cycle.
Het grootste probleem van dit alles: Ik heb nog geen ervaring met interrupts, en heb dus nog niet een 100% idee hoe ik het uitlezen EEPROM + multiplexen ga doen... Ik snap globaal wel hoe het Timer1 interrupt werkt:
-timer increased elke klokcycle met 1 (kloksnelheid / 4, in mijn geval 20MHz / 4 = 5.000.000p/sec = elke 0,2µSec een klokcycle)
-zodra de timer van 65535 naar 0 springt wordt er een flagbit geset, en komt er een interrupt
Je kon dacht ik ook de timer al op een waarde zetten. Als je bijv. een interrupt over 10mSec (10.000µSec.) nodig hebt: 10.000/0,2 = 50.000 cycles.
Dus moet de timer op 65.535-50.000=15.535 gezet worden.
En ik heb ook iets gehoord over prescalers. Dat is dus waardoor je de klokcycles deelt:
- 1:1 = 20Mhz / 4 /1 = 5.000.000p/sec = elke 0,2µSec een klokcycle
- 1:2 = 20Mhz / 4 /2 = 2.500.000p/sec = elke 0,4µSec een klokcycle
- 1:4 = 20Mhz / 4 /4 = 1.250.000p/sec = elke 0,8µSec een klokcycle
- 1:8 = 20Mhz / 4 /8 = 675.000p/sec = elke 1,6µSec een klokcycle
- 1:16 = 20Mhz / 4 /16= 337.500p/sec = elke 3,2µSec een klokcycle3.Klopt dit alles?
Alle onderdelen had ik al besteld (woensdag), de leds bij Leds-buy.nl (al binnen)(groen, diffuus, 3mm), het geheugenchipje bij VOTI (al binnen), en de rest bij Dick Best... Ik had het dus woensdag besteld, en zoals iedereen denk ik weet heeft hij vrijdagavond de stekkers eruit gehaald. Daarvoor heb ik niets gehad van een bevestiging van de bestelling, of iets. Dus dat is ook niet binnen, en zal waarschijnlijk tot na de verhuizing ook zo blijven...
4. Of weet iemand daar meer van?
Heel erg bedankt alvast!
Maarten
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
kickje
Ik ga de multiplexfrequentie op ongeveer 50Hz zetten denk ik (= om de 20mSec). Daardoor staat een verdieping dus 1/8*20mSec. = 2,5mSec aan per cycle.
In die tijd moeten dus alle 8 de 74HC595's geüpdated worden. Dat lukt wel. Maar in die tijd moeten in ieder geval ook 8 bytes uit de EEPROM-chip ingeladen worden. Ik denk niet dat I²C daar snel genoeg voor is (400KHz). Of wel? Anders stap ik over op een door een PC-gestuurde cube.
Heeft er iemand ervaring met het aansturen van een Led Cube, en hoe heb je die data aangevoerd? (EEPROM / PC / ....?)
Sjoerd Kreyns
Golden Member
SMD weerstandjes zoeken in grijze vloerbedekking is ook een uitdaging ... 8*1=255 ... Het nadeel van ruimte: Als je het hebt, staat het binnen de kortste keren weer vol.
Volgens mij moet je bij situatie 1 de clock en data lijnen aan elkaar knopen en de latch lijnen apart. Als ik het goed heb.
Ik had maandag onderdelen besteld bij Dick Best en toch binnen tijdens de verhuizing. Het duurde wel wat langer voordat ik de bevestiging kreeg en de status van 'in behandeling'. Nu staat de bestelling pas op Afgehandeld.
Het zal wel goed komen.
plantrekker
True story bro!
Sjoerd Kreyns, data en klok kan je echt niet samenhangen.
loopycoaster, Ik werk niet met PIC's maar de SPI kan op 20M/4=5MHz draaien dacht ik. 8 Byte = 64 bit voor 1 laag, dat duurt dan 12,8µs en je hebt 2500µs de tijd per laag. De shiftregisters parallel schakelen is dus echt niet nodig, je maakt het je moeilijk terwijl het relatief weinig winst kan opleveren.
Om het je nog wat beter te kunnen voorstellen:
Per laag kunnen er 20M/4/50/8 = 12500 instructies uitgevoerd worden
Het uitklokken van 64 bit neem de tijd van 64 instructies in (ookal gebeurt dit HW-matig)
Of het lukt met de EEPROM, ik vermoed van wel maar je bent nooit zekerder dan wanneer je het experimenteel vast stelt. Probeer dus 400 keer per seconde 8 byte te lezen uit de eeprom en 8 byte via de SPI te versturen.
Sjoerd Kreyns
Golden Member
SMD weerstandjes zoeken in grijze vloerbedekking is ook een uitdaging ... 8*1=255 ... Het nadeel van ruimte: Als je het hebt, staat het binnen de kortste keren weer vol.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
@Sjoerd
De datalijnen kunnen niet aan elkaar vast (dan zou elk shuifregister dezelfde byte bevatten). Wel op de manier zoals situatie 2 (wat de normale manier is van shuifregisters koppelen). Toch bedankt voor je reactie m.b.t. Dick Best; ik heb helaas nog geen bevestiging gehad..
Dick Best: Door alle voorbereidingen is er een behoorlijke stagnatie ontstaan in het klaarmaken van de orders, dit zal absoluut nog wel even duren.
Ik hoop dat dit betekent dat hij wel ermee bezig is.
@plantrekker
Ik ga denk ik dan toch gewoon situatie 2 ga gebruiken, want het ziet er inderdaad naar uit dat het geen significante besparing gaat opleveren. En dat is vast de reden dat je situatie 1 nooit ziet 
plantrekker
True story bro!
Datalijnen aan elkaar? Dan klok je overal hetzelfde patroon in... Dan komt dus in elk register hetzelfde patroon aan de uitgangen, tenzij je 8 verschillende latch lijnen neemt en komt het qua snelheid en pin gebruik weer beter uit door de shiftregisters in cascade te zetten.
@reactie hierboven, idd, al zou het kunnen maar dan gebruik je geen shiftregisters maar parallel-in parallel-out registers.
[Bericht gewijzigd door plantrekker op (19%)]
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
coaster,
Ik heb het wel eens gedaan: De 8 databits van een ISA bus op de DATA lijnen van de '595 chips en met de address comparator een "clock" signaal gemaakt. 8x een write en je had 64 bits in je '595 chips zitten. Ik heb de kaart nog liggen: 64 digitale inputs en 64 digitale outputs. 
(daarna heb ik het herhaald op de S-bus van Sun. Dan zweet je wel effe peentjes als je eigengemaakte kaart voor het eerst dat HFL 24000 werkstation ingaat...
)
Ik zou aanraden om de 8 datalijnen aan 8 pins van 1 en dezelfde poort te hangen. Dat is het efficientst.
Het serieel doorclocken is m.i. niet zo'n probleem. De '595 chips hebben een schuifregister waar je data in blijft zolang je niet de boel naar de uitgangsregisters clockt. Dus als je 100Hz verversing wilt doen, moet je 800 Hz per laag verversen. Dus heb je 1.25 milliseconde om met 64 shifts de data in de 595 chips te krijgen. Dat moet makkelijk lukken.
#include <avr/io.h>
void fill_shift (char *p)
{
unsigned char c, i, j;
for (i=0;i<8;i++) {
c = *p++;
for (j=0;j<8;j++) {
if (c & 1) {
PORTC |= 0x01;
} else {
PORTC &= 0xfe;
}
PORTC |= 0x2;
c >>= 1;
PORTC &= 0xfd;
}
}
}
Ik kom op ongeveer 8 clocks per bit, dus 600 clocks oftewel 30 microseconde voor 64 bits. Hou ik nog 24400 clocks over om andere dingen te doen.... 
plantrekker
True story bro!
rew, je c-code is softwarematige SPI, waarom? De PIC16F877A heeft een HW-SPI die in de tijd van 1 instructie 1 bit naar buiten kan klokken. 8 keer sneller dus dan de c-code.
/edit
Nog sneller dan 8 keer sneller zelfs, want terwijl dat de HW-SPI de byte naar buiten klokt kan je de volgende ophalen, daar verlies je dan geen tijd mee terwijl dat wel het geval is bij de c-code 
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Hmm, ik ga me er eens is in verdiepen...
Nu ik zit te rekenen lijkt het me zelfs dat ik geen interrupts nodig ga hebben:
I²C tijd (binnenhalen data uit EEPROM IC):
snelheid = 400.000Khz (400.000 Kbits/s)
tijd per bit = 1 / 400.000 = 2,5µSec.
tijd per 64 bits (1 verdieping) = 64 * 2,5 = 160µSec. (daar komen dan nog wel de start,stop, en adresbytes bij..
Blijft er voor de SPI over als ik een refresh rate van 100Hz neem (is beter dan 50):
1250 - 160 = 1090µSec.
De overgebleven tijd na de SPI kan ik gewoon delayen (of gewoon weglaten voor een snellere refresh), die tijd komt toch niet zo nauw.
Of sla ik de plank nu helemaal mis?
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Wat je kunt doen is 800 x per seconde een timer interrupt regelen. Die clockt dan even de volgende 64 bits naar het schuifregister en toggled de juiste kolom-outputs. Dan heb je in je "main" de tijd om "ongestoord" de patronen uit te rekenen. Uit de eeprom halen of wat dan ook....
plantrekker
True story bro!
Je kan dan telkens in de interrupt een teller ophogen. Wanneer die 32 is, zet je een valg. In je main weet je dan wanneer je een nieuw beeld moet berekenen (800/25=32, dus 25 beelden/sec)
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.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
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.
plantrekker
True story bro!
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!
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
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.
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Je kunt het maximum, wanneer ie terug naar nul gaat, ergens instellen. Zo kan je ieder aantal microseconden korter dan 13msec maken.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
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.
achterkant:
Ook zijn al 3 van de 8 verdiepingen klaar (= 192 LED's):
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%)]
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
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
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
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
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Update:
De printen zijn nu beiden klaar (een uC-print en een 595-print), en de cube zelf ook!
kuch*scheef*kuch
:
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 whileZit ik zo in de goede richting?
(En gaat dat uberhaupt wel lukken in 1638µSec.
?)
datasheet eens overlopen kan handig zijn