Hoi,

Ik ben ruim 2 weken aan het stoeien (nu veranderd in vechten:() met een setje 4094, en ben inmiddels aardig wanhopig. Wat is het probleem ?
Ik probeer met 2 van deze IC's in totaal 16 uitgangen te sturen. Ik heb beide 4094 op een breadbordje gebouwd en aangesloten op een Atmel 2313 met 3,686 MHz.

Schema overzicht:
IC1 gekoppeld met pin 10 naar pin 2 van IC2 om data door te kunnen voeren (Pin 10 van IC2 naar GND). Verder de "Strobe" en de "Clock" ook aan elkaar geknupt en ook pin 15 aan 16 van beide IC's aan +5V. Op bijna alle data-output-pinnen heb ik een 10K weerstand, met daarachter een LEDje.

Aansturing :
1) Eerst voer ik de "data" in, middels een +5V en direct erna een 0V, wanneer het een "1" betreft. Wanneer het een "0" betreft voer ik niets uit, omdat pin 2 immers default op 0V staat.
2) Ter afsluiting van iedere ingevoerde bit ( "0" of "1" ) zet ik de "Clock"-pin op +5V, opgevolgd door een 0V.
Dit gaat in een loop met het "data" invoeren van 1).
3) Ter afsluiting (na alle 16 bits gezet te hebben),zet ik de "Strobe"-pin op +5V om vervolgens weer naar 0V te zetten.

Probleem:
Lichtjes gaan willekeurig aan, en de verlichting schuift soms willekeurig door in de richting van IC2. (Alsof het een soort looplicht is:+). Ik heb rustmomenten varieerend van 1 uS tot 500 ms ingesteld, maar het blijft prut.

O, ja,. ik heb ook al geprobeerd : Clock +5V, ( bij een "1" )Data +5V, Data 0V, Clock 0V, en na 16 keer, Strobe +5V, Strobe 0V.
En natuurlijk ook al andere 4094 ICs geprobeerd.

Ik heb het vermoeden dat ik iets niet goed doe met de aansturing, of de electronische aansluitingen (Hmm,. waar is die pin 9 voor ?).

Maar, wat doe ik nu niet goed ? GRMBL !!|:(

Op 12 april 2005 12:43:55 schreef evarist:
Prozac

Hmm,. ik vermoed dat ik daarmee niet de 4094 aan het werk krijg :)

ontkoppelcondensatortjes gebruikt? Rule number 1 bij digitale (vooral CMOS) ic's

Op 12 april 2005 12:23:59 schreef oxurane:
Aansturing :
1) Eerst voer ik de "data" in, middels een +5V en direct erna een 0V, wanneer het een "1" betreft. Wanneer het een "0" betreft voer ik niets uit, omdat pin 2 immers default op 0V staat.
2) Ter afsluiting van iedere ingevoerde bit ( "0" of "1" ) zet ik de "Clock"-pin op +5V, opgevolgd door een 0V.
Dit gaat in een loop met het "data" invoeren van 1).
(...)
O, ja,. ik heb ook al geprobeerd : Clock +5V, ( bij een "1" )Data +5V, Data 0V, Clock 0V, en na 16 keer, Strobe +5V, Strobe 0V.

Heb ff de datasheet bekeken, en dan vooral het timing diagram, hij moet als volgt:

1) data lijn instellen op 0 (0V) of 1 (5V).
2) clock pin 1 (5V) en dan weer 0 (0V) maken.
dan weer naar stap 1, totdat je 16 bits hebt verstuurd en dan een pulse op de strobe.

Eerst de data pulsen en dan de clock gaat niet werken, wat er gebeurt is dat op het moment dat je een clock puls geeft hij de waarde die op dat moment op de data lijn staat overneemt. Verder moet de data lijn al 3ns lang 'hoog' of laag zijn voordat je de clock stuurt, maar dat zal wel loslopen.

Volgens mij moet je pin 10 van IC2 ook laten zweven, anders trek je de laatste data lijn naar 0.

Op 12 april 2005 13:29:35 schreef Aaargh!:
[...]
Heb ff de datasheet bekeken, en dan vooral het timing diagram, hij moet als volgt:

