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