4x4es billentyűzet kezelése I2C (PCF8574) INT alapon

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

4x4es billentyűzet kezelése I2C (PCF8574) INT alapon

Hozzászólás Szerző: ampervadasz »

Szervusztok AVR Istenei!
Több napos agyalás után hozzátok fordulok az alábbi problémámmal. Adott egy Mega32-es AVR, ráfűzve egy PCF8574-es portbővítő. A portbővítőre egy 4x4-es mátrixban felfűzött gombok vannak. (Sima nyomógombok, mátrixba kötve)

INT alapon olvasnám ki a lenyomott gomb sor és oszlopazonosítóját (legalább eddig jussak el). Az áramköröm adott, módosítani sajnos nem lehet. BASCOM 1.11.9.8-as verziót használok, egyenlőre PROTEUS-ban szimulálom az áramkör működését. SDA, SCL, INT0 lábakon rajta a felhúzó ellenállás. (4,7K)

Íme a kódom.

Kód: Egész kijelölése

$regfile = "m32def.dat"                                     'Proci típusa
$crystal = 1000000                                          'Proci órajele

'LCD konfigurálása
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Porta.7 , Db7 = Portb.0 , E = Portb.3 , Rs = Portb.4       'LCD lábkiosztás
Config Lcdmode = Port

'LCD iniciálása
Initlcd
Cls
Cursor Off , Noblink

'I2C konfigurálása
Config Scl = Portc.0
Config Sda = Portc.1
Config I2cdelay = 10
I2cinit

'INT0 port konfigurálása
Config Portd.2 = Input
Config Int0 = Falling

'Portbővítő címének megadása
Const Pcf8574r = &H41
Const Pcf8574w = &H40

'Megszakításkor ide ugrik
On Int0 Pcfint

'Megszakítások engedélyezése
Enable Interrupts
Enable Int0

'Változók beállítása
Dim Portx As Byte
Dim Porty As Byte

'Portbőcítő alapállapotba állítása
I2csend Pcf8574w , &B11110000

'Főprogram (itt csak az X, Y értékeket írja ki nekem)
Do
Locate 1 , 1 : Lcd Portx
Locate 2 , 1 : Lcd Porty
Waitms 200
Loop

End

'Megszakítás rutin
Pcfint:
I2creceive Pcf8574w , Porty                                 'Kiolvasom a portbővítőt (1111xxxx)
I2csend Pcf8574w , &B00001111                               'Átállítom a portbővítőt (felcserélem a ki és bemeneteket)
I2creceive Pcf8574w , Porty                                 'Kiolvasom a portbővítőt (xxxx1111)
I2csend Pcf8574w , &B11110000                               'Visszaállítom alapra a portbővítőt
Return                                                      'Kilép a megszakításból
Hibajelenség:
Elindítom a szimulációt, alapból kiírja a portx, porty értékeket (0,15). Ez eddig jó. Lenyomok egy gombot, de a megszakításban mintha elakadna.
Porty értékét kiolvassa rendesen, portx értéke viszont "0" marad. Biztos, hogy elakad (kifagy), mert az INT láb alacsony szinten marad (mintha megszakításból nem tudná írni a portbővítőt).

Hol hibázhattam szerintetek?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 4x4es billentyűzet kezelése I2C (PCF8574) INT alapon

Hozzászólás Szerző: Robert »

A Bascom már az 1.xxx sorozatot 3 éve elhagyta.
2.0.7.5-nél jár most...

A PCF8574 INT lába és a 5V közt felhúzóellenállás van?


I2Csend/I2Creceive helyett:

Kód: Egész kijelölése

i2cstart
i2cwbyte/i2crbyte
i2cwbyte/i2crbyte
i2cstop

I2Cread: a read címen és ne a write címen próbáld...
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: 4x4es billentyűzet kezelése I2C (PCF8574) INT alapon

Hozzászólás Szerző: ampervadasz »

Szeretem a "retró" programokat... :D

Átírtam a megszakítás rutint erre:

Kód: Egész kijelölése

Pcfint:
I2cstart
   I2cwbyte Pcf8574r
   I2crbyte Porty , Nack
I2cstop

I2cstart
   I2cwbyte Pcf8574w
   I2cwbyte 240
I2cstop

I2cstart
   I2cwbyte Pcf8574r
   I2crbyte Portx , Nack
I2cstop

I2cstart
   I2cwbyte Pcf8574w
   I2cwbyte 15
I2cstop

Return
Futtatásnál, - gombnyomás előtt - az LCD-n megjelenik a kívánt érték portx 240 (B11110000), porty 15 (B00001111). Tökéletes.
Lenyomok egy gombot, lefut a megszakítás, átíródik a portx és a porty érték is, kiíródik az LCD-re, de az INT láb megint alacsony szinten van. További megszakítás kiolvasása így nem lehetséges...

Igen, mind a három helyen megvan a 4,7K felhúzó a +5V felé.

Érzem, közel járunk a megoldáshoz!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: 4x4es billentyűzet kezelése I2C (PCF8574) INT alapon

Hozzászólás Szerző: Robert »

Tegyél egy LED-et az INT lábra. PCF8574-ről jön az INT vagy LOW-Lewel INT van gombnyomásra?
Csak hogy a AVR vagy PCFben keresd a megoldást....
Avatar
ampervadasz
Bitmanipulátor
Hozzászólások: 119
Csatlakozott: 2008. január 19. szombat, 7:00

Re: 4x4es billentyűzet kezelése I2C (PCF8574) INT alapon

Hozzászólás Szerző: ampervadasz »

Szervusz Róbert!

Vettem a fáradtságot és félretettem a szimulátort. Ebben a gyönyörű esős időben inkább forrasztópákát és ónt vettem a kezembe. Feltöltöttem élesben a Mega32-es AVR-re a programot és tökéletesen működött a vártnak megfelelően. Kezd derengeni, hogy a PROTEUS már megszívatott egy régebbi projektemnél, pont egy portbővítő megszakítás alapon való lekérdezésénél. (Akkor áttértem az INT láb lekérdezésére). Nem hiába! A szimuláció, az csak szimuláció...

Márcsak egy feladat van hátra, hogy a "portx" és "porty" értékekből egy byte alapú, könnyen kezelhető változót formáljak (port = portx OR porty) :wink:
Válasz küldése