oxurane
Van elk bezoek aan CO leer ik weer meer...
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 :
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 :
- Strobe-signaal (P/S)
Zet pin 9 hoog en dan weer laag - Data-signaal (Q8)
Pin 3 kijken of het hoog / laag is, een logische 1 of 0 - Clock-signaal (CLK)
Zet pin 10 hoog en dan weer laag : Doorschuiven van het register. - 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 ?
krisje8
"Keyboard not connected, press F1 to continue." - MS-DOS ... Check www.krisje8.nl !
oxurane
Van elk bezoek aan CO leer ik weer meer...
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 ]
the-paradox
Duco ergo sum.
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?
oxurane
Van elk bezoek aan CO leer ik weer meer...
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 :
- 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) - 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 ?
oxurane
Van elk bezoek aan CO leer ik weer meer...
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 ]
oxurane
Van elk bezoek aan CO leer ik weer meer...
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 :
- O6/O7 los
Geen effect - O6/O7 los + P5-P8 aan GND
Geen effect - 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.
rimco
Digitaal - Mijn ding :P
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
the-paradox
Duco ergo sum.
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.
oxurane
Van elk bezoek aan CO leer ik weer meer...
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 ]
the-paradox
Duco ergo sum.
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?
oxurane
Van elk bezoek aan CO leer ik weer meer...
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..
the-paradox
Duco ergo sum.
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 ]
oxurane
Van elk bezoek aan CO leer ik weer meer...
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...
Rik_J
Problems do not concern me. I want solutions, not excuses!
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
oxurane
Van elk bezoek aan CO leer ik weer meer...
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...
rimco
Digitaal - Mijn ding :P
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?
Rik_J
Problems do not concern me. I want solutions, not excuses!
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.
oxurane
Van elk bezoek aan CO leer ik weer meer...
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)
oxurane
Van elk bezoek aan CO leer ik weer meer...
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.
rimco
Digitaal - Mijn ding :P
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
oxurane
Van elk bezoek aan CO leer ik weer meer...
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.