Hoi,

Ik wil graag een aantal druktoetsen inlezen / inscannen. Omdat ik te weinig aansluitpinnen heb op de Atmel, heb ik besloten om een 4021 in te zetten. (CMOS 8-stage Static Shift registers).

Echter, ik krijg het niet voor elkaar om iets zinnigs uit te lezen. Of ik een toets indruk of niet, het maakt niet uit, de uitkomst blijft hetzelfde.

Het schema is als volgt :

http://members.home.nl/b.b.boelens/foto/4021.gif

In Bascom heb ik het volgende geprogrammeerd :


Sub Chk_druktoetsen()               'UITLEZEN CMOS 4021
 Dim Pinset as Integer
 Dim Button_pushed as Byte

    Button_pushed = 0               'Waarde van ingedrukte
                                    'toetsen bijhouden.
    'UITLEG : Toets  Waarde
    '           1      1
    '           2      2
    '           3      4
    '           4      8

    Ddrd.2 = 0                      'Zet Pin D2 op
                                    'Atmel als input.
    Pinset = 1                      'Binaire teller
                                    'naar Byte.

   '*************************************
   'Alle input naar het register schuiven
   '*************************************
    Set portd.3                     'Strobe hoog => +5V
    Reset portd.3                   'Strobe laag => 0V

   '**************************
   'Alles in register uitlezen
   '**************************
    Do
      If pinD.2 = 0 Then           '0V = knop ingedrukt
         Button_pushed = Button_pushed + Pinset
      End If
      Set portd.4                   'Clock hoog => +5V
      Pinset = 2 * Pinset           'Teller bijwerken
      Reset portd.4                 'Clock laag => 0V
    Loop Until Pinset = 256         '4 toetsen ingescand 
                                    'Eigenlijk 8 INPUTS
                                   'gemeten
End Sub

Wat ik dus eigenlijk op de 4021 doe is :

  1. Strobe-signaal (P/S)
    Zet pin 9 hoog en dan weer laag
  2. Data-signaal (Q8)
    Pin 3 kijken of het hoog / laag is, een logische 1 of 0
  3. Clock-signaal (CLK)
    Zet pin 10 hoog en dan weer laag : Doorschuiven van het register.
  4. Stap 2 en 3 herhalen totdat alle 8 pins uitgelezen zijn.

OPM : P5 t/m P8 zijn zwevend. Maar dit zou geen effect moeten hebben op het uitlezen, indien ik Pinset tot een waarde van 16 laat oplopen. (Loop Until Pinset = 16) Ik lees dan toch alleen P1 t/m P4 dan uit ?

Echter, in de praktijk lijkt alles niet zo te verlopen als gedacht. Tsja, theorie en praktijk verschillen soms.
De 4021 geeft nu als resultaat dat alle toetsen zijn ingedrukt (Button_pushed = 255), ongeacht of ik een toets wel / niet indruk.

Kortom, ik zie iets over het hoofd. Maar wat ? Wie kan me vertellen wat de oorzaak is ? Heb ik wellicht een fout in het schema (aansluiting van de knoppen), of stuur ik de 4021 verkeerd aan ?

Kan je geen gebruik maken van RCIN??

Op 24 juni 2006 13:58:16 schreef krisje8:
Kan je geen gebruik maken van RCIN??

Uh ? Wat is dat ? Kun je het eens uitleggen / toelichten ?

P.S. Ik heb maar 3 aansluitpinnen en heb daarom voor de 4021 gekozen

[Bericht gewijzigd door oxurane op ]

O6 en O7 zijn uitgangen, die mag je niet GND maken.
Wat betreft aansturen van PL en CLK moet je ook op de timing letten. Als PL te kort (<1u sec ofzo) duurt dan lees het schuifregister ook niets in.
Wanneer en hoevaak roep je die subroutine aan? Dit moet nml wel continue gebeuren.
Zo'n shifter, werkt dat niet net andersom, dat je eerst serieel P8 uitleest ipv P1?

Op 24 juni 2006 15:05:53 schreef the-paradox:
O6 en O7 zijn uitgangen, die mag je niet GND maken.
Wat betreft aansturen van PL en CLK moet je ook op de timing letten. Als PL te kort (<1u sec ofzo) duurt dan lees het schuifregister ook niets in.
Wanneer en hoevaak roep je die subroutine aan? Dit moet nml wel continue gebeuren.
Zo'n shifter, werkt dat niet net andersom, dat je eerst serieel P8 uitleest ipv P1?

