Beste,

Aan alle mensen op dit forum welke ervaring hebben met 8051
assembler,

Mijn vraag:

Ik wens een key-pad te maken met een I2C component nl.PCF8574 voor het uitlezen van een 4x4 key matrix
De code die ik wens tegebruiken is a51 assembler

hardware matig heb ik volgende outputs van de PCF8574 voorzien voor volgende functies
P0 - Column 1
P1 - Column 2
P2 - Column 3
P3 - Column 4
P4 - Row 1
P5 - Row 2
P6 - Row 3
P7 - Row 4

INT output wordt aan de INT0 van de µ-controller gelegt
om een interupt tegeven en de key-matrix uit telezen !

Mijn vraag is nu heeft iemand een bestaande werkende code
in A51 (assembler) voor 8051 µ controllers

mvg

der zijn paar problemen met die opzet.
- je gaat continue moeten scannen. dit vreet cpu tijd
- als je 8051 geen hardware i2c heeft zal je moeten bitbangen : nog meer cpu tijd , als ie wel i2c heeft heb je weer ander code nodig.

key deboundce ... repeat ke ...

he is simpeler de int0 te gebruiken op een andere manier.

neem een domme 2 bit teller met daaracchter een 74138.
daar stuur je drukknoppen mee. de teller klok je vanuit de ale pin. wanneer er een knop ingedrukt wordt genereer je een interrupt. de prcessor leest dan de knop matrix uit via i2c. bijgevolg geen scaning code nodig en bijna geen processor tijd

Ik denk dat het hier toch ook wel gaat zonder cpu tijd te vreten?

Als je alle rows via die pcf aan de +5V hangt, en als de columns naar de ground getrokken worden, kan je wachten tot er zo`n interrupt is. Ik denk dat je dan met de meeste procs snel genoeg zit als je dan nog even gaat scannen welke knop ingedrukt is. ;)

daar zit iets in ..
probleemis deat de pcf niet naar 5 volt kan gaan ( tzijn open collectors )

maar das op te lossen met pull-ups. dus inderdaad colums hard grond. van zodra er een state change is krijg je een interrupt. dan alle columns hoog maken en beginnen scannen.

hmmm . interessant idee.

Op 29 augustus 2005 16:33:31 schreef free_electron:
daar zit iets in ..
probleemis deat de pcf niet naar 5 volt kan gaan ( tzijn open collectors )

maar das op te lossen met pull-ups. dus inderdaad colums hard grond. van zodra er een state change is krijg je een interrupt. dan alle columns hoog maken en beginnen scannen.

hmmm . interessant idee.

Pullups heb je zoiezo nodig wil je het keypaad kunnen scannen ;)

Jep, heb ook eens een pcf8574 gebruikt om drukknoppen mee binnen te halen (4) en uitgangen (4) aan te sturen. Is wel een handig ic'tje :-)

Op 29 augustus 2005 16:33:31 schreef free_electron:
daar zit iets in ..
probleemis deat de pcf niet naar 5 volt kan gaan ( tzijn open collectors )

niewaar, het zijn open collectors *met build-in 'weak pull-ups'*.

Op 29 augustus 2005 08:33:51 schreef elmowww:
Ik denk dat het hier toch ook wel gaat zonder cpu tijd te vreten?

Als je alle rows via die pcf aan de +5V hangt, en als de columns naar de ground getrokken worden, kan je wachten tot er zo`n interrupt is. Ik denk dat je dan met de meeste procs snel genoeg zit als je dan nog even gaat scannen welke knop ingedrukt is. ;)

Ik denk niet dat door alle col.aan de grond teleggen men de juiste switch kan detecteren welke ingedrukt is,
omdat alle switches (4) op de zelfde row dan aan de grond staat !

Ik denk dat de col. afwisseld aan de grond gelegt moeten
worden om een juiste detectie van een switch te detecteren

vb: P0 = 0 ;P1,P2 en P3 = 1
vervolgens
P1 = 0 ;P0,P2 en P3 = 1
vervolgens
P2 = 0 ;P0,P1 en P3 = 1
en tenslote
P3 = 0 ;P0,P1 en P2 = 1

Wanneer er bij een bepaalde bit configuratie een switch ingedrukt dan kan men de juiste switch detecteren

Maar hoe kan ik dit programeren ?

Op 29 augustus 2005 21:37:06 schreef Marina:
[...]

Ik denk niet dat door alle col.aan de grond teleggen men de juiste switch kan detecteren welke ingedrukt is,
omdat alle switches (4) op de zelfde row dan aan de grond staat !

Ik denk dat de col. afwisseld aan de grond gelegt moeten
worden om een juiste detectie van een switch te detecteren

vb: P0 = 0 ;P1,P2 en P3 = 1
vervolgens
P1 = 0 ;P0,P2 en P3 = 1
vervolgens
P2 = 0 ;P0,P1 en P3 = 1
en tenslote
P3 = 0 ;P0,P1 en P2 = 1

Wanneer er bij een bepaalde bit configuratie een switch ingedrukt dan kan men de juiste switch detecteren

Maar hoe kan ik dit programeren ?

