PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AD7715 mit Atmega32 auslesen



silvio12
02.09.2010, 14:08
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/imported-files/data_sheets/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:




'------------------------------------------------------------------------------ '
' 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

Vitis
02.09.2010, 14:32
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:



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:



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:


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.

silvio12
02.09.2010, 14:43
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

silvio12
02.09.2010, 15:44
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

Vitis
02.09.2010, 18:59
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 ;)

silvio12
02.09.2010, 21:33
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

Vitis
02.09.2010, 23:23
vorweg mal noch n Hinweis:

http://www.analog.com/static/imported-files/faqs/AD7714_15_FAQs_SERIAL_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?

silvio12
03.09.2010, 13:03
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.



Dout Alias Portb.6
Din Alias Pinb.5
Sclk Alias Portb.7
Drdy Alias Pinb.4
Cs Alias Pinb.3


Bin ratlos.

Gruß Silvio

Michael
04.09.2010, 08:43
http://bascom-forum.de/index.php/topic,4015.0.html
http://www.avr-praxis.de/forum/showthread.php?goto=newpost&t=1387

....