- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: AD7715 mit Atmega32 auslesen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2009
    Beiträge
    5

    AD7715 mit Atmega32 auslesen

    Anzeige

    Praxistest und DIY Projekte
    Hallo User,

    ich versuche eine AD7715 über SPI mit einem Atmega32 auszulesen. Nach dem ich das Datenblatt versucht habe zu lesen komme ich auf folgende Schritte.

    http://www.analog.com/static/importe...ets/AD7715.pdf

    1. Write to the communications register, setting the gain to 1 with standby inactive.
    2. Write to the setup register, setting bipolar mode, buffer off, no filter synchronization, confirming a clock frequency of 2.4576 MHz, setting the output rate for 60 Hz and initiating a self-calibration.

    3. Poll the output. DRDY
    4. Read the data from the data register.
    5. Loop around doing Step 3 and Step 4 until the specified number of samples have been taken.

    Hier ist der code mit dem ich versuche den AD7715 auszulesen, es steht nach dem Start immer nur 65353 da. Was habe ich übersehen ?

    Hier ist der aktuelle Code:

    Code:
    '------------------------------------------------------------------------------ '
    '                              Auslesen AD7715                                  '
    '                                                                               '
    '-------------------------------------------------------------------------------'
    $regfile = "m32def.dat"                                     'ATmega 32
    $crystal = 16000000                                         'Quarz: 16 MHz
    '$sim
    $hwstack = 256
    $swstack = 256
    $framesize = 256
    '-------------------------------------------------------------------------------'
    
    '-------------------------------LED Spannung------------------------------------'
    
    Config Pind.4 = Output                                      'Pin wird auf High, also 5V geschaltet
    Led Alias Portd.4
    Led = 1
    
    '-------------------------------------------------------------------------------'
    
    '----------------------------- Config für LCD ----------------------------------'
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , _
    Db7 = Portc.5 , E = Portd.7 , Rs = Portd.5
    Config Lcdbus = 4
    Initlcd
    Cursor Off
    Cls
    '-------------------------------------------------------------------------------'
    
    Dim Ch As Word
    Dim signal_out As Byte
    
    Dout Alias Portb.6                                         'signal AD7714 OUT
    Din Alias Pinb.5                                            'signal AD7714 IN
    Sclk Alias Portb.7                                          'clockAD7715 CLK
    Drdy Alias Pinb.4
    
    '1.   Write to the communications register, setting the gain to 1 with standby inactive.
    
    Signal_out = &B00010000
    Shiftout Dout , Sclk , Signal_out , 1 , 8
    
    '2.   Write to the setup register, setting unipolar mode, buffer off
    ' no filter synchronization, confirming a clock frequency of 2.4576 MHz
    ' setting the output rate for 60 Hz and initiating a self-calibration.
    
    Signal_out = &B00101000
    Shiftout Dout , Sclk , Signal_out , 1 , 8
    
    '-------------------------------Hauptschleife-----------------------------------'
    Do
    '3.   Poll the output. DRDY
    Bitwait Drdy , Set
    Bitwait Drdy , Reset
    
    
    Waitus 10
    '4.   Read the data from the data register.
    Signal_out = &B00110000
    Shiftout Dout , Sclk , Signal_out , 1 , 8
    Shiftin Din , Sclk , Ch , 1 , 16
    Waitus 10
    Locate 1 , 1 : Lcd Ch
    Loop
    '-------------------------------------------------------------------------------'
    Grüße Silvio

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    ich arbeite bei einem Projekt mit dem 7705, sollte soweit von der Ansteuerung her gleich sein ... der Deine hat halt nur einen Kanal.
    Ach so, die Ref-Spannung muss auch da sein und sauber (!)

    Bei mir hängt der DRDY auf Int0, also nicht wundern.
    Dieser wird bei mir auf fallende Flanke getriggert.

    die Initalisierung:

    Code:
    Sub Ad7705_init(ad_channel)
          Local Subbyte As Byte
          Local Subbyte_2 As Byte
          Local Subword As Word
          Disable Int0
    
          Ddrd = Ddrd And &B11111110
          ' clock
          Ad7705_sel = 1
          Ad7705_spi_array(1) = &H20
          Ad7705_spi_array(1) = Ad7705_spi_array(1) Or Ad_channel
          'Ad7705_spi_array(2) = &H11                           
    
    
          Ad7705_sel = 0
          Waitms 1
          Spiout Ad7705_spi_array(1) , 2
          Waitms 1
          Ad7705_sel = 1
    
          Ad7705_spi_array(1) = &H10
          Ad7705_spi_array(1) = Ad7705_spi_array(1) Or Ad_channel
          Ad7705_spi_array(2) = &H44
    
          Ad7705_sel = 0
          Waitms 1
          Spiout Ad7705_spi_array(1) , 2
          Waitms 1
          Ad7705_sel = 1
    
          Do
          Loop Until Pind.0 = 0 'drdy
          Do
          Loop Until Pind.0 = 1 'drdy
    
          Ad7705_spi_array(1) = &H10
          Ad7705_spi_array(1) = Ad7705_spi_array(1) Or Ad_channel
          Ad7705_spi_array(2) = &H44
    
          Ad7705_sel = 0
          Waitms 1
          Spiout Ad7705_spi_array(1) , 2
          Waitms 1
          Ad7705_sel = 1
    
          Enable Int0
    End Sub
    Die Daten gibts mit:

    Code:
    Function Ad7705_read(ad_channel)
       Local Sub_tempword As Word
       Ad7705_sel = 1
       Ad7705_spi_array(1) = &H38                               'ad7705_data_register_read
       Ad7705_spi_array(1) = Ad7705_spi_array(1) Or Ad_channel
       Call Write_ad7705_byte(ad7705_spi_array(1))
       Ad7705_read = Read_ad7705_word()
    End Function
    Reset für den ADC:
    Code:
    Sub Adc_interface_reset()
       Disable Int0
       Ad7705_sel = 0
       Waitms 3
       Ad7705_spi_array(1) = &HFF
       Ad7705_spi_array(2) = &HFF
       Ad7705_spi_array(3) = &HFF
       Ad7705_spi_array(4) = &HFF
       Spiout Ad7705_spi_array(1) , 4
       Waitms 3
       Ad7705_sel = 1
       Enable Int0
    End Sub
    und ganz wichtig, den Clock nicht vergessen, ohne geht da nix.
    Bei mir erzeuge ich die mit nem Mega128 und Timer ... nicht besonders schön, spart aber zusätzliche Bauteile.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2009
    Beiträge
    5
    Hallo Vitis, ich sage erstmal danke und werde das testen und verstehen, die REF-Spannung liegt sauber an. Sollte nicht das Problem sein.

    Melde mich wie der Test ausgegangen ist.

    Gruß Silvio

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2009
    Beiträge
    5
    Bekomme es leider nicht hin, ein Grund dafür ist auch das ich noch nicht so richtig verstehe was ich da machen. Laut Datenblatt muss ja das Comm-Register beschrieben werden, dann das Setupregister.

    Warten auf high von DRDY (Alias Pinb.4 ) oder muss das Int0 sein, und dann auslesen, dazu erst schreiben Comm-Register dann auslesen. Zurück auf Warten und dann das ganze von vorne.

    Die Clock ist ex. 2,4..MHZ laut Datenblatt. REF-Spannung ist stabil 2,5V.

    Was vergesse ich hier in meinem Anlauf?

    Gruß Silvio

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    In Deinem Progrämmchen fehlt mir der Chip Select

    Bei mir ist das:

    Ad7705_sel = 0
    Ad7705_sel = 1

    Alles Andere Hast Du:
    Dout Alias Portb.6 'signal AD7714 OUT
    Din Alias Pinb.5 'signal AD7714 IN
    Sclk Alias Portb.7 'clockAD7715 CLK
    Drdy Alias Pinb.4

    aber der Select fehlt
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2009
    Beiträge
    5
    Ist richtig, ich habe auch keine CS Leitung. Auch im Schaltplan nicht, der liegt auf Masse und somit ist er LOW. Ist auch so in der Grundschaltung.

    Gruß Silvio

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    vorweg mal noch n Hinweis:

    http://www.analog.com/static/importe..._INTERFACE.pdf

    probiers mal mit nem Reset als Start, also 4 bytes &HFF bzw. &B11111111

    Möglich das da was beim Powerup reinspuckt.

    Ach so, den Resetpin hast Du wohl gepullt, oder?
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    14.12.2009
    Beiträge
    5
    Hallo, also am Reset hängt kein pull up. Ich habe nun die Leitungen so wie unten beschrieben angeschlossen und auch den Chip Select dranne. Wenn ich das Programm aufspiele und den µc starte steht immer 65535 da. Egal ob an Ain eine 0 anliegt oder nicht. Komme ich an den Pin Din dann flackern die Werte.
    Angeschlossen habe ich das ganze nach dem Schaltplan.

    http://paulfjujo.free.fr/AD7715/images/AD7715_sch.jpg

    Halt so das es für eine Atmega32 mit sclk, miso, mosi, cs und drdy passt.

    Code:
    Dout Alias Portb.6                                          
    Din Alias Pinb.5                                            
    Sclk Alias Portb.7                                          
    Drdy Alias Pinb.4
    Cs Alias Pinb.3
    Bin ratlos.

    Gruß Silvio

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    55
    Beiträge
    1.258

Berechtigungen

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

LiFePO4 Speicher Test