1) data lijn instellen op 0 (0V) of 1 (5V).
2) clock pin 1 (5V) en dan weer 0 (0V) maken.
dan weer naar stap 1, totdat je 16 bits hebt verstuurd en dan een pulse op de strobe.

Maar volgens mij doe ik het al zo.
1 : Data 0V of 5V ( 0="0", 5V="1" )
2 : Data 0V
3 : Clock 5V
4 : Clock 0V
Dit 16 maal en dan :
5 : Strobe 5V
6 : Strobe 0V

Of moet het juist zo :
1 : Data 0V of 5V ( 0="0", 5V="1" )
2 : Clock 5V
3 : Clock 0V
4 : Data 0V (evt weglaten)
En dan na 16 maal :
5 : Strobe 5V
6 : Strobe 0V

Volgens mij moet je pin 10 van IC2 ook laten zweven, anders trek je de laatste data lijn naar 0

Ik had het uit een Elektuur (van internet) gehaald, waarin stond dat de 10 naar 0V ging. Ik kan het altijd nog even loshalen.
Verder zag ik in het boek van B. Kainka dat ipv pin 10 op IC1 pin 9 van IC1 doorgelust werd naar IC2, pin 2.
Aangezien ik meer vertrouwen heb in Elektuur dan in het boek van B. Kainka.... (al heeft hij ook artikelen voor Elektuur geschreven)
Ik ben inmiddels al weer wat opgevrolijkt door de snelle reacties / adviezen. :)

Op 12 april 2005 14:00:04 schreef oxurane:
Of moet het juist zo :
1 : Data 0V of 5V ( 0="0", 5V="1" )
2 : Clock 5V
3 : Clock 0V
4 : Data 0V (evt weglaten)
En dan na 16 maal :
5 : Strobe 5V
6 : Strobe 0V

Zo moet ie ja.

stap 4 kan idd weg.

Op 12 april 2005 14:00:04 schreef oxurane:
Of moet het juist zo :
1 : Data 0V of 5V ( 0="0", 5V="1" )
2 : Clock 5V
3 : Clock 0V
4 : Data 0V (evt weglaten)
En dan na 16 maal :
5 : Strobe 5V
6 : Strobe 0V

Zo, ja. Stap 4 kan weg.

Edit: hehhehehehehheehhehehhehhehehehhhhhhhh........

Op 12 april 2005 14:02:04 schreef Aaargh!:
[...]
Zo moet ie ja.

stap 4 kan idd weg.

Shit wat snel zeg !

(Offtopic)
Ehm,. volgens mij zit je op de campus, he ? (Ik heb op WBW gewoond) Hebben ze daar toevallig nog Windows 200 DDK op het net liggen ?
(Ivm Igorplug)
(/OffTopic)

Op 12 april 2005 14:05:41 schreef oxurane:
[...]
Shit wat snel zeg !
Ehm,. volgens mij zit je op de campus, he ?

yep.

(Ik heb op WBW gewoond) Hebben ze daar toevallig nog Windows 200 DDK op het net liggen ?

DDwatte?

Op 12 april 2005 14:06:54 schreef Aaargh!:
[...]
yep.
[...]
DDwatte?

