- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: 14bit ADC max1069 Problem mit auslesen über Hard-TWI & M

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381

    14bit ADC max1069 Problem mit auslesen über Hard-TWI & M

    Anzeige

    Praxistest und DIY Projekte
    Hallo und nen schön Abend!

    Ich habe mal wieder ein kleines Problem bei dem ich nicht weiter komme. Ich versuche schon seit geraumer Zeit einen max1069 per TWI bei 400kHz auszulesen. Leider fehlt mir jetzt ne Idee und Eure Hilfe!
    Im Anhang ein Spektrum meiner Übertragung zum max1069.

    Code:
    $lib "i2c_twi.lbx" 
    Config Twi = 400000                                                             ' Init TWBR und TWSR
    ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
    Twcr = &B00000100
    Config Scl = Portc.0                                                            'Is serial clock SCL
    Config Sda = Portc.1
    Const Max1069wr = &B01101110                                                    'DS1624 Sensor write
    Const Max1069rd = &B01101111
    I2cstart
        I2cwbyte Max1069wr
        I2crbyte Spannung1 , Ack
        I2crbyte Spannung2 , Nack
        I2cstop
        Locate 2 , 1 : Lcd "I2c err= " ; Err
         Locate 1 , 1 : Lcd "Spannung1= " ; Str(spannung1)
         Locate 2 , 1 : Lcd "Spannung2= " ; Str(spannung2)
    Mit dem Code spreche ich den MAX an. Laut des Pegelprotokolls bekomme ich nach der Start Aufforderung und anschließendem Adresssendung ein acknowledge. Wenn ich nach dem datasheet gehe, sollte nach jedem byte was durch den Master angestoßen wird ein acknowledge auch durch ihn gesendet werden. Dies vermisse ich aber an der Übertragung in meinem Analyzer.

    Hat jemand von Euch ne Idee woran das liegen kann?

    Gruß MAT
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken max1069.jpg  

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    mat-sche,

    guck' mal auf Seite 15 des Datenblattes den Abschnitt "Internal Reference Shut-down" an. Wenn Du dem IC mit R/W-Bit=0 ansprichst, schaltet er die interne Referenzspannung ab. Du musst ihm die Adresse mit R/W=1 schicken, also Max1069rd !

    Ciao,

    mare_crisium

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    hi mare_crisium,

    jo Du hast recht. Habe mal auf rd umgestellt aber ohne eine Änderung. Bekomme für beide Byts eine 255. Schau ich mir das TWI Signal an, werden alle Signale wie im datasheet ( Abbildung 11 S.16) beschrieben gesendet, jedoch ohne eine Größe.
    Die twi Übertragung ist laut Errorüberwachung in Ordnung.
    Hat jemand nen Plan oder eine Idee?

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Nachtrag!

    werde mir jetzt wohl oder über mal langsam nen Paar richtige steckkabel für mein Testboard zulegen müssen!
    Das soll heißen, dass der Code soweit funst (R/W) muss natürlich 1 sein. Der Fehler war eine nicht richtige Kontaktierung auf dem Steckerboard.

    MAT

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    MAT,

    freut mich, dass es jetzt im Prinzip funzt ! Im Oszillogram ist am Ende des ersten ACK-Impulses so eine komische Spitze zu sehen. Ich hatte mir das damit erklärt, dass der IC da schon in Schlafstellung geht. Könnte aber auch ein Wackelkontakt sein. Viel Erfolg weiterhin!

    Ciao,

    mare_crisium

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hallo mare_crisium,

    ich hatte zu Beginn das Readbit auf 1 stehend und keine Resultatet gesehen. Auch mich hat der Spike im Oszillogram etwas verwundert.
    Inzwischen läuft alles und werde den Code vollständig dann abbilden.

    Gruß MAT

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Hi,

    und nun noch ein kleines Demoprogramm dazu:
    Code:
    '**********************************************************
    
    'Programm            :
    'By                  : mat-sche
    'Compiler            : BASCOM-AVR  1.11.9.3
    'Hardware            : DS1820 an Port d.4
    '
    '                      LCD-Display 4x20 an PortC
    '                      max1069 an Hardware TWI
    'Chip type           : MEGA32
    'Date                : 04.03.2010
    '**********************************************************
    
    $regfile = "m32def.dat"
    $crystal = 14745600
    
    
    
    $baud = 9600
    $lib "i2c_twi.lbx"
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    '$sim
    
    
    '-------------------------------------------------------------------------------   2x16 LCD Display an Port c =>Conector
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    Config Lcd = 20 * 4
    Config Lcdbus = 4
    Initlcd
    Cursor Off
    Cls
    
    
    Ddrd = &B00010000                                                               'pull up einschalten für Taster
    Ddrb = &B1000000
    Dim Gsm As Bit
    Led Alias Portb.7
    Dim Rs232_flash As Byte
    Dim Rs232_str As Byte
    '-------------------------------------------------------------------------------   Variablen
    Config Twi = 400000                                                             ' Init TWBR und TWSR
    ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
    Twcr = &B00000100
    Config Scl = Portc.0                                                            'Is serial clock SCL
    Config Sda = Portc.1
    Const Max1069wr = &B01101110                                                    'DS1624 Sensor write
    Const Max1069rd = &B01101111
    Dim E_ah As Byte                                                                'höherwertiges Byte der SpeicherAdresse (Adresse=Word)
    Dim E_al As Byte                                                                'niederwertiges Byte der SpeicherAdresse (Adresse=Word)                                                         'Is serial data SDA
    Dim E_addr As Word                                                              'SpeicherAdresse EEprom
    Dim E_dat_r As Byte
    Dim Spannung1 As Byte , Spannung2 As Byte , Spannung3 As Word , Spannung4 As Single
    'Dim Storespannung(2) As Byte At Spannung Overlay                                'Maske: weise die 4Byte aus dem Single(Temperature) dem
    Dim Bita As Bit
    Dim Avgschleife1 As Byte
    Dim Avg1_ges_temp As Long , Avg_1 As Long
    
    
    '-------------------------------------------------------------------------------
    
    
     Locate 1 , 1
       Lcd "start"
    Waitms 100
    Cls
    Do
    
    '******************************************************************************* 'Automatisches Flashen über RS232
    Rs232_flash = Ischarwaiting()
    If Rs232_flash = 1 Then                                                         'wurde was über RS232 empfangen?
       Rs232_str = Inkey()                                                          'Empfangspuffer auslesen
       If Rs232_str = 123 Then                                                      'vom MCS-Programmer geschickte "123" empfangen?
       Goto &HF800                                                                  'Sprungadresse zum Startbereich des Bootloaders
       End If
    End If
         Led = 1                                                                    'Pin wird auf High, also 5V geschaltet
         Waitms 100
         Print "LED"
         Led = 0                                                                    'Pin wird auf Low, also 0V geschaltet
         Waitms 100
    
     I2cstart
        I2cwbyte Max1069rd
        I2crbyte Spannung1 , Ack                                                    ' acknowledge => weiteres Datenbit wird erwartet
        I2crbyte Spannung2 , Nack                                                   ' not acknowledge => abschluss der Übertragung
        I2cstop
    
        'Spannung3 = Spannung1 * 256
        'Spannung3 = Spannung3 + Spannung2
        'Shift Spannung3 , Right , 2
        Spannung3 = Makeint(spannung2 , Spannung1)                                  ' high und lowbyte zur worvariable zusammensetzen
    
        Avg1_ges_temp = Avg1_ges_temp + Spannung3                                   ' 2 fach oversampling
         Incr Avgschleife1
         If Avgschleife1 = 2 Then
        Spannung4 = Avg1_ges_temp / 2
         Avgschleife1 = 0
         Avg1_ges_temp = 0
        Spannung4 = Spannung4 * 4.096
        Spannung4 = Spannung4 / 16384
        Locate 1 , 1 : Lcd "Sp4= " ; Spannung4
        Locate 2 , 1 : Lcd "I2c err= " ; Err
        End If
        'Waitms 300
    
    '******************************************************************************* CONTINUOUS CONVERSIONS
    
    
        If Bita = 1 Then
          Cls
        I2cstart
        I2cwbyte Max1069rd
        I2crbyte Spannung1 , Ack
        I2crbyte Spannung2 , Ack
    
        I2crbyte Spannung1 , Ack
        I2crbyte Spannung2 , Ack
    
         I2crbyte Spannung1 , Ack
        I2crbyte Spannung2 , Nack
        I2cstop
    
        Spannung3 = Makeint(spannung2 , Spannung1)
        Spannung4 = Spannung3 * 4.096
        Spannung4 = Spannung4 / 16384
        Locate 1 , 1 : Lcd "Sp4= " ; Spannung4
        Locate 2 , 1 : Lcd "I2c err= " ; Err
    
    
         Locate 3 , 1 : Lcd "I2c err= " ; Err
    
     End If
    '-------------------------------------------------------------------------------   Taster für Kommado senden an die verschiedenen Slaves
    Debounce Pina.7 , 1 , Taster1 , Sub
    Debounce Pina.6 , 1 , Taster2 , Sub
    Debounce Pina.5 , 1 , Taster3 , Sub
    Debounce Pina.4 , 1 , Taster4 , Sub
    Debounce Pina.3 , 1 , Taster5 , Sub
     'Waitms 200
    
    
    
    Loop
    End
    
    
    '*******************************************************************************   SUBS
    
       Taster1:
        Cls
        I2cstart
        I2cwbyte Max1069rd
        I2crbyte Spannung1 , Ack
        I2crbyte Spannung2 , Nack
        I2cstop
    
        Spannung3 = Spannung1 * 256
        Spannung3 = Spannung3 + Spannung2
        Shift Spannung3 , Right , 2
        Spannung4 = Spannung3 * 4.096
        Spannung4 = Spannung4 / 16384
        Locate 1 , 1 : Lcd "Sp4= " ; Spannung4
    
       Return
    
      Taster2:
      Toggle Bita
      Locate 4 , 1
       Lcd "Taster2"
      Return
    
      Taster3:
      'Timervorgabe = 63500
      Locate 1 , 1
       Lcd "Taster3"
      Return
    
      Taster4:
      Enable Timer1
      'Timervorgabe = 64300
      Locate 1 , 1
       Lcd "Taster4"
      Return
    
      Taster5:
     Gsm = 1
      Locate 2 , 1
       Lcd "Taster5"
       Return
    Gruß MAT

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.12.2005
    Beiträge
    535
    MAT,

    schick !

    mare_crisium

Berechtigungen

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

12V Akku bauen