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ólElindí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?