Windows 2000 Driver Development Kit
Ik kon hem niet op SNT-server vinden, en is maar op 1 plek te downloaden, maar dat wil niet echt, vanwege het langzame downloaden (afgebroken). En ja, in het hedendaagse leven, buiten de campus heb je al snel te maken met datalimieten :(

[Bericht gewijzigd door oxurane op ]

Op 12 april 2005 14:09:09 schreef oxurane:
[...]
Windows 2000 Driver Development Kit

Als je lid bent van inter-actief kan je 'm downloaden van MSDN AA (legaal).

En anders is ie idd ook wel te vinden.

Op 12 april 2005 14:10:38 schreef Aaargh!:
[...]
Als je lid bent van inter-actief kan je 'm downloaden van MSDN AA (legaal).

Mag ik opmerken dat ik vertrokken ben in 2000 ? (ben dus alweer een oude l*l met kids en vrouw)

Maar goed,. indien ie op het net te vinden is, kan ik vragen of een bekende uit E'de het voor me op 'n CD kan zetten, of op een server.

[Bericht gewijzigd door oxurane op ]

Op 12 april 2005 14:13:38 schreef oxurane:
[...]
Mag ik opmerken dat ik vertrokken ben in 2000 ? (ben dus alweer een oude l*l met kids en vrouw)

Ach gut...

btw, afstuderen is toch geen reden om meteen huisje-boompje-beestje te gaan spelen, da's je eigen schuld :-P

Op 12 april 2005 14:19:24 schreef Aaargh!:
[...]
btw, afstuderen is toch geen reden om meteen huisje-boompje-beestje te gaan spelen, da's je eigen schuld :-P

GRMBL !

Maar goed,. bedankt voor je info. Ik ga zometeen weer eens aan de slag met het testen.

Trouwens, waarin programmeer jij je 2313 ? Doe je dat met Bascom of met AVR-Studio ?

[Bericht gewijzigd door oxurane op ]

Op 12 april 2005 14:21:10 schreef oxurane:
Trouwens, waarin programmeer jij je 2313 ? Doe je dat met Bascom of met AVR-Studio ?

GCC als C compiler, AVR-Studio met een STK-500 om de chip te programmeren.
Bascom gebruik ik niet, het gebruik van basic vindt ik niet zo'n goed idee (understatement)

[Bericht gewijzigd door Aaargh! op ]

Is het je inmiddels al gelukt? Laat anders je code eens zien. Ik heb het al eens een 4094 an een AT90S2313 gekoppeld.

Op 12 april 2005 19:36:03 schreef Marcel:
Is het je inmiddels al gelukt? Laat anders je code eens zien. Ik heb het al eens een 4094 an een AT90S2313 gekoppeld.

Inmiddels thuis achter de PC en aan het stoeien geweest. Tot mijn verbazing had ik het toch goed staan. Gelijk maar eens het breadboardje met 2 4094 ICs aan een testboardje van een ATMega8 gehangen, maar daar hetzelfde probleem.
IC1 heeft de LEDjes 1 t/m 8, IC2 de LEDjes 9 t/m 16. Het lijkt erop dat alles eerst random ingesteld is (verklaarbaar : pin 15 aan 5V).
Zodra ik echter een waarde invoer en verwerk, schuift de verlichting 2 stapjes op, richting IC2 (looplicht).
En, voer ik de waarde "0" (Opdracht = 0) in, dan gaan de eerste 2 LEDs uit. Alles hoger dan "0", dan gaan eerste 2 LEDs aan.
Dus :
Opdracht = 0 => LED1 en LED2 uit.
Opdracht = 1 (of hoger) => LED1 en LED2 aan.

Bij iedere volgende nieuwe invoer gaat het gewoon weer doorschuiven naar uiteindelijk LED15 en LED16.

Merkwaardig....

Goed,. de broncode (BASCOM) :


Dim Opdracht as Long, I as Byte, J as Word

 Data_Out Alias Portb.0    'Data Out
 Clk      Alias Portb.1    'Clock
 Strobe   Alias Portb.2    'Strobe

 DDRB = 7 'Zet poort B, pin 0, 1 en 2 als output
 PORTB = 0
 IF Opdracht <= 65535 THEN 'Is het een Word
    J = 32768
    FOR I = 1 To 16      'Alle 16 pinnen instellen
       '[Data in de 2 4094 proppen ]
        IF Opdracht >= J THEN
           SET Data_Out  'Identiek is PortB.0 = 1
           Opdracht = Opdracht - J
        ELSE
           RESET Data_Out
        END IF
       '[Clockpuls]
        SET Clk
       'WAITUS 10 
        RESET Clk
        J = J / 2
    NEXT
   '[Strobe]
    SET Strobe
   'WAITUS 10
    RESET Strobe
    PRINT "Invoer OK";
  ELSE
    PRINT "Waarde onjuist";
  END IF

Verder moet het volgens mij niet zoveel uitmaken, wanneer ik het aan een 2313 of een ATMega8 hang, alleen poort veranderd.

Marcel, hoeveel 4094 IC's heb jij eraan geplakt en wat is bij jou de broncode (in BASCOM) ?

[Bericht gewijzigd door oxurane op ]

Op 12 april 2005 14:27:53 schreef Aaargh!:
[...]
GCC als C compiler, AVR-Studio met een STK-500 om de chip te programmeren.
Bascom gebruik ik niet, het gebruik van basic vindt ik niet zo'n goed idee (understatement)

Ja,. ik begrijp het. Maar voor mij is de overstap van Visual Basic naar BASCOM redelijk vloeiend. Al moet ik eerlijk bekennen dat ik eerst het boek van Dananjay V. Gadre heb aangeschaft, maar toen meteen de kriebels kreeg bij het lezen van de eerste 100 pagina's.
Vervolgens heb ik een boek aangeschaf over Bascom, waardoor ik snel aan de slag kon.
Ik ben zo iemand die niet altijd even veel geduld kan opbrengen. Verrassend,... wanneer je bedenkt dat ik eerst 2 volle weken heb zitten klooien met het huidige probleem, voordat ik hier om hulp begon te vragen.

Probleem met Bascom is -naar mijn gevoel- weer dat er royaal gebruik wordt gemaakt van de beperkte ruimte op de AVR's.

Dus, ik denk dat ik wel na verloop van tijd het boek van D.V. Gadre weer ga pakken. Het zal dan een stukje makkelijker worden om het door te lezen, omdat ik dan al wat meer achtergrondkennis van de AVR heb opgebouwd.

Ik heb deze ic'tjes in combinatie met een microcontroller al een aantal keren naar alle tevredenheid gebruikt. De maximale snelheid is 1Mhz dus met 1uS zit je goed (ik heb tot nu toe alleen maar 4Mhz, PIC's gebruikt zodat m'n commando's op 1Mhz gaan en het vanzelf traag genoeg is).

