Hallo,
Ik wil een HTPC gaan inbouwen in de behuizing van een oude CD-speler. Daar zit zo'n mooi zwart venstertje op, waar ik een display achter wil zetten om track-informatie te tonen. Ik kom aan 7 cijfers: 2 voor het track-nummer en h:mm:ss. Uiteraard ga ik 7-segments displays gebruiken. De afspeel-software (zelf geschreven in VB6) zal via de seriele poort het display moeten gaan aanspreken.
Ik ben een complete electronica-n00b, dus ik heb wat research gedaan (Google is je vriend -- zo heb ik deze site ook gevonden), maar ik zou graag wat feedback op mijn plannen hebben van mensen die dit soort zaken vaker hebben opgelost!
Ik denk dat het het makkelijkst is als ik een PIC ga gebruiken om de display aan te spreken. Ik heb op http://www.melabs.com/resources/articles/ledart.htm voorbeeld-code en een schakeling gevonden om die displays te multiplexen.
Ik zat er aan te denken om een 16F628 te gebruiken, maar ik heb wel 7 displays aan te sturen -- als je voor elk een 'aan'-periode van 1ms aanhoudt, dan is elk display dus 1 ms aan en 6 ms uit. Is dat 'rustig' genoeg, of gaat dat knipperen? Ik zou nl. ook een 16F877A kunnen gebruiken, dan kan ik 2 displays tegelijkertijd aanspreken (33 pinnen, 2 voor RS232, 7 voor selectie displays -> 16 pinnen over -> 2 displays tegelijkertijd aansturen). Dan heb ik dus 4 cycles in plaats van 7, en dat zal toch wel schelen. Aan de andere kant is de 16F877A wel een stuk groter en duurder!
Dan is er nog de RS232-interface met de PC. Ik vond op http://www.circuitsonline.net/forum/view/817 een schakeling die gebruik maakt van de MAX232 -- op diverse webpages stond dat je d'r wel mee weg kon komen om de PIC direct aan de RS232-pinnen te hangen, maar ik heb liever een nette oplossing...
Beide 'kandidaten' voor de PIC hebben een USART. Ik wil de software in JAL gaat schrijven (lijkt het makkelijkst, en zoals elke software engineer ben ik liever lui dan moe!). Ik zie dat JAL de library 'serial' bevat, maar die wacht op input via de interface. Dat zou betekenen dat mijn 'update het display'-loop zou moeten wachten op input voordat het verder kan. Liever zou ik met een soort 'interrupt' werken die de waardes van de displays update, terwijl de update-routine gewoon doorloopt.
Ik heb wat gevonden op http://www.geocities.com/vsurducan/electro/PIC/usart.txt, maar daar zit geen documentatie bij die de precieze werking van die routines uitlegt.
Graag hoor ik jullie mening!
Het idee dat je nu hebt lijkt me op het eerste gezicht goed. De leds kun je ook wel op deze manier doen denk ik je zou ze niet moeten zien knipperen.
Zou het niet makkelijker zijn om een lcd'tje te gebruiken? die zijn over het algemeen makkelijker om aan te sturen via de computer. Op internet zijn zat schema's te vinden.
Op 31 maart 2004 22:11:04 schreef Bliksem:
Zou het niet makkelijker zijn om een lcd'tje te gebruiken? die zijn over het algemeen makkelijker om aan te sturen via de computer. Op internet zijn zat schema's te vinden.
Nu zit achter dat zwarte venstertje ook een display met 7-segment LED-displays, en ik wil de kast zo authentiek mogelijk houden. Bovendien denk ik dat ik een behoorlijk heftige backlight zou moeten hebben om de LCD door dat venstertje te zien.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 31 maart 2004 21:51:28 schreef Fub:
Ik denk dat het het makkelijkst is als ik een PIC ga gebruiken om de display aan te spreken.
Algemeen genomen kun je het beste een microcontroller nemen. Welke dat wordt is dan gewoon een keuze die je moet maken, PIC, AVR, of wat dan ook.
Dan heb ik dus 4 cycles in plaats van 7, en dat zal toch wel schelen.
Voor het afbeelden van data dmv een ledje of een 7-segments display maakt enkele cycles meer of minder niet uit. Het oog ziet dat verschil toch niet. Je moet streven naar het kunnen displayen van je data met 50Hz. Langzamer zal zorgen voor eventuele zichtbare flikkering, en sneller helpt niet want dat zie je toch niet en kan zelfs resulteren in een lagere intensiteit van het licht omdat de led's niet genoeg tijd krijgen om aan te gaan.
Dan is er nog de RS232-interface met de PC. Ik vond op http://www.circuitsonline.net/forum/view/817 een schakeling die gebruik maakt van de MAX232 -- op diverse webpages stond dat je d'r wel mee weg kon komen om de PIC direct aan de RS232-pinnen te hangen, maar ik heb liever een nette oplossing...
Die schakeling (die ik toen heb gepost
) is de nette manier. Dus door een MAX232 te gebruiken als interface tussen de RS232 signalen en de PIC signalen.
In het plaatje is alleen gebruik gemaakt van een PIC zonder interne UART. Bij een UART moet je uiteraard de RxD en de TxD aansluiten op de MAX232 ipv wat daar staat.
Op 1 april 2004 00:12:33 schreef Bastiaan:
Je moet streven naar het kunnen displayen van je data met 50Hz.
Kijk, dat soort vuistregels, daar was ik naar op zoek! Elke display 2 ms levert zo'n 70Hz op, dat zal wel voldoende zijn, denk ik zo.
Bij een UART moet je uiteraard de RxD en de TxD aansluiten op de MAX232 ipv wat daar staat.
Ah, dus de UART moet met 4 pinnen aangesproken worden... Dat stond ongetwijfeld ook in de datasheet, maar die dingen goed kunnen lezen/begrijpen is ook een vak apart. 
Dat betekent dat ik, als ik de 16F628 gebruik, ik ook nog een BCD-naar-10-lijnen ICtje moet gebruiken voor de selectie van de display die aan moet, anders kom ik lijnen tekort.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 1 april 2004 09:17:48 schreef Fub:
Ah, dus de UART moet met 4 pinnen aangesproken worden...
De UART vanuit de PIC heeft een receive (RxD) en een transmit (TxD) pin. Die moet je met de MAX232 verbinden. De MAX232 zet de signalen om naar de RS232 signaalniveau's.
Het gaat dus eigenlijk om 2 soorten lijnen.
Op 1 april 2004 23:19:31 schreef Bastiaan:
De UART vanuit de PIC heeft een receive (RxD) en een transmit (TxD) pin. Die moet je met de MAX232 verbinden. De MAX232 zet de signalen om naar de RS232 signaalniveau's.
Als ik in de datasheet kijk (PDIP versie), dan zie ik op pin 7 de RX en op pin 8 de TX -- dat zijn de twee lijnen die ik voor de RS232 nodig heb, correct? Dat zijn dus ook RB1 en RB2, dus ik 'verlies' 2 bits uit mijn B-poort.
Voor de klok heb ik pin 15 en pin 16 nodig, dat zijn RA6 en RA7, dus ik verlies ook 2 bits uit mijn A-poort.
Als ik dan zo even tel, dan blijven er 5 bits over op de A-poort en 6 op de B-poort. Met een BCD -> 10 lijnen IC en een BCD -> 7 segments IC kom ik dus goed uit met mijn lijnen.
Is dat allemaal correct? In ieder geval dank voor je hulp -- als je nooit met electronica gewerkt hebt, dan is het eerste begin behoorlijk intimiderend...
Als ik tel kom ik maar aan 8 pinnen. Je kan een BCD decoder met vier bits aan sturen, dan kan je alle hex tekens maken. Dan kan je om de verschillende cijfers te selecteren een multiplexer gebruiken. Daar heb je dan drie bits nodig om 8 cijfers te kunnen sturen en dan ook nog een enable.
Als je voor de BCD decoder een ic's neemt met een latch functie kan je eventueel zelfs met nog minder pinnen doen.
Als decoder kan je bijvoorbeeld de SN 74LS47 gebruiken.
Op 2 april 2004 13:19:53 schreef zoeloelip:
Als ik tel kom ik maar aan 8 pinnen.
Hmmm. Wat heb ik dan verkeerd gedaan in mijn telling?
Op poort A heb ik RA0 t/m RA4 vrij, toch? Da's 5 pinnen. En op poort B RB0 en RB3 t/m RB7, da's 6. En dat maakt samen 11 pinnen. (Want op RA6 en RA7 sluit ik het kristal aan, en op RB1 en RB2 komt de RS232 te hangen.)
Of bedoel je dat ik de hele schakeling met 8 pinnen kan bouwen? Ja, dat weet ik, en omdat 8 < 11 is, kom ik uit met mijn pinnen.
Je kan een BCD decoder met vier bits aan sturen, dan kan je alle hex tekens maken.
Dat weet ik nog van mijn machine-practica uit mijn eerste jaar informatica. 
Als je voor de BCD decoder een ic's neemt met een latch functie kan je eventueel zelfs met nog minder pinnen doen.
Hoe werkt een latch? Als ik op Google zoek op 'latch bcd', dan vind ik een enorme hoeveelheid datasheets, maar geen tekst die uitlegt wat een latch precies is.
Als decoder kan je bijvoorbeeld de SN 74LS47 gebruiken
Ik zou liever de CA 3161 gebruiken, want die heeft ook 'letters' als de H, E en L -- kan ik mijn display'tje bij het opstarted 'HELLO' laten zeggen. 
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
suggesties:
- kijk eens naar goedkopere 28 of 40 pin chips dan de 16F877, bv 16F77, 16F72.
- met wat schuifregisters (74HC595) kan je het zonder multiplexen doen
- denk met multiplexen wel aan de stromen die er gaan lopen! bv 10 mA / segment, 1 : 7 multiplexing, dus de piek segment-stroom is 70 mA (te veel voor een PIC pin, neem een 2803 ofzo), de piek digit stroom is 7 x 70 mA = 490 mA, ik denk dat een high-side driver dat nog wel redt, anders een power tor of FET.
Bedenk dat je voeding wel de stroom moet kunnen leveren, alle digits aan is 490 mA continu!
Op 2 april 2004 15:36:07 schreef Wouter van Ooijen:
- kijk eens naar goedkopere 28 of 40 pin chips dan de 16F877, bv 16F77, 16F72.
Ik had al besloten om een 16F628 te gaan gebruiken, scheelt toch weer meer dan de helft!
- met wat schuifregisters (74HC595) kan je het zonder multiplexen doen
Ik heb geen idee wat een schuifregister is, maar ik heb net wat uitleg gevonden op http://homepages.which.net/~paul.hills/Software/ShiftRegisterBody.html, dat ga ik vanavond eens bestuderen. Dank voor de tip!
- denk met multiplexen wel aan de stromen die er gaan lopen! bv 10 mA / segment, 1 : 7 multiplexing, dus de piek segment-stroom is 70 mA (te veel voor een PIC pin, neem een 2803 ofzo), de piek digit stroom is 7 x 70 mA = 490 mA, ik denk dat een high-side driver dat nog wel redt, anders een power tor of FET.
Ik was van plan om displays met een gezamenlijke plus te gaan gebruiken, en die via een transistor 'open' te zetten, zoals in het voorbeeld van het artikel waar ik in mijn eerste post naar verwijs. Dat moet dan geen probleem zijn, toch?
Bedenk dat je voeding wel de stroom moet kunnen leveren, alle digits aan is 490 mA continu!
Ik moet so-wie-so nog een labvoeding hebben, dus daar zal ik bij de aanschaf rekening mee houden. Uiteindelijk zal het in een computer-kast ingebouwd worden, ik zat te denken dat ik dan een molex-connnector af zou kunnen tappen. De voeding die ik voor de computer heb is in ieder geval 100W, ik zal (als ik hem binnen heb) de specs eens kritisch bekijken.
Dank voor de tips!
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 2 april 2004 16:13:18 schreef Fub:
Ik had al besloten om een 16F628 te gaan gebruiken, scheelt toch weer meer dan de helft!
Neem dan een 16F628A, dat is nog goedkoper, of zelfs een 16F630 (maar dat is lastiger want die heeft geen UART).
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 2 april 2004 16:13:18 schreef Fub:
Ik was van plan om displays met een gezamenlijke plus te gaan gebruiken, en die via een transistor 'open' te zetten, zoals in het voorbeeld van het artikel waar ik in mijn eerste post naar verwijs. Dat moet dan geen probleem zijn, toch?
Mits die transistor 0.5 A aankan. En kijk dan ook even naar de negatieve kant, gewoon op PIC pinnen aansluiten gaat niet lukken.
Op 2 april 2004 16:21:06 schreef Wouter van Ooijen:
Neem dan een 16F628A, dat is nog goedkoper
Noted!
Op 2 april 2004 16:21:53 schreef Wouter van Ooijen:
Mits die transistor 0.5 A aankan.
In het voorbeeld wordt een 2N3906 gebruikt, volgens de datasheet kan die 200mA aan, da's toch genoeg voor 1 segment (want meer dan 70mA). De displays zouden per digit een plus moeten hebben, dus ik ga zoveel transistors als digits gebruiken.
En kijk dan ook even naar de negatieve kant, gewoon op PIC pinnen aansluiten gaat niet lukken.
Is de multiplex-frequentie zo hoog dat de lijnen niet de kans krijgen om hun stroom kwijt te raken? Dat is dan inderdaad een probleem...
Maar als ik een display driver gebruik, zoals de CA3161, dan hoeft die dus per pin maar 10mA te sinken. Ik kan in de datasheet van dat ding niet vinden of hij dat aan zou kunnen, maar misschien weet ik niet waar ik naar moet zoeken.
Ik denk dat ik vanavond eens mijn would-be schakeling ga uittekenen, om de ideeen eens op een rijtje te krijgen.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 2 april 2004 16:47:27 schreef Fub:
In het voorbeeld wordt een 2N3906 gebruikt, volgens de datasheet kan die 200mA aan, da's toch genoeg voor 1 segment (want meer dan 70mA).
Voor 1 segment wel, maar jij wil 7 segmenten gebruiken. Gemiddeld wil een segment (die een 8 aangeeft) 70 mA hebben (laten we de punt even vergeten). Dus gedurende 1/7 van de tijd moet je er 7 x 70 mA doorheen jagen. Da's een consequentie van het multiplexen...
Op 2 april 2004 16:57:30 schreef Wouter van Ooijen:
Voor 1 segment wel, maar jij wil 7 segmenten gebruiken. Gemiddeld wil een segment (die een 8 aangeeft) 70 mA hebben (laten we de punt even vergeten). Dus gedurende 1/7 van de tijd moet je er 7 x 70 mA doorheen jagen. Da's een consequentie van het multiplexen...
Dat snap ik niet. Als ik de digits parallel schakel, en elke digit heeft zijn eigen transistor, dan gaat er door een transistor toch alleen maar de stroom voor 1 digit?
De volgorde is dus +5V -> transistor -> display -> weerstand -> display-driver -> aarde, en dat 7 keer.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 2 april 2004 17:09:02 schreef Fub:
Dat snap ik niet. Als ik de digits parallel schakel, en elke digit heeft zijn eigen transistor, dan gaat er door een transistor toch alleen maar de stroom voor 1 digit?
Correct. En die stroom moet (bij het afbeelden van een 8, en bij 10 mA per segment) *gemiddeld* 70 mA zijn. Aangezien ieder digit 1/7 van de tijd aan is, wordt de *piek* stroom dus 7 x 70 mA.
Marcel
AVR C tutorial http://expand.xs4all.nl/avr
Op 2 april 2004 17:31:19 schreef Wouter van Ooijen:
Correct. En die stroom moet (bij het afbeelden van een 8, en bij 10 mA per segment) *gemiddeld* 70 mA zijn. Aangezien ieder digit 1/7 van de tijd aan is, wordt de *piek* stroom dus 7 x 70 mA.
De piekstroom wordt niet automatisch 7 x 70mA. Maar als je dezelfde helderheid wilt houden als wanneer je niet zou multiplexen, dan moet je de stroom vermenigvuldigen met het aantal displays. Dat is denk ik wat je wilt zeggen.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 2 april 2004 19:19:42 schreef Marcel: Dat is denk ik wat je wilt zeggen.
Sterker nog, dat is wat ik zeg. Gemiddeld 10 mA /segment => peikstroom 470 mA per digit.
Op 2 april 2004 19:41:58 schreef Wouter van Ooijen:
Sterker nog, dat is wat ik zeg. Gemiddeld 10 mA /segment => peikstroom 470 mA per digit.
Maar d'r is maar een digit per keer aan, dus er loopt maar (maximaal) 70 mA door het circuit. Als de digits allemaal tegelijk aan zouden zijn, dan zou je inderdaad 490mA trekken, maar dat is dus nooit het geval. Aan de andere kant moet er, voor de 'splitsing', wel 490mA door kunnen, en de transistors moeten dat wel tegen kunnen houden.
Maar hoe zit het dan met de uitvoer-kant? Aan 1 pin van de display-driver zitten 7 segmenten gekoppeld. Als ik die door het multiplexen ook bij elkaar op moet tellen, dan betekent dat, dat de driver op 1 pin ook 70mA moet kunnen sinken. En als ze allemaal een 8 moeten laten zien, dan moet de driver dus ook die 490mA kunnen sinken. (En als ik Wouter's reacties goed lees, dan moet ik daar dus ook van uit gaan.)
Ik kan in de datasheet van de driver die ik zou willen gebruiken (http://www.intersil.com/data/fn/fn1079.pdf) niet zien hoeveel stroom hij kan sinken -- maar misschien kijk ik verkeerd. Wel kan ik me voorstellen dat 490mA wat te veel van het goede is -- hoe kan ik die dan sinken? Stel dat ik d'r een inverter op zet (zodat de driver een '1' geeft voor alle segmenten die aan moeten), en met die 1 een 70mA transistor aanstuur, die dan dus de stroom doorlaat naar de aarde. Zou dat werken? Dan gaat de stroom in ieder geval niet door de display driver heen.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 2 april 2004 22:11:52 schreef Fub:
Maar d'r is maar een digit per keer aan, dus er loopt maar (maximaal) 70 mA door het circuit.
Dat kan, maar dan geeft je display net zoveel licht als wanneer je continu er 1 mA per segment doorheen stuurt. Om dezelfde helderheid te bereiken als 10 mA continu zal je er (per segment) 70 mA (piek, gedurende een-zevende van de tijd) doorheen moeten sturen. Dat is de essentie van multiplexen.