Uitlezen en aansturen gebeurt op 1 MHz (interne klok van ATMega8)
Ik stuur met dezelfde uC ook een 4094 aan, overigens succesvol en op dezelfde snelheid...

Blijven nog 2 dingen open :

  1. O6 en O7 aan de GND.
    Ik had een oud schema, waar ik het zo aangesloten zag staan. Maar, weet je het zeker ? Ik vraag dit, omdat ik de SMD-componenten inmiddels al op een printje heb gesoldeerd. Ik voel er weinig voor om bij wijze van experiment de pinnen los te knippen..... (dus als je het zeker weet, dan pak ik de kniptang)
  2. Uitlezen van LSB naar MSB of omgekeerd.
    Hmm,. als dat zo zou zijn, zou het dus opgelost kunnen worden door P5 t/m P8 dan aan GND te verbinden, toch ?

Kortom,. als ik je reactie lees, zou er sprake zijn van meerdere ontwerpfoutjes. De een waarschijnlijk wat eenvoudiger op te lossen dan de andere.. Klopt dat ?

Op 24 juni 2006 15:05:53 schreef the-paradox:
O6 en O7 zijn uitgangen, die mag je niet GND maken.
Wat betreft aansturen van PL en CLK moet je ook op de timing letten. Als PL te kort (<1u sec ofzo) duurt dan lees het schuifregister ook niets in.
Wanneer en hoevaak roep je die subroutine aan? Dit moet nml wel continue gebeuren.

Net even de soldeerbout gepakt en de pinnen van O6 en O7 losgesoldeerd en de pinnen voorzichtig naar boven gebogen. Geen enkel effect.

Zo'n shifter, werkt dat niet net andersom, dat je eerst serieel P8 uitleest ipv P1?

In hoeverre is deze tip nu betrouwbaar ? (Begrijp me a.u.b. niet verkeerd, maar ik twijfel nu aan je opmerking, omdat de andere geen resultaat opleverde. Dus,. ik heb niets kwaads in de zin en begrijp dat je het goed bedoeld)

[Bericht gewijzigd door oxurane op ]

Op 24 juni 2006 15:57:17 schreef oxurane:
[...]
In hoeverre is deze tip nu betrouwbaar ? (Begrijp me a.u.b. niet verkeerd, maar ik twijfel nu aan je opmerking, omdat de andere geen resultaat opleverde. Dus,. ik heb niets kwaads in de zin en begrijp dat je het goed bedoeld)

Ik heb de de volgende opstellingen geprobeerd :

  1. O6/O7 los
    Geen effect
  2. O6/O7 los + P5-P8 aan GND
    Geen effect
  3. O6/O7 aan GND + P5-P8 aan GND
    Geen effect

Ik denk dan dat ik het niet goed aanstuur, of dat mijn 4021 defect is. Tenzij ik iets cruciaals over het hoofd zie.

voor zoiets kan je toch net zo simpel een 4017 gebruiken?
gebruik ik ook voor het inlezen van een matrix toetsenbordje.

alleen clock en reset aan je uC verbinden, en het werkt simpel

Op 24 juni 2006 15:37:35 schreef oxurane:
[...]
1: Uitlezen van LSB naar MSB of omgekeerd.
Hmm,. als dat zo zou zijn, zou het dus opgelost kunnen worden door P5 t/m P8 dan aan GND te verbinden, toch ?
2: Kortom,. als ik je reactie lees, zou er sprake zijn van meerdere ontwerpfoutjes. De een waarschijnlijk wat eenvoudiger op te lossen dan de andere.. Klopt dat ?

Ik heb je wat ideeen aangedragen om achter de oorzaak te komen.
1: Nee, het is een kwestie van in de software beginnen met een teller op 8 die aftelt naar 1. Je kunt dezelfde rekenmethode blijven gebruiken.

2: En nee, de tips zijn op zich niet onbetrouwbaar (hoop ik ;) ). Je kunt de datasheets erbij nemen en dan zie je dat O6 en O7 uitgangen zijn die serieel geklokt worden. Doordat ze een poosje kortgesloten zijn geweest, vermoed ik dat je ic opgeblazen is en daarom nu niets meer gebeurt.