Wat ik altijd doe is het volgende, ik werk in assembly dus een aantal dingen zal inteligenter kunnen in bascom:

Om te beginnen is data, clock en strobe laag.
De Data pin wordt hoog gemaakt, vervolgens wordt getest of de data soms laag moet zijn. Als hij laag is slaat hij de volgende stap, het hoogmaken van de data-pin over.

Vervolgens wordt de data pin even hoog gemaakt en meteen weer laag. Dat doe je dan dus 16 keer. Vervolgens maak je de strobe even hoog en meteen weer laag (als je hem hoog houdt dan zie je de verschuivingen, dat is vervelend als je alleen stappen wilt).

Het voordeel van de uitgangen meteen achter elkaar hoog en weer laag maken is dat het niet uitmaakt op welke flank het gebeurt (clock gaat bijvoorbeeld op de stijgende flank), omdat je allebei de flanken hebt.

Ik heb geen idee waar er standaard me ewordt begonnen, ik maak ze eerst altijd leeg. Maar ik heb nooit gemerkt dat er uitgangen standaard hoog waren.

Het is inderdaad belangrijk dat je ontkoppelcondensatoren van 100nF in je voedingslijnen zet. Dat ben ik vroeger heel vaak vergeten en het resultaat is dat je hele vreemde effecten krijgt. Verder moet je natuurlijk geen ingangen zwevend laten (de enable out pin bijvoorbeeld die moet altijd hoog zijn).

Een deel van de code (AVR GCC).
De originele code was geschikt voor een 16-tal 4094 in rij. (slechts getest met drie)

bit 0 van poort B zit aan de strobe van de 4094
bit 1 aan de data
bit 2 aan de clock

uint_8t is een unsigned 8 bit integer oftwel een byte

Het idee erachter is om een byte van hoog naar laag bit voor bit te doorlopen. Telkens wordt er 1 bit op de uitgang van de AVR gezet, daarna word de clock hoog en weer laag gemaakt en vervolgens komt het volgende bit. Het bit blijft staan tijdens de wisseling van de clock. Na 8 bits (1 byte) wordt de strobe hoog en weer laag gemaakt waardoor de hele byte nu op de uitgang van de 4094 staat.


void pulse(uint8_t bit)
{
  PORTB = bit; /* bit op poort, clock laag */
  delay(2);
  PORTB = bit | 4; /* bit op poort, clock hoog */
  delay(2);
  PORTB = bit; /* bit op poort, clock laag */
  delay(1);
}

void output(uint8_t data)
{
  uint_8t i;

  for(i = 0; i < 8; i++)
  {
    if(data & 128) /* controleer of het hoogste bit 1 is */
    {
      pulse(0); /* puls met data laag */
    }
    else
    {
      pulse(2); /* puls met data hoog */
    }

    /* schuif de bits in data 1 positie naar links */
    data <<= 1;
  }
  
  PORTB = 1; /* strobe hoog */
  delay(2);
  PORTB = 0; /* strobe laag */
}

Een en ander is zelfs nog iets te vereenvoudigen.

[Bericht gewijzigd door Marcel op ]

Op 13 april 2005 22:23:29 schreef Marcel:
Een deel van de code (AVR GCC).
De originele code was geschikt voor een 16-tal 4094 in rij. (slechts getest met drie)
<knip>

Inmiddels ben ik erachter dat er hardwarematig iets niet klopt, want ik heb "voor de lol" (voorzover je daar nog van kan spreken) de DATA- en de CLOCK-pin losgekoppeld van de ATMega8 (alleen STROBE nog gekoppeld), en tot mijn verbazing zag ik dat alles een stapje opschoof, na het uitvoeren van de betreffende broncode..
Vervolgens nogmaals uitgevoerd, terwijl de DATA-pin rechtstreeks aan de +5V hing => LED1 ging aan. (en bij 0V, LED1 uit).

Kortom, volgens mij is het dan echt een hardwareprobleem en waarschijnlijk bij de AVR. Niet voldoende vermogen voor wat betreft de DATA en CLOCK-aansturing (STROBE reageert ie wel op, dus dat zal wel snor zitten).
Tsja,. of de 4094'ers zijn "kaput", omdat ie meer aansturingsvermogen nodig heeft, betreffende de DATA- en CLOCK-pinnen.

Binnenkort kom ik terug met de resultaten.

Op 12 april 2005 13:22:56 schreef Fuzzbass:
ontkoppelcondensatortjes gebruikt? Rule number 1 bij digitale (vooral CMOS) ic's

Op 14 april 2005 11:21:54 schreef Fuzzbass:
[...]

Ja, ik heb op 2 IC's een SMD 100 nF gesoldeerd. Hielp niets. Wat mij wel opviel, is dat het lijkt of de CLOCK defect is. Ik heb namelijk de pinnen op de ATMEL nagemeten, en die werken gewoon goed. Dan lijkt het alsof het toch aan het ontwerp of aan de IC's liggen. Ik heb het volgende experiment uitgevoerd.

EXPERIMENT :
DATA en CLOCK losgehaald. DATA aan een 5V bron gezet en af en aan de 0V/GND gezet : ik had een looplicht !
Hetzelfde met 2 (andere) 4094 uitgevoerd, zonder ontkoppelcondensatoren. Resultaat : hetzelfde.
Het lijkt mij zeer onwaarschijnlijk, maar ik begin nu te vermoeden dat al m'n 4094's kapot zijn, of dat mijn ontwerp niet klopt. (Al had ik het wel uit een Elektuurtje)

MARCEL :
Kun je me eens je schema geven van hoe je jouw 16 x 4094's in cascade hebt aangesloten ? Als het principe overeenkomt, dan moeten de IC's wel defect zijn :(

Ik heb alle aanstuuruitgangen direct aan een 10K R met daarachter een LED staan, vervolgens met GND verbonden.
Bijv. Pin 4 (4094) - R(10K) - LED - GND
Pin 10 doorverbonden met de pin 2 van de volgende IC. De pin 10 van de laatste IC naar GND (in andere testopstelling gewoon los).
CLOCK en STROBE gezamenlijk aangesloten op alle IC's.
Pin 15 en 16 aan de +5V en pin 8 op GND. Verder niets aangesloten. Pin 9 is dus de enige pin die niet verbonden (NC) is.

BTW : ik gebruik HEF4094BP van Philips.

Probeer het anders eerst even zonder de cascade, gewoon alleen het eerste IC.

Wat heb je tijdens je laatste experiment trouwens met de STROBE gedaan?