- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 6 von 6

Thema: Externer AD-Wandler (Max127) über I2C auslesen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2005
    Beiträge
    29

    Externer AD-Wandler (Max127) über I2C auslesen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Allesammt!

    Hatte vor ner Weile mal gepostet bezüglich zusätzlichen AD-Eingängen am ATMega16. Habe jetzt von Maxim den Max127 und den Max128 auf dem Tisch liegen und würde die gerne anschließen. Aufgebaut ist nu alles, aber irgendwie will das mit dem I²C nicht so ganz funzen.

    Der IC übermittelt die gemessen Werte mittels zweier Byte nacheinander an den Master, aber mein Bus macht gar nichts, zumindest sagt das das Oszi.
    Angeschlossen hab ich alles richtig, SDA und SCL liegen mittels 4,7kOhm an 5V. Sieht jemand in meinem Programm den Fehler? Ist mein erstes I2C- Projekt, bin da noch nicht ganz fit mit.

    Besten Dank und Gruß, Martin

    Hier mal mein Programm, möchte nur dass mir die übermittelten Daten auf einem LCD ausgegeben werden.

    ...
    Baud 57600

    Const Adextw1 = &B01010000 'Schreibadresse
    Const Adextr1 = &B01010001 'Leseadresse
    Const Adext1chan1 = 11111000 'Control-Byte für AD-Kanal 1

    Dim Readvar1h As Bit
    Dim Readvar1l As Bit

    Initlcd

    Do
    Cls

    I2cstart
    I2cwbyte Adextw1
    I2cwbyte Adext1chan1
    I2cstop

    I2cstart
    I2cwbyte Adextr1
    I2crbyte Readvar1h
    I2crbyte Readvar1l
    I2cstop

    Locate 1 , 1
    Lcd "h: "
    Lcd Readvar1h
    Locate 2 , 1
    Lcd "l: "
    Lcd Readvar1l
    Wait 1
    Loop

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    43
    Beiträge
    464
    Dim Readvar1h As Bit
    Dim Readvar1l As Bit

    Der I2C Bus kann keine einzelen Bits übertragen, sondern nur Bytes.
    also

    Dim Readvar1h As Byte
    Dim Readvar1l As Byte

    Das ist das Erste. Ob das Programm so richtig ist, kann ich jetzt nicht sagen, da ich nur wenig mit I2C arbeite

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    und evtl. sollte man noch angeben, wo die I2C Pins überhaupt sind.
    Irgendwie muss man das noch Initialisieren, nicht gleich mit Start loslegen !
    Wenn Du das Hardware-I2C bzw. TWI verwenden willst, gehört oben noch eine Lib angegeben, und dann noch die Bus-Geschwindigkeit setzen.

    hier alles zusammen :
    Code:
    $lib "i2c_twi.lbx"          ' we do not use software emulated I2C but the TWI
    
    Config Scl = Portc.5        ' we need to provide the SCL pin name
    Config Sda = Portc.4        ' we need to provide the SDA pin name
    'Config I2cdelay = 10       ' nur bei SoftI2C
    
    I2cinit                     ' we need to set the pins in the proper state
    
    Config Twi = 100000         ' wanted clock frequency, nur wenn die Lib oben eingebunden ist

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2005
    Beiträge
    29

    weiter gehts

    Danke schonmal soweit Euch Beiden!
    Habe die Änderungen übernommen, Code sieht nun wie folgt aus:

    Code:
    $regfile = "m16def.dat"
    
    $crystal = 16000000
    $lib "i2c_twi.lbx"
    
    Const Ref = 5 / 1023
    Baud 9600
    
     
    Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.7 , Rs = Portc.6
    Config Lcd = 16 * 2
    
    
    Config Sda = Portc.1
    Config Scl = Portc.0
    'Config I2cdelay = 10
    
    Const Adextw1 = &B01010000                                  'Schreibadresse
    Const Adextr1 = &B01010001                                  'Leseadresse
    Const Adext1chan1 = 11111000                                'Control-Byte für AD-Kanal 1
    
     
    Dim Readvar1h As Byte
    Dim Readvar1l As Byte
    
    Initlcd
    I2cinit
    
    Config Twi = 100000
    
    Do
       Cls
       I2cstart
       I2cwbyte Adextw1
       I2cwbyte Adext1chan1
       I2cstop
    
       I2cstart
       I2cwbyte Adextr1
       I2crbyte Readvar1h
       I2crbyte Readvar1l
       I2cstop
    
       Locate 1 , 1
       Lcd "h: "
       Lcd Readvar1h
       Locate 2 , 1
       Lcd "l: "
       Lcd Readvar1l
    
       Wait 1
    
    Loop
    Nur leider funzts immer noch nicht. Man kann auf dem Oszi erkennen, dass Sda jeweils auf 0 gezogen wird, aber das wars auch schon. Stimmt das Programm soweit? Auf welchen Wert muss ich eigentlich den Baud-Wert stellen?
    Fragen über Fragen...

    Danke und Gruß, Martin

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hi,

    wenn Du per UART nix überträgst, kannst du die Baudangabe weglassen.

    Dann denke ich das bei der Konstante zum AD-Kanal die Angabe fehlt, das es sich um eine binäre Darstellung handelt !

    Muss man evtl. etwas warten zwischen dem Kanal einstellen und dem Auslesen des Wertes ? So schnell wird der AD-Wandler nicht sein, ausser er wandelt immer wo vor sich hin

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    22.01.2005
    Beiträge
    29

    hat sich erledigt!

    Jippie, habs gerade geschafft!
    Das Programm war schuld, jetzt funktionierts!
    Wenn man lange genug rumprobiert hat funktionierts halt doch meistens!

    Nochmals allen Helfern vielen Dank!

    Gruß, Martin

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad