PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 12 bit AD Wandler AD7994 über I2C auslesen



boogyman
08.08.2006, 09:55
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...


'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

boogyman
09.08.2006, 13:06
Kann mir wirklich niemand helfen?

boogyman
10.08.2006, 10:11
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

Steffen44
21.06.2007, 20:20
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