Op 24 juni 2006 17:10:10 schreef the-paradox:
[...]
2: En nee, de tips zijn op zich niet onbetrouwbaar (hoop ik ;) ). Je kunt de datasheets erbij nemen en dan zie je dat O6 en O7 uitgangen zijn die serieel geklokt worden. Doordat ze een poosje kortgesloten zijn geweest, vermoed ik dat je ic opgeblazen is en daarom nu niets meer gebeurt.

Ehm,. inmiddels een nieuwe 4021 erop gezet, waarbij pinnen 2 en 12 (O6 en O7) naar boven zijn gebogen. Verder zijn de pinnen 1, 13, 14 en 15 direct aan GND gesoldeerd. Echter, nog steeds geen resultaat...

Verder nog eens gekeken of "if Pind.2 = 0" en "if Pind.2 = 1" nog een effect heeft. Het enige verschil is dat ik met de ene mehtode de waarde 0 en met de andere de waarde 255 krijg.

Hmmmz...

[Bericht gewijzigd door oxurane op ]

Als je een schakelaar bediend en dan direct op de 4021 de signalen PL en CLK simuleerd, werkt het dan nog steeds niet? Krijg je na zelf 8x een CLK gegeven te hebben nog steeds geen data eruit?

Op 24 juni 2006 19:54:44 schreef the-paradox:
Als je een schakelaar bediend en dan direct op de 4021 de signalen PL en CLK simuleerd, werkt het dan nog steeds niet? Krijg je na zelf 8x een CLK gegeven te hebben nog steeds geen data eruit?

Nog eens met de scope alles na gemeten.
Ik heb de broncode wat aangepast om alles zichbaar te krijgen.

Strobe- en Clock-signalen komen heel netjes door via de Atmel. Voor de zekerheid ook de spanningsval bekeken bij het indrukken van de toetsen, en dat schijnt dus ook te kloppen. Niet ingedrukt meet ik 5V, ingedrukt 0V op de pinnen van de 4021.

Alleen, er komt geen enkel signaal uit O8. Ik kan me niet voorstellen dat alles nog een keer kapot is gegaan.
Ik begin me nu af te vragen of ik de signalen er wel op de juiste manier probeer uit te klokken..

Met de scoop kun je direct zien of je timing klopt met de datasheet. Wat is de breedte van de PL (Strobe) puls?
EDIT
De datasheet: http://www.standardics.philips.com/products/hef/pdf/hef4021b.pdf

[Bericht gewijzigd door the-paradox op ]

Op 24 juni 2006 20:22:56 schreef the-paradox:
Met de scoop kun je direct zien of je timing klopt met de datasheet. Wat is de breedte van de PL (Strobe) puls?

Strobe en clock stuur ik nu met 1 seconde aan. Dat moet toch ruim voldoende zijn. Ik had het ook al met 1 ms gedaan en met de gewone kloksnelheid van de Atmel (1 MHz). Allemaal hetzelfde resultaat.
Maar,. ik heb nog een verplichting vanavond (verjaardag). Morgen ben ik er weer. Ik hoop dat we het kunnen uitdokteren, wat ik vind dit zo'n vreemd probleem...

3 datalijnen gebruiken voor 4 schakelaars is niet erg efficient. Waarom geen 74x148 8 naar 3 priority encoder? Doet alles wat je wilt maar dan gemakkelijker!

Gtz,
Rik

Op 25 juni 2006 10:58:46 schreef Rik_J:
3 datalijnen gebruiken voor 4 schakelaars is niet erg efficient.

Ja ik weet het,. maar ik heb alle overige pinnen al bezet, dus ik heb maar 3 pinnen over. Er zijn namelijk nog meer dingen aangesloten op de Atmel.
Kortom,. ik ben gedwongen om het op een bepaalde manier op te lossen. Een ander voordeel is dat ik het eventueel later altijd nog kan gaan uitbreiden met nog meer 4021'ers, al heb ik nu "de luxe" dat ik 4 input-pinnen over heb.
Een andere oplossing die zeker werkt is een ATMega16 in TQFP, aangezien die meer aansluitpinnen heeft. Maar het uitbreiden met een 4021 was het goedkoopste alternatief.
Verder heb ik voor de 4021 gekozen, omdat er ook op het internet de nodige schema's rondslingeren. Ik had plm. 2 jaar geleden iets van Elektuur opgeduikeld met 4094 en 4021. Helaas kon ik het artikel niet zo 1, 2, 3 meer terugvinden.