Mjah, dat gaat dus mooi niet zonder veel CPU gebruik: je moet die PCF steeds commando`s geven wat ik bedoel, je laat de PCF alle rows aan de gnd hangen, en de columns houd je met een pullup hoog.

Mocht er een knop ingedrukt worden, word een van de column pinnen laag gemaakt, waardoor je een interrupt veroorzaakt.
Zo weet je dus dat er een knop ingedrukt wordt.

In die interrupt routine ga je dan even snel scannen, dus de rows 1 voor 1 aan de ground. Dan weet je dus welke toets ingedrukt is. Heb je alleen CPU tijd nodig op het moment er echt iets moet gebeuren.

Een soort lookup of lookdown table maken denk ik?

Op 29 augustus 2005 23:38:55 schreef elmowww:
[...]

Mjah, dat gaat dus mooi niet zonder veel CPU gebruik: je moet die PCF steeds commando`s geven wat ik bedoel, je laat de PCF alle rows aan de gnd hangen, en de columns houd je met een pullup hoog.

Mocht er een knop ingedrukt worden, word een van de column pinnen laag gemaakt, waardoor je een interrupt veroorzaakt.
Zo weet je dus dat er een knop ingedrukt wordt.

In die interrupt routine ga je dan even snel scannen, dus de rows 1 voor 1 aan de ground. Dan weet je dus welke toets ingedrukt is. Heb je alleen CPU tijd nodig op het moment er echt iets moet gebeuren.

Voor wat betreft de scan routine voor de juiste switch
welke in gedrukt is te achterhalen
denk ik dat :
S = start
A = adres vb pcf8574 is dit 40h
D = data vb 11110000 alle rows aan grond
R/W = 1 write 0 = read
A = ack
initialisatie van de PCF8574 voor keyboard 4x4
alle rows aan grond
(S + Address + W + A) (data + A)

indien er er een switch bedient is zal er een INT optreden

mijn vraag is nu

Moet ik afwisseld schrijven en lezen naar en van PCF8574

scan routine
1 voor 1 rows aan grond leggen,schrijven naar PCF8574
vb row1 = 0 row2 = 1 row3 = 1 row4 = 1
daar na lezen van collums
vervolgens row1 = 1 row2 = 0 row3 = 1 row 4 = 1
daarna terug lezen van de collums
tot zolang de switch gevonden is

vraag:
Bij erhaaldelijk schrijven en lezen naar en van PCF8574 moet dit altijd voor afgegaan worden met startbit address
en mode R/W vooralleer men data moet verzenden of lezen
beschreven zoals hier boven

mvg

Op 29 augustus 2005 19:55:49 schreef Wouter van Ooijen:
[...]

niewaar, het zijn open collectors *met build-in 'weak pull-ups'*.

ja 'weak', ze zijn zelfs zo weak dat je er geneens een uln2803 mee kunt sturen. en das een dalington !.
paar microampere maximum

die pullup in de pcf8574 is eigenlijk een lek pad wat binnenkomt via de bulk. je moet er eens eentje hard laten schakelen ( weerstandje van 100 ohm bijvoorbeeld.) en een stroompje trekken uit de andere ( weerstandje van 10k ) en de spanning bkijken. je zult de doorkoppeling direct zien

Op 31 augustus 2005 17:21:50 schreef free_electron:
ja 'weak', ze zijn zelfs zo weak dat je er geneens een uln2803 mee kunt sturen

Als ik even de datasheet bekijk komen ze overeen met een weerstand van max ongeveer 200k, dus vergelijkbaar met de pull-ups in PICs. Prima om een matrix van schalekaars mee uit te lezen.

Een 2003, 2803 etc. zijn inderdaad darlingtons maar hebben aan de inputs 'lek' weerstanden, juist om te voorkomen dat een heel kleine stroom de torren al opensturen. Als je een losse darlington met een hogere 'lek' weerstand neemt, bv 1M, dan kan je die prima open sturen.

Op 29 augustus 2005 23:38:55 schreef elmowww:
[...]

Mjah, dat gaat dus mooi niet zonder veel CPU gebruik: je moet die PCF steeds commando`s geven wat ik bedoel, je laat de PCF alle rows aan de gnd hangen, en de columns houd je met een pullup hoog.

Mocht er een knop ingedrukt worden, word een van de column pinnen laag gemaakt, waardoor je een interrupt veroorzaakt.
Zo weet je dus dat er een knop ingedrukt wordt.

In die interrupt routine ga je dan even snel scannen, dus de rows 1 voor 1 aan de ground. Dan weet je dus welke
toets ingedrukt is. Heb je alleen CPU tijd nodig op het moment er echt iets moet gebeuren.

mijn vraag is nu

Moet ik afwisseld schrijven en lezen naar en van PCF8574

mvg

Op 29 augustus 2005 23:38:55 schreef elmowww:
[...]

Mjah, dat gaat dus mooi niet zonder veel CPU gebruik: je moet die PCF steeds commando`s geven wat ik bedoel, je laat de PCF alle rows aan de gnd hangen, en de columns houd je met een pullup hoog.

Mocht er een knop ingedrukt worden, word een van de column pinnen laag gemaakt, waardoor je een interrupt veroorzaakt.
Zo weet je dus dat er een knop ingedrukt wordt.

In die interrupt routine ga je dan even snel scannen, dus de rows 1 voor 1 aan de ground. Dan weet je dus welke toets ingedrukt is. Heb je alleen CPU tijd nodig op het moment er echt iets moet gebeuren.

Al vast bedankt voor de Tip,

Maar hoe ziet de scan routine er uit in assembler voor 8051 a51 ?
mvg