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

Thema: 12 bit AD Wandler AD7994 über I2C auslesen

  1. #1

    12 bit AD Wandler AD7994 über I2C auslesen

    Anzeige

    Praxistest und DIY Projekte
    Hallo liebe Roboternetz Gemeinde.

    Bevor ich mit meiner Frage loslege wollte ich nur mal loswerden, dass ich diesen Forum suuper finde und, dass ich jede Menge über Microcontroller und Roboter gelernt habe seit dem ich hier eure Beiträge lese......

    So... nun zu meinem Problem....

    Ich benutze einen ATMEGA16 Microcontroller und da mir die 10 Bit des onboard AD Wandlers für meinen Messaufbau nicht ausreichen habe ich mir einen externen 12 Bit AD Wandler von Analog Devices besorgt... AD7994. Dieser hat 4 Channels und eine I2C Schnittstelle... Normalerweise ist eine I2C Schnittstelle nicht schwierig zu programmieren... aber bei mir hackts glaube ich bei den Registern... jedenfalls bekomme ich keine Werte aus dem ADC ausgelesen... könnt ihr mir helfen?

    Hier ist mein code... z.Z. läuft die Ansteuerung über die Tastatur aber später wollte ich den ADC entweder in der Do loop oder mit Interrupt (timer0) auslesen...
    Code:
    'AD Wandler am I²C AD7994
    
    $regfile = "m16def.dat"
    $crystal = 8000000
    $baud = 57600
    $hwstack = 40
    $swstack = 10
    $framesize = 40
    
    Config Scl = Portc.0       'I2C Schnittstelle
    Config Sda = Portc.1
    
    Const Ad7994w = &B01000010       'Schreibadresse
    Const Ad7994r = &B01000011       'Leseadresse
    'Registerselect
    Const Configregister = &B11110010       'config Register
    Const Conversionregister = &B11110000       'conversion result register
    Const Cycletimerregister = &B11110011       'cycle Timer Register
    Const Datalowch1 = &B11110100       'Data Low Ch1
    Const Datahighch1 = &B11110101       'Data High Ch1
    Const Hysteresisch1 = &B11110110       'Hysteresis ch1
    Const Datalowch2 = &B11110111       'Data low ch2
    Const Datahighch2 = &B11111000       'Data High ch2
    Const Hysteresisch2 = &B11111001       'Hysteresis Ch2
    Const Datalowch3 = &B11111010       'Data Low Ch3
    Const Datahighch3 = &B11111011       'Data High Ch3
    Const Hysteresisch3 = &B11111100       'Hysteresis Ch3
    Const Datalowch4 = &B11111101       'Datalow ch 4
    Const Datahighch4 = &B11111110       'Datahigh ch 4
    Const Hysteresisch4 = &B11111111       'Hysteresis ch4
    
    Const Confbyte = &B11111000       'config Byte
    Const Convresultreg = &B11110000       'wandlungsergebnisregister
    Const Convresultregch1 = &B00010000
    
    Dim Readvar1l As Byte , Readvar1h As Byte
    Dim Readvar2l As Byte , Readvar2h As Byte
    Dim Readvar3 As Byte
    Dim Writevar1 As Byte
    Dim Writevar2 As Byte
    Dim I As Byte
    'On Timer0 Oncount
    'Config Timer0 = Timer , Prescale = 1
    'Enable Timer0
    'Enable Interrupts
    
    Do
    
    If Usr.rxc = 1 Then 'Wenn Byte empfangen...
        I = Udr         'Byte aus UART auslesen
        Select Case I
        Case "a"
        Print "schreibe configregister"       'for reading conversion register
        I2cstart
        I2cwbyte Ad7994w       'single byte write action
        I2cwbyte Configregister
        I2cwbyte Confbyte
        I2cstop
        I2cstart
        I2cwbyte Ad7994w
        I2cwbyte Configregister
        I2cstop
        I2cstart        'two byte read eather direct read or i have to
        I2cwbyte Ad7994r       ' point to register first... we'll see
        I2crbyte Readvar1h
        I2crbyte Readvar1l
        I2cstop
        Print "printing configsettings"
        Print Bin(readvar1h) ; "," ; Bin(readvar1l)
        Case "s"
        Print "ihalt des conversionregisters fuer ch1"
        I2cstart
        I2cwbyte Ad7994w
        I2cwbyte Convresultregch1
        I2cstop
        I2cstart
        I2cwbyte Ad7994r
        I2crbyte Readvar2h , Ack
        I2crbyte Readvar2l , Nack
        I2cstop
        Print Bin(readvar2h) ; "," ; Bin(readvar2l)       'es kommt 255,255 also im register ist etwas?
        Case "d"
    
        Case "f"
    
        Case "g"
    
        Case "h"
    
        Case Else
          Print "Unbekannter Befehl"
        End Select
      End If
    
    
    
    
    
    Loop
    End
    Die I2C schnittstelle klappt, also die Pullup Widerstände habe ich an Vcc angeschlossen.
    Ach ja und die Datasheet hätt ich gerne angefügt ist aber anscheinend zu groß also deswegen dann hier der Link:
    http://www.farnell.com/datasheets/68190.pdf
    ... übrigens habe ich noch nie eine schlechteren Datasheet gelesen...

    Danke

    Boogyman

  2. #2
    Kann mir wirklich niemand helfen?

  3. #3
    Ok, habe es selbst geschafft.... Das Problem war nicht das Auslesen der Register sondern elektrisch. Ich habe beim verbinden des Adressierungspins (AS) auf GND komischen Spannungsabfall, na jedenfalls habe ich einfach den pin wieder von GND abgelötet und auf "float" belassen und die Slaveadresse dementsprechend geändert... und es klappt.....

    Boogyman

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.08.2006
    Ort
    Kitzscher
    Alter
    44
    Beiträge
    237
    hallo boogyman,

    ich würde gerne wissen ob der code so wie er hier steht verwendet werden kann ?

    Ich würde das gerne mal versuchen nachzubauen aber der Code ist für mich doch ziemlich übel das übersteigt ein bisschen mein Verständniss ^^ wo ich immer noch nicht wirklich verstanden habe wie das mit den Registern auslesen usw. funktioniert.

    Hast du einen Schaltplan den du mir schicken könntest oder vieleicht ein Foto vom Aufbau ?

    Gruß
    Steffen

Berechtigungen

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

LiFePO4 Speicher Test