Hallo mensen,
Ik ben bezig om een 7 segments display met 4 cijfers aan te sturen. In dit display zitten 8 kathode aansluitingen en 4 anode aansluitingen. Er komen namelijk van alle 4 cijfers 1 anode en 8 kathode aansluitingen die allemaal per segment aan elkaar verbonden zijn. Dat wil zeggen dat je door een min aan te sluiten op een kathode aansluiting een segment selecteerd en door de + aan 1 van de 4 anodes kan kiezen in welk cijfer dit segment moet oplichten.
Ik stuur het geheel aan met een PIC16F84A die met behulp van een cd4017 een anode kan selecteren en een cd4094 om de bepaalde segmenten te selecteren dit om zo min mogelijk aansluitingen van mijn 16F84A te gebruiken.
Het cd4017 gedeelte werkt prima maar het probleem ligt hem bij het schuifregister. De cd4094 is een serial in/parallel out schuifregister dat nodig heeft een:
STROBE aansluiting, om een reeks 1en en 0en op te slaan in zijn geheugen.
DATA aansluiting om 1en en 0en aan te bieden die in het register worden "geschoven" bij iedere positieve clock puls.
CLOCK aansluiting om het volgende databit naar binnen te "schuiven"
OUTPUT ENABLE aansluiting om de reeks 1en en 0en die in het register staan op de pootjes te zetten.
Er gaan wel segmentjes branden dus het principe werkt maar alleen niet op de manier waarop ik verwacht had. Dit zal waarschijnlijk komen omdat dit de eerste keer is dat ik met een schuifregister werk en dus niet precies weet hoe ik hem aan moet sturen.
Iets wat ik niet helemaal begrijp is namelijk dat er geen reset ingang op zit. Wil dit zeggen dat na 8 positieve clock pulsen hij iedere bit in het schuifregister een nieuwe waarde heeft en dat je dus bij de volgende 8 pulsen gewoon over de vorige heen "schrijft"?
Of is daar de STROBE aansluiting voor die de net naar binnen geschoven data bij een hoge STROBE ingang naar zijn geheugen toeverplaatst en dan weer klaar is voor een nieuwe reeks van 8 1en en 0en?
En is het noodzakelijk dat je tijdens het naar binnen schuiven van de data de STROBE ingang de hele tijd hoog houd? Of hoeft dit enkel aan het einde van de reeks?
En klopt het dat de vorige reeks door gebruik van de STROBE ingang op de uitgangen blijft staan terwijl een nieuwe reeks data geladen wordt?
En is het zo dat die uitgangen aanblijven zolang de OUTPUT ENABLE ingang hoog blijft?
Is er iemand die bekend is met dit schuifregister en mijn vragen kan beantwoorden of me wat op weg kan helpen? Uit de datasheet wordt ik ook niet wijzer dan dit.
(P.S. Ik heb er rekening mee gehouden dat de bits juist laag moeten zijn om een brandend segment te krijgen aangezien ik de kathode moet schakelen.)
Alvast bedankt!
Groeten,
Jeroen
De strobe bedient een uitgangslatch en is dus niet flank-getriggered.
Als strobe=1, volgen de uitgangen het schuifregister direct, je ziet a.h.w. de bits er doorheen geschoven worden.
Als je wilt dat alle uitgangen tegelijk veranderen, moet je eerst alle 8 bits inschuiven, dan de strobe even open en weer dicht zetten.
Er is geen master reset, dus het register bevat na de power-up random data, totdat je de eerste data erin schuift.
Dit kun je voor lief nemen als de schakeling snel genoeg initialiseert.
Je kunt ook vóór het initialiseren de outputs op 3-state houden en externe pullups het niveau laten bepalen. Geef de uitgangen pas vrij als de eerste geldige data ingeschoven en gelatcht is.
N.B. Veel typen hebben wel een reset-ingang.
[Bericht gewijzigd door oorpijn op ]
Thanks voor je reactie!
Ik wil graag dat ze alle 8 tegelijk veranderen ja dus laad ik eerst 8 bits en dan maak ik STROBE hoog. Is de STROBE ingang dan voor het plaatsen van de bits op de uitgangen? In de datasheet staat namelijk:
The data in each shift register stage is transferred to the storage register when the STROBE input is high. Data in the storage register appears at the outputs whenever te OUTPUT ENABLE signal is high.
Dus ik dacht dat de data in het schuifregister pas op de outputs werdt gezet bij een hoog signaal op de OUTPUT ENABLE ingang maar dat is niet zo?
En dat gedeelte na de open regel gaat me wat te snel. Zou je dat ook nogmaals uit kunnen leggen voor iemand die nog niet echt bekend is met schuifregisters?
Thanks!
Als het nog nodig is: 
Op 8 februari 2005 22:44:40 schreef ·°*teslaman*°·:
Ik wil graag dat ze alle 8 tegelijk veranderen ja dus laad ik eerst 8 bits en dan maak ik STROBE hoog. Is de STROBE ingang dan voor het plaatsen van de bits op de uitgangen?
Nee, dat is voor het plaatsen van de bits in het uitgangsregister.
Op 8 februari 2005 22:44:40 schreef ·°*teslaman*°·:
In de datasheet staat namelijk:
The data in each shift register stage is transferred to the storage register when the STROBE input is high. Data in the storage register appears at the outputs whenever te OUTPUT ENABLE signal is high.
Dus ik dacht dat de data in het schuifregister pas op de outputs werdt gezet bij een hoog signaal op de OUTPUT ENABLE ingang maar dat is niet zo?
De data in het uitgangsregister staat op de uitgangen zolang OUTPUT ENABLE hoog is. (Die mag dus ook best van tevoren hoog zijn.)
Op 8 februari 2005 22:44:40 schreef ·°*teslaman*°·:
En dat gedeelte na de open regel gaat me wat te snel. Zou je dat ook nogmaals uit kunnen leggen voor iemand die nog niet echt bekend is met schuifregisters?
Direct nadat je spanning op het IC zet, staan alle bits van het register en de latch in een random stand. Dit wil je natuurlijk niet, maar je kunt hem niet resetten. Zet dus in eerste instantie OUTPUT ENABLE op inactief. Een extern aan te sluiten pullup trekt de uitgangen naar 1.
Zodra de eerste geldige data in register en latch staan, zet je OUTPUT ENABLE op actief en laat je dat permanent zo.
Dus ik moet extern in het schema iets verwerken dat ervoor zorgt dat de OUTPUT ENABLE ingang pas na de invoer van de eerste reeks data hoog wordt en hoog blijft? En klopt het wel dat als ik dus gebruik maak van die STROBE dat ik dan al een nieuwe reeks data kan laden terwijl de vorige nog op de uitgangen staat? En dat zodra ik op de STROBE ingang een pulsje zet hij de data naar het uitgangs register zet en omdat de OUTPUT ENABLE dan al hoog is meteen op de uitgangen van het schuifregister zet?
En is het echt zo'n probleem dat hij in het begin random info bevat? Want hij wordt per seconde duizenden keren opnieuw geladen met een reeks data om het te laten lijken dat alle 4 de cijfers tegelijk branden. Dus die paar µs aan het begin dat het schuifregister random data bevat merk je dan toch niet?
Dus is het dan ook mogelijk hem de gehele tijd aan de + te hangen?
logic
Maar dat is logisch ...
"Dus ik moet extern in het schema iets verwerken dat ervoor zorgt dat de OUTPUT ENABLE ingang pas na de invoer van de eerste reeks data hoog wordt en hoog blijft?"
Dat zou je kunnen doen, maar is niet noodzakelijk.
Hangt af van de eisen die je zelf stelt.
Als je geen random data te zien wilt krijgen, dan kun je de OUTPUT ENABLE ingang eerst laag houden en pas na de eerste zinvolle data hoog maken en permanent hoog houden.
Maar als die random data geen probleem is, dan knoop je de OUTPUT ENABLE ingang gewoon vast aan 5V.
"En klopt het wel dat als ik dus gebruik maak van die STROBE dat ik dan al een nieuwe reeks data kan laden terwijl de vorige nog op de uitgangen staat?"
Ja, klopt.
"En dat zodra ik op de STROBE ingang een pulsje zet hij de data naar het uitgangs register zet en omdat de OUTPUT ENABLE dan al hoog is meteen op de uitgangen van het schuifregister zet?"
Ja, klopt.
"En is het echt zo'n probleem dat hij in het begin random info bevat?"
Wat mij betreft niet, hangt van jou af.
(zie boven)
Ok hartelijk dank!
Dan zal ik de output enable eens aan de + hangen en het nog eens proberen. Geweldig die breadboardjes!:D
Nou om weer even terug te komen op mijn probleem van vorige maand:
Ik heb zo af en toe eens wat geprobeert maar het doet nog steeds niet wat het zou moeten doen. Ik heb de volledige schakeling opgebouwd op een breadboardje om wat te kunnen testen.
Het gedeelte met de 4017 werkt als hij zijn clocksignaal ergens anders vandaan krijgt maar niet als ik het met een microchip probeer.
Ik neem aan dat je dan op de output van de microchip voor een signaal moet zorgen dat 1 clock cycle hoog is en 1 clock cycle laag is.
bsf porta,0
bcf porta,0
of:
movlw 01h
movwf porta,0
movlw 00h
movwf porta,0
zou toch moeten werken als clock puls? Het wil maar niet lukken!
Iemand nog tips of ideeen?
alvast bedankt
logic
Maar dat is logisch ...
In je openingspost staat dat je het geheel aanstuurt met een PIC16F84A. Dat klopt nog steeds neem ik aan?
Heb de je pennen van poortA als outputs ingesteld?
Hang eens een LEDje aan die uitgang en kijk of 'ie brandt.
[Bericht gewijzigd door logic op ]
thanks voor de reactie logic
Idd ik maak gebruik van een 16F84A en heb de hele poort a gecleared en dus op output gezet.
Ik heb net nog geprobeert met een LED maar die gaf ook geen enkele reactie dus heb het nu even met een andere 16F84A geprobeert en deze doet het wel.
Hij werkt ook nu ook als clock van de 4017!:D Gaat goed!
En dan nu even over een programma voor de 4094 want dat wil nog niet echt. Ik heb de output enable aan de + gehangen. Ik laad eerst 8bits in het schuifregister en vervolgens maak ik de strobe ingang hoog zodat het op de uitgang komt te staan.
Bijvoorbeeld als ik een 1 wil hebben op het display, dan moeten Q2 en Q8 laag zijn en de rest hoog.
Ik neem aan dat de data naar binnen wordt geschoven vanaf Q1 naar Q8. De data pin zit op porta,0, clock op porta,1 en de strobe op porta,2
movlw 00h ;data for Q8
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 01h ;data for Q7
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 01h ;data for Q6
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 01h ;data for Q5
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 01h ;data for Q4
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 01h ;data for Q3
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 00h ;data for Q2
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
movlw 01h ;data for Q1
movwf porta
bsf porta,1 ;clock signal
bcf porta,1
bsf porta,2 ;STROBE input high
bcf porta,2
Of moeten het clock en het data signaal tegelijk aangediend worden?
logic
Maar dat is logisch ...
"Of moeten het clock en het data signaal tegelijk aangediend worden?"
Voor zover ik weet niet.
Eerst de data klaar zetten en tijd gunnen om stabiel te worden.
Als de datalijn stabiel is, dan geef je een clockpuls: even hoog en weer laag.
Die clockpuls moet ook een bepaalde lengte hebben, maar daar zul je met een 16F84A denk ik geen problemen mee krijgen.
Zo vreselijk snel loopt die niet, toch?
de 16F84A draait op een crystal van 4MHZ en volgens de datasheet van de cd4017 kan die een clock ferquentie aan van 10MHZ dus moet makkelijk kunnen.
Ik heb gister wat op het display kunnen krijgen maar gaat me nog niet gemakkelijk af. Ik blijf nog ff wat proberen. Ik heb gisteren een programma geschreven waarbij clock en data signaal tegelijk werden aangediend. Dat leek goed te gaan.
Is er dan niemand die ervaring heeft met het aansturen van een schuifregister met een PIC?
Ik zal nog wel ff wat proberen en hou jullie op de hoogte. Als je nog tips hebt hoor ik het graag.
Alvast bedankt
logic
Maar dat is logisch ...
Probeer de boel eens te vertragen en hang LEDjes aan de uitgangen, dan kun je volgen wat er gebeurt.
Iedere keer nadat je een signaal veranderd hebt, wacht je 1 seconde.
Je kunt dan precies zien welke lijnen hoog en welke laag zijn en wat het effect is.
Nu gaat alles zo snel dat je alleen kunt constateren dát 't fout gaat, maar niet wát er fout gaat.
Zoiets:
movlw 00h ;data for Q8
movwf porta
wait_1_sec ; ff wachten
bsf porta,1 ;clock high
wait_1_sec ; ff wachten
bcf porta,1 ;clock low
wait_1_sec ; ff wachten
...
... ; data voor Q7 t/m Q2
...
movlw 01h ;data for Q1
movwf porta
wait_1_sec ; ff wachten
bsf porta,1 ;clock high
wait_1_sec ; ff wachten
bcf porta,1 ;clock low
wait_1_sec ; ff wachten
bsf porta,2 ;STROBE high
wait_1_sec ; ff wachten
bcf porta,2 ;STROBE low
wait_1_sec ; ff wachten
Ik snap er nu echt niks meer van!
Ik heb nu gewoon 8 keer achter elkaar een ander bit laag gemaakt van het schuifregister en heb clock en data tegelijk aangediend. Oftewel 8 clock signalen en 8 data signalen.
Het vreemde is dat er nu dus soms meerdere LED's in het display tegelijk aan zijn terwijl ik iedere keer maar 1 bit laag heb gemaakt in het programma... Dus dat moet theoretisch helemaal niet kunnen. Nu neem ik niet aan dat de fout in mijn hardware zit. Ik denk dat ik iets verkeerd doe met het clock signaal. Het is een 8 bit schuifregister... dus na 8 clock pulsen zou toch de data van de vorige reeks volledig overschreven moeten zijn?
(ik heb na iedere nieuwe lading een delay dus ik kan precies zien wat er gebeurt)
Nou dat is nogal een lap tekst en ik heb geen internet verbinding op me windows computer, alleen op me mac. Dus dat kan niet met copy paste. Dus dat zou een beetje een probleem zijn...
logic
Maar dat is logisch ...
movlw 02h ;zo is de data laag en clock hoog ==>Q8
movwf porta
bcf porta,1 ;clock laag
movlw 03h ;data en clock tegelijk hoog
movwf porta
bcf porta,1 ;clock laag
movlw 03h ;data en clock tegelijk hoog
movwf porta
bcf porta,1 ;clock laag
movlw 03h ;data en clock tegelijk hoog
movwf porta
bcf porta,1 ;clock laag
movlw 03h ;data en clock tegelijk hoog
movwf porta
bcf porta,1 ;clock laag
movlw 03h ;data en clock tegelijk hoog
movwf porta
bcf porta,1 ;clock laag
movlw 02h ;data laag en clock hoog ==>Q2
movwf porta
bcf porta,1 ;clock laag
movlw 03h ;data en clock tegelijk hoog
movwf porta
bcf porta,1 ;clock laag
bsf porta,2 ;strobe hoog
movlw 10h ;clock signaal 4017 hoog
movwf porta
call delay
movlw 00h ;clock signaal 4017 laag
movwf porta
call delay
Ik heb de cd4017 met de reset gehangen aan de 5e uitgang en heb dus ook rekening gehouden om na de 4e hoge clock puls van de 4017 nog een 2e clock puls te geven zodat hij weer naar het eerste cijfer springt.
(wat ik net zie tijdens het overtypen is dat ik strobe niet meer laag maak. Zou dat een probleem kunnen vormen?)
logic
Maar dat is logisch ...
Als deze code in een LOOP staat, dan zou dat zeker een probleem kunnen vormen.
Maar wat ik niet snap: nou zit ik net te vertellen dat de datalijn stabiel moet zijn voordat je een clockpuls geeft, en dan ga je data en clock tegelijk aansturen.
Dat moet je nou net niet doen.
Het zou goed kunnen dat het nu allemaal wat te snel gaat voor dat IC.
Ik heb een stuk voorbeeldcode neergezet met "ff wachten" erin om de boel te vertragen.
Dan kun je zien welke lijnen hoog of laag zijn (als je d'r LEDjes aan hangt) en wat het effect is.
Als je (om te testen) de strobelijn vast aan 5V hangt, moet je de bits het IC "in zien schuiven".
Dat lijkt me handiger om te testen dan wat jij doet.
Nu gaat alles zo snel dat debuggen bijna onmogelijk wordt.
Keyword: VERTRAGEN.
Hey Logic
Ja sorry ik had gister een programma geschreven om een F op mijn display te krijgen en toen kreeg ik een F in spiegelbeeld te zien maarja dat zal wel gewoon toeval geweest zijn maar toen dacht ik dus dat dat wel succes had om data en clock tegelijk aan te dienen. Dan zal ik het nu nog eens proberen om eerst het data signaal aan te voeren en dan pas het clock signaal.
Ik heb ook nog geprobeert met het strobe signaal weer laag maken maar dan veranderd er niks.
ja idd strobe aan de + hangen is wel een goed idee ja. Dat zal ik nu eens even proberen. Ik kan dan net zo goed het display er aan laten hangen. Ik zal het eens even proberen en laat het je weten alst wat opleverd... Of niet.