Zelf ook eens ooit een printje ontworpen met een AT90S2313 en 4021 en 4094 (ik meen 1.5 jaar geleden). Schema's en broncode ben ik kwijt. Gezien mijn beperkte kennis van de electronica, zaten daar een paar kleine ontwerpfoutjes in

  • 4094
    Ik had de OE-pin niet aangesloten. Bij het inklokken van de data, zag je de data a.h.w. gewoon direct over de aansluitpinnen gaan : een soort looplicht. Op zich heel erg mooi wanneer je LED's wil aansturen en zeker handig wanneer je wilt controleren of het inklokken goed verloopt op lage snelheid. Maar voor het aansturen van apparatuur niet erg wenselijk.
  • 4021
    Het werkte wel goed, maar na verloop van tijd ging de 4021 kapot. Ik vermoed dat het lag aan het ontbreken van weerstandjes op de aansluitpinnen. Met het huidige ontwerp voor de druktoetsen meende ik dat ik het probleem getackeld had.

Maar goed,. het vreemde is dat ik het uitlezen van de 4021 nu niet meer voor elkaar krijg. En waar ik mij nu wel voor mijn kop kan slaan : ik ben de broncode en het schema van de 90S2313 kwijt. Ja, gelukkig kon ik me de de kleine ontwerpfoutjes nog wel herinneren...

met een 4017 heb je 3 lijnen nodig,2x uit, 1x in. en kan je al meteen 10 toetsen uitlezen.
en zo simpel als wat. je zou dat toch ook kunnen overwegen?

Misschien dat het wel kan met een 4017 maar ik zie niet zo gauw hoe. Hoe wil jij dat dan doen? De 4017 heeft toch enkel uitgangen? Daar kan je toch niets mee inlezen?

Ja, dat is een goed idee met zo'n 4017, die ga ik ook gebruiken.
Hoe het werkt??
Nou, je klokt met 1 uitgang van je controller de clk van de 4017, de uitgangen van de 4017 sluit je aan op al je toetsen, de andere kant van de toetsen knoop je allemaal aan elkaar en gaan naar de ingangspoort van je controller.
Dus je reset de 4017, dat is de 3e pen die je nodig hebt, en je clockt de 4017 en kijkt op de ingang of toets 1 gedrukt is, clockt nog eens en kijkt naar toets 2 enz.

Okay, da's best simpel.

Op 25 juni 2006 12:54:07 schreef oxurane:
[...]
Maar goed,. het vreemde is dat ik het uitlezen van de 4021 nu niet meer voor elkaar krijg. En waar ik mij nu wel voor mijn kop kan slaan : ik ben de broncode en het schema van de 90S2313 kwijt. Ja, gelukkig kon ik me de de kleine ontwerpfoutjes nog wel herinneren...

Nou 't werkt. Pas nadat ik de poorten binnen de Sub had ingesteld (DdrD.3 = 1 etc). Ik had het globaal al gespecificeerd. Maar ik vind het wel vreemd dat ik de signalen wel kone meten. Of ik mat lage spanningen (Ik had de scoop op automatisch gezet)

Ik zal ongetwijfeld nog iets over het hoofd gezien hebben, maar weet niet wat. Laat in de middag werkte het opeens. De output was wel vreemd, maar toen bleek dat the-paradox gelijk had. De data wordt omgekeerd uitgelezen.

Verder misbruik ik het huidige schema (ook) om tegelijk een 4021 uit te lezen en een 4094 aan te sturen. Een aangepaste schema leek me overbodig, want het origenele schema, samen met de hieronder vermelde broncode spreekt boekdelen. Of het een nette manier van aansluiten is, doet niet ter zake : het werkt.

Voor de geinteresseerden :


