Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: IC MCP23017 I2C Bus I/0 - Erweiterung Kategorie: Programmierung C (von Christian - 23.02.2009 17:36)
Als Antwort auf Re: IC MCP23017 I2C Bus I/0 - Erweiterung von UlliS - 23.02.2009 10:04
Ich nutze:
C-Control Pro Mega128
> > Hallo
> >
> > bräuchte dringend Hilfe. Ich probiere jetzt schon seit knapp 2 Wochen den MCP23017 IC
> > von Microchip anzusprechen.
> > Aber entweder stürzt das Programm ab oder es passiert nix. Die Ausgänge bleiben dennoch stumm. :-(
> > Als Stütze benutze ich die Beispielprogramme für den PCF 8574 von Ulli.
> >
> >
> > Hierher hab ich ihn bezogen:>
> > MCP23017 IC
> >
> > Vielen Dank
> >
> > Grü�e Christian
> >
> >
>
> Hallo Christian,
>
> der MCP23017 ist etwas umfangreicher von den Einstellungen wie der
> PCF8574... der MCP besitzt unter anderem ein richtiges Datenrichtungsregister
> und es kann zwichen Bytemode und Sequenziellmode ausgwählt werden.
> Das Beispiel zum PCF geht bei den Burschen daher nicht.
> Ich hab jedoch ein Beispiel für Bascom gefunden das den 23016 benutzt.
> Das sollte dir evtl. weiterhelfen...
>
> '**********************************************************************
> ' Application Note: Using the MCP23016 I/O expander
> '-----------------------------------------------------
> '
> ' Program-ID.: AN245 MCP23016.bas.
> ' Date...... : 22 / 05 / 2005
> ' Description: Example program for I2C MCP23016 I/O expander
> ' write and read routines.
> '
> ' Author : Roland van leusden (sayang@zonnet.nl).
> '
> ' Setup for the AT90S2313 using portd.6 for SDA and Portd.5 for SCL.
> ' (Futurlec ET-JRAVR board)
> ' See AN245 page 9 from Microchip for MCP23016 shematic.
> '
> ' This program provides an example for writing to and reading from
> ' an I2C MCP23016 device wired for device 0 (AO,A1 and A2 all pulled
> ' to Gnd).
> '
> '
> '**********************************************************************
> $regfile = "2313def.dat" ' Change for your AVR.
> $crystal = 4000000 ' 4 MHz Crystal.
> $baud = 19200 ' Output at 19200 baud.
>
> '**********************************************************************
> '** Set up Data Direction Registers and ports - Do this before defining I2C pins!
> '**********************************************************************
> ' Port B
> Portb = &B0000_0000 ' Set All Port Pins Low
> Ddrb = &B1111_1111  ' Set Unused Pins As Outputs.
> ' Port D
> Portd = &B0000_0000 ' All low - with push-pull output
> Ddrd = &B1111_1111 ' with internal pullups.
>
> '**********************************************************************
> '** Define and initialize I2C pins **
> '**********************************************************************
> Config Sda = Portd.6  ' I2C Data.
> Config Scl = Portd.5 ' I2C Clock.
>
> '**********************************************************************
>
> '**********************************************************************
> '
> '** Declare subroutines **
> '**********************************************************************
> '
> ' This subroutine writes data to the I2C MCP23016.
> '
> Declare Sub I2c_mcp23016_write(byval Cmd As Byte , Byval Lsb As Byte , Byval Msb As Byte)
> '
> ' This subroutine reads data from the I2C MCP23016.
> '
> Declare Sub I2c_mcp23016_read
>
> '**********************************************************************
> '** Define working variables and constants  **
> '**********************************************************************
>
> '
> ' Change the 3 "AD" bits to reflect the I2C address of the device
> ' (corresponding to A0,A1 and A2)..
> '
> Dim Mcp23016_adress_w As Byte
> Mcp23016_adress_w = &H40 'Write Adress: 0 1 0 0 A2 A1 A0 0
>
> Dim Mcp23016_adress_r As Byte
> Mcp23016_adress_r = &H41 'Read Adress: 0 1 0 0 A2 A1 A0 1
>
> Dim Counter_1 As Byte
> Dim Lsb As Byte
> Dim Msb As Byte
>
>
> 'This is for the Microchip MCP23016 initialization, some examples below
>
> 'Call I2c_mcp23016_write(&H04 , &Hff , &Hff) 'Invert All Input Polarities
> 'Call I2c_mcp23016_write(&H0a , &H01 , &H01) 'Initialize Iares , For Fast Input Scan Mode
>
> 'Call I2c_mcp23016_write(&H06 , &H00 , &HFF) 'Initiallize It So The Lsbs Outputs Are & Msbs Are Inputs
> 'Call I2c_mcp23016_write(&H06 , &Hff , &Hff) 'Initiallize It So That Both Lsbs & Msbs Are Inputs
>
> 'Call I2c_mcp23016_write(&H02 , &HFF , &HFF) 'Initiallize The Ouput Latch
> 'Call I2c_mcp23016_write(&H06 , &H00 , &H00) 'Initiallize It So That Both Lsbs & Msbs Are Outputs
>
>
>
> '**********************************************************************
> '** Actual work starts here.  **
> '**********************************************************************
>
>
> Main:
>
> Waitms 250 ' wait 250 ms for the MCP23016 powerup timer
>
> Call I2c_mcp23016_write(&H02 , &HFF , &HFF) 'Initiallize The Ouput Latch
> Call I2c_mcp23016_write(&H06 , &H00 , &H00) 'Initiallize It So That Both Lsbs & Msbs Are Outputs
>
> Lsb = &HFE '0 => Led is "on" FE => 11111110
> Msb = &HFE '0 => Led is "on" FE => 11111110
>
> Counter_1 = 0
>
> Do 'Chaser effect
>
> Call I2c_mcp23016_write(&H02 , Lsb , Msb) 'Write Lsb & Msb to MCP23016
>
> Rotate Lsb , Left , 1 'Rotate the bits
> Rotate Msb , Left , 1
> Waitms 100 'Wait 100ms
> Counter_1 = Counter_1 + 1 ' Increase the counter
>
> Loop Until Counter_1 = 255 ' As long as the counter is not 255 keep writing & rotating
>
> Lsb = &HFF '0 => Led is "on" FF => 11111111
> Msb = &HFF
>
> Call I2c_mcp23016_write(&H02 , Lsb , Msb) 'All leds off
>
> Call I2c_mcp23016_write(&H06 , &H00 , &HFF) 'Initiallize It So The Lsbs Outputs Are & Msbs Are Inputs
>
> Do 'Read Msb and display on Lsb
>
> Call I2c_mcp23016_read ' Read Msb
> Print "Msb: " ; Msb ' Send value of Msb to serial port
> Lsb = Msb ' Copy Msb to Lsb
> Call I2c_mcp23016_write(&H02 , Lsb , Msb) ' Write Lsb to MCP23016
> Wait 1
>
> Loop
>
> End 'end program
>
>
> '**********************************************************************
> '** Define Subroutines **
> '**********************************************************************
> Sub I2c_mcp23016_write(byval Cmd As Byte , Byval Lsb As Byte , Byval Data2 As Byte)
> ' Writes data to the I2C MCP23016.
>
>  I2cstart 'Generate A Start Condition
>  I2cwbyte Mcp23016_adress_w 'Transmit The "ADDRESS and WRITE" Byte
>  I2cwbyte Cmd 'Transmit The Command Byte
>  I2cwbyte Lsb 'Transmit First Data Byte
>  I2cwbyte Msb 'Transmit Second Data Byte
>  I2cstop 'Generate a STOP condition
>  Waitus 50 'Some delay may be necessary for back to back transmitions
>
> End Sub
>
> Sub I2c_mcp23016_read
> ' Read data from the I2C MCP23016
>
>  I2cstart 'Generate START condition
>  I2cwbyte Mcp23016_adress_w 'Transmit The "ADDRESS and WRITE" Byte
>  I2cwbyte &H00 'Transmit The Command Byte
>  I2cstop 'Generate a STOP condition
>  I2cstart 'Generate a START condition
>  I2cwbyte Mcp23016_adress_r  'Transmit ADDRESS with READ command
>  I2crbyte Lsb , Ack 'Receive first DATA byte (LSB) and acknowledge
>  I2crbyte Msb , Nack 'Receive second DATA byte (MSB) and don't acknowledge
>  I2cstop 'Generate a STOP condition
>
> End Sub

>
> Hier noch der Link dazu:
> http://www.mcselec.com/index.php?option=com_content&task=view&id=107&Itemid=57
>
> Ich habe leider keinen MCP zum spielen hier :-)
>
> Tschü Ulli
>
>
>
>

Hallo Ulli,
Vielen Dank für den Link und den Tipp mit dem 23016er .Ich werde heute Abend gleich mal loslegen.
Kann dir einen MCP zuschicken, ich brauch ja keine 5 Stück ;-)

GruÃ? Christian





    Antwort schreiben


Antworten: