I/O Expander met I2C

Voorbeeld heb ik gekopieerd uit een werkend programma...
I2C is vrij simpel qua werking. Als er iets niet goed gaat is een logic analyzer (of scoop) de makkelijkste manier om te kijken wat er gebeurt.
Ik heb deze goedkope (8 euro), werkt goed: http://www.dx.com/nl/p/logic-analyzer-w-dupont-lines-and-usb-cable-for…

https://www.circuitsonline.net/forum/file/21758/forum-post

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ja, er zijn veel sukkels minder handige mensen die onnodig gecompliceerde progammas schrijven.

Reageert het ding helemaal niet? Controleer of je gewoon na de adres-fase een "ACK" krijgt. Loop alle adressen af.

Met I2C is het lastige dat er 7 adres bits zijn. Het ONDERSTE bitje geeft aan of het om een READ of een write gaat. Als je dan de bovenste 7 bits als 7-bit adres ziet dan zijn de adressen 0-127. Andere mensen vinden het prettiger om te werken met 8 bit adressen, waarbij alle even adressen bestaan en de oneven niet. (of even zijn write adressen, oneven zijn read). Nu is de range ineens 0-254.

Door deze verwarring kan jij volgens het datasheet zien dat het adres 0x40 is, maar mogelijk gebruiken je i2c routines de andere conventie. Gevolg, in je code moet je geen 0x40 maar 0x20 of 0x80 opgeven.

Ik zou voorstellen gewoon alle adressen te scannen en te kijken wanneer je een ACK krijgt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Is er veel verschil in Mikrobasic? Heb je anders geen voorbeeld?

Ik zal het eens uitmeten met een scoop, maar denk persoonlijk dat ik niets zal zien aangezien er niets gebeurt

Voorbeeldcode die ik gegeven heb werkt in ieder geval. Adres 0x40 klopt voor write. (inderdaad eigenlijk 0x20 met het read of write bit erachter...)
Hangt ook af van de implementatie in de betreffende library, meestal wordt alles 'as is' doorgestuurd. (write naar adres 0x20 wordt dus 0x40)
Is wel netter om een bus restart te gebruiken i.p.v. een stop/start wat je nu doet... (of het iets uitmaakt betwijfel ik)

pic basic code:



  I2CStart()                       'Initialize 
  I2CWrite(0x40)                   'Address
  I2CWrite(0x18+0x80)              'Reg[0x18] with auto increment
  I2CWrite(%00000000)              'Port 0 output
  I2CWrite(%00000000)              'Port 1 output
  I2CWrite(%00000000)              'Port 2 output
  I2CWrite(%00000000)              'Port 3 output
  I2CWrite(%00000000)              'Port 4 output
  I2CRestart()                     'Bus restart
  I2CWrite(0x40)                   'Address
  I2CWrite(0x08+0x80)              'Reg[0x08] with auto increment
  I2CWrite(%11111111)              'Set port 0 all pins high
  I2CWrite(%00000000)              'Set port 1 all pins low
  I2CWrite(%00000000)              'Set port 2 all pins low
  I2CWrite(%00000000)              'Set port 3 all pins low
  I2CWrite(%00000000)              'Set port 4 all pins low
  I2CStop()                        '
 

De 18F4550 gebruik ik al lang niet meer helaas, dus kan ik niet proberen. MikroBasic of -C zit een i2c library bij...

Met een scoop bekijken gaat goed, maar dan moet je wel 2 kanalen hebben om SDA en SCL tegelijk te bekijken. (met 1 kanaal valt er niet veel van te maken)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Bedankt voor je hulp Arco.

Ik heb zonet de SCL en SDA uitgemeten met de scoop.
Als ik mijn board van voedingsspanning voorzie wordt de SDA hoog maar dit is ook het enigste, er wordt niets van data verstuurt over de lijn.

Ik denk dat er iets van initialisatie tekort is in mijn programma. Ik ben wat wanhopig aan het worden. Ik vind maar geen goede informatie hierover.

In de bijlage kan je nog eens mijn volledige code vinden.

Hier ook enkele links van I2C code voor PICs die er heel anders uitzien.

http://www.microchip.com/forums/m36704.aspx
http://www.microchip.com/forums/m843185.aspx

Op 16 maart 2017 10:28:34 schreef pierreke101:
Bedankt voor je hulp Arco.

Ik heb zonet de SCL en SDA uitgemeten met de scoop.
Als ik mijn board van voedingsspanning voorzie wordt de SDA hoog maar dit is ook het enigste, er wordt niets van data verstuurt over de lijn.

Ik denk dat er iets van initialisatie tekort is in mijn programma. Ik ben wat wanhopig aan het worden. Ik vind maar geen goede informatie hierover.

In de bijlage kan je nog eens mijn volledige code vinden.

Hier ook enkele links van I2C code voor PICs die er heel anders uitzien.

http://www.microchip.com/forums/m36704.aspx
http://www.microchip.com/forums/m843185.aspx

Ik denk het misschien gevonden te hebben.

Bij het configureren van mij I2C heb ik voorlopig enkel OpenI2C(MASTER, SLEW_OFF); geschreven.
Maar ik heb de snelheid en welk kristal ik gebruik nog niet geinistaliseerd adhv SSPADD volgens mij..

HOEEEEERAAAAAA!!!!

Dit was dus mijn fout :D na dit te initialiseren is het gelukt!!!!

Bedankt voor jullie hulp en tijd in iedere geval!!!!!!!!!

Mooi dat het werkt... ;)
Normaal zit er een 12c_init bij waar je de baudrate op kunt geven. (bijv. i2c_init(400000)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Nogmaals bedankt!

Heb voorlopig de SSPADD ingesteld op 0x3F, en dit werkt.
Maar denk niet dat dit helemaal correct is., moet nog eens kijken hoe ik deze correct moet instellen