Sub In_Out_rw()              'UITLEZEN 4021 / AANSTUREN 4094
 Dim Keys_Pushed As Integer  'Welke toetsen ingedrukt
 Dim Key_Counter as integer  'Teller voor bijhouden toetsen 
 Dim I as byte               'Tellertje 
 
   'Poorten instellen : 0=INPUT / 1=OUTPUT
    Ddrd.2 = 1                 'DATA IN/OUT
    Ddrd.3 = 1                 'Strobe
    Ddrd.4 = 1                 'Clock
    Ddrd.5 = 1                 'EO

   'Initialiseren
    Keys_Pushed = 0
    Key_Counter = 1

  'START INLEZEN / UITSTUREN  
    Portd.5 = 0                'OE = > Voorkom looplicht-effect op 4094

   'Strobe-signaal 4021
    portd.3 = 1                'Strobe HIGH
    Portd.3 = 0                'Strobe LOW

    For I = 0 To 7
        Ddrd.2 = 0             'Pin geschikt maken voor Data-inlezen 4021
       '4021 toetsen uitlezen
        If I > 3 Then          'Alleen de laatste 4 pinnen zijn aangesloten
           If Pind.2 = 0 Then  'Naar GND ? => Toets is ingedrukt
              Keys_Pushed = Keys_Pushed + Key_Counter
           End If
           Key_Counter = 2 * Key_Counter
        End If
       '4094 instellen
        Ddrd.2 = 1             'Pin geschikt maken voor Data-uitsturen 4094

        Portd.2 = 1            'Schakel pin I IN op 4094
       'OPM : Hier kun je met een aanpassing de
       '      exacte pinnen aansturen op de 4094
       '      Ik heb alles nu HIGH gezet => AAN
  
        Portd.4 = 1            'Clock HIGH
        Portd.4 = 0            'Clock LOW
    Next
    
   'Strobe-signaal 4094
    portd.3 = 1                'Strobe HIGH
    Portd.3 = 0                'Strobe LOW
    
    Portd.5 = 1                'OE = > Alles nu zichtaar op pinnen van 4094
  
End Sub

Kortom,. ik kan nu met 4 pinnen op de Atmel een 4021 en een 4094 uitlezen en aansturen. Ik hoop dat anderen ook wat aan de broncode hebben. (zocht je nog naar aansturing van een 4021 / 4094, of heb je ook een pinnen-tekort...)

Overigens : O6 en O7 zijn NC (not connected)

Op 25 juni 2006 15:32:57 schreef bitbanger:
Nou, je klokt met 1 uitgang van je controller de clk van de 4017, de uitgangen van de 4017 sluit je aan op al je toetsen, de andere kant van de toetsen knoop je allemaal aan elkaar en gaan naar de ingangspoort van je controller.
Dus je reset de 4017, dat is de 3e pen die je nodig hebt, en je clockt de 4017 en kijkt op de ingang of toets 1 gedrukt is, clockt nog eens en kijkt naar toets 2 enz.

Da's een goed idee ! Zonder uitleg dacht ik eerst : Ahum, ja ja, maar de 4017 is juist voor het uitsturen.
Maar ik had nooit bij een dergelijke oplossing stilgestaan. Ik vind het heel elegant en slim gevonden.

srry dat ik er nu pas weer ben:P maar zo bedoelde ik het ja.
en de 4017 is kortsluitvast op zijn uitgangen dacht ik, dus zelfs bij meerdere knoppen zou het goed moeten gaan.

ik heb het zelf in een matrix van 4 bij 3 gebruikt. totaal 12 knoppen, en daarvoor 2 uitgangen en 3 ingangen gebruikt.


CheckToetsen:
toets = 255                 'geen toets

reset = 1
pause 1
reset = 0
pause 1

if rij1 then toets = 15     'hekje
if rij2 then toets = 0
if rij3 then toets = 10     'sterretje

clock = 1
pause 1
clock = 0
pause 1

if rij1 then toets = 9
if rij2 then toets = 8
if rij3 then toets = 7

clock = 1
pause 1
clock = 0
pause 1

if rij1 then toets = 6
if rij2 then toets = 5
if rij3 then toets = 4

clock = 1
pause 1
clock = 0
pause 1

if rij1 then toets = 3
if rij2 then toets = 2
if rij3 then toets = 1

clock = 1
pause 1
clock = 0
pause 1

return

Op 26 juni 2006 14:09:26 schreef rimco:
srry dat ik er nu pas weer ben:P maar zo bedoelde ik het ja.
en de 4017 is kortsluitvast op zijn uitgangen dacht ik, dus zelfs bij meerdere knoppen zou het goed moeten gaan.

ik heb het zelf in een matrix van 4 bij 3 gebruikt. totaal 12 knoppen, en daarvoor 2 uitgangen en 3 ingangen gebruikt.


<knip>

Ik zie wat overeenkomsten met BASCOM in je programmatuur, of nog beter Visual basic of Pascal en begrijp hoe het werkt. Maar, ik weet haast wel zeker dat je je broncode flink kunt inkorten vanwege een bepaalde regelmaat (tafel van 3).

Verder vind ik het heel leuk om hier wat broncode te zien, want ook een ander kan er zo wat mee.