www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Read mit MCP23017


Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche mit folgendem Code (Ansteuerung eines T6963C) einen 
MCP23017 auszulesen.
Allerdings bekomme ich nur Nullen zurück, daher zweifle ich etwas an dem 
Code.

Kennt jemand diesen Chip und kann mal über den Code schauen ?

Vielen Dank !

Hier der Code:
#define MCP23017_Address  0x40  // 0_1_0_0_A2_A1_A0_RW

uint8_t readMCP23017()
{ uint8_t  data;
  //read data register (GPA0:7)
  i2c_start_wait(MCP23017_Address+0);
  i2c_write(0x9); // GPIO-A auswählen
  i2c_rep_start(MCP23017_Address+1);  // Lesemodus
  data = i2c_read(0);
  i2c_stop();

  return data;
}

Autor: 11833 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
von einem i2c_init() irgendwann zu einem früheren zeitpunkt gehe ich mal 
aus.

so wie ich das datenblatt verstehe (figure 1-1) ist eine stop condition 
nach dem schreibenden registerzugriff nötig (erste Zeile [DIN]->[P]).

Vor dem i2c_read dann wieder eine start_condition.
z.B.:

i2c_start(MCP23017_Address | 0x01);
data = i2c_readNak();

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ein i2c_init() läuft vorher :-)

Dann ist meine Write-Routine wohl auch nicht ganz korrekt, oder ?
void writeMCP23017(uint8_t cmd, unsigned char  data, unsigned char direction)
{ i2c_start_wait(MCP23017_Address+0);
  if (cmd)
  {  i2c_write(10); // direction register
    i2c_write(direction);  // set direction 
  i2c_stop();
  i2c_start_wait(MCP23017_Address+0);
    i2c_write(0x19);  // GPIO register for B
  }
  else       //data is written
  { // set all pins output on GPA0:7
    i2c_write(0); // direction register
    i2c_write(0x0);  // set all to output 
  i2c_stop();
  i2c_start_wait(MCP23017_Address+0);
    i2c_write(0x09);  // GPIO register for A
  }

  i2c_write(data);
  i2c_stop();
}

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(schieb nach oben)

Autor: Marcel Klug (sunny198828)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
so mache ich es , ist zwar assembler aber vllt verstehst du es ja !

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Read_MCP_LCD_Data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  call  i2c_on
  movlw  B'01000000'
  call  i2c_tx
  movlw  H'12'
  call  i2c_tx
  call  i2c_ron
  movlw  B'01000001'
  call  i2c_tx
  call  i2c_rx
  movfw  RXData
  movwf  MCP_PORTAin
  call  i2c_off

und hier der auszug von i2c_ron

; I2C-Bus im Master-Mode übernehmen - repeated START
i2c_ron
  bcf    PIR1, SSPIF    ; SSPIF Bit zurücksetzen
  bsf    STATUS, RP0
  bsf    SSPCON2, RSEN    ; repeated start condition
  bcf    STATUS, RP0
  btfss  PIR1, SSPIF      ; Bus schon frei ?
  goto  $-1          ;
  bcf    PIR1, SSPIF    ; ja, Bus ist übernommen
  return

erst musst du den bus übernehmen und dann die adresse des MCP schicken 
mit letztem bit write dann musst du das GPIO register auswählen entweder 
A oder B 0x12 oder 0x13 . dann musst du ein i2c reset ausführen dann 
sendest du nochmal die i2c adresse nur jetzt das letzte bit als read . 
jetzt kannst du den MCP auslesen das ganze noch in eine ramzelle 
schreiben damit es nicht verloren geht und dann nicht vergessen den i2c 
bus wieder frei zu geben !

mfg

Autor: Marcel Klug (sunny198828)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uuups der thread ist ja schon asbach sorry ^^

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.