Hallo Leute,
nach meinen gescheiterten Versuchen einen AD-Wandler an den ATmega32
über SPI anzuschließen, versuche ich es jetzt über I2C.
Meine Erfolge sind aber leider wieder "überschaubar".
Hier mal mein Code, vielleicht könnte sich ja einer von Euch mal die
Mühe machen und mal kurz drüber schauen:
Const Adr_ctl = 10001000 'Control-Byte für AD-Kanal 0
26
27
28
Dim Msb As Byte
29
Dim Lsb As Byte
30
31
I2cinit
32
Config Twi = 100000
33
34
Do
35
36
Cls
37
I2cstart
38
I2cwbyte Adr_w
39
I2cwbyte Adr_ctl
40
I2cstop
41
42
I2cstart
43
I2cwbyte Adr_r
44
I2crbyte Msb , Ack
45
I2crbyte Lsb , Nack
46
I2cstop
47
48
Locate 1 , 1
49
Lcd "msb:" ; Msb ; " " ; "lsb:" ; Lsb
50
51
Wait 1
52
Locate 2 , 1
53
Lcd "Start"
54
Wait 1
55
56
Loop
57
58
End
Erwartet hätte ich eigentlich dass sich mein msb- und lsb-Byte
wenigstens ein bisschen verändern wenn ich an meinem Poti drehe, die
bleiben aber stur auf 255 stehen (was ja beim lsb gar nicht sein kann,
da sind die letzten 4 Bit ja eigentlich 0)
Ich bin leider kein Profi, deshalb wäre ich für jeden Vorschlag dankbar!
für die SW TWI zuständig ist, hier genau verkehrt herum.
Du verwendest im Moment die SW TWI, diese braucht unbedingt Pullups an
den TWI Pins, die HW TWI dagegen kann auch mit internen Pullups
arbeiten.
Hallo MWS, danke für die schnelle Antwort!
ich habe das "Config I2cdelay = 10" und das "&b" eingefügt.
Das "Config Twi = 100000" habe ich rausgenommen.
Die Pullups hatte ich schon drin.
Leider bekomme ich immer noch das gleiche Ergebnis.
Ich bekomme auch immer einen ERR = 1 wenn ich folgenden Code verwende:
1
Do
2
3
Cls
4
I2cstart
5
I2cwbyte Adr_w
6
I2cwbyte Adr_ctl
7
I2cstop
8
Locate 2 , 1
9
Lcd "ERR: " ; Err
10
Wait 2
11
Cls
12
I2cstart
13
I2cwbyte Adr_r
14
I2crbyte Msb , Ack
15
I2crbyte Lsb , Nack
16
I2cstop
17
Locate 2 , 1
18
Lcd "ERR: " ; Err
19
Wait 2
20
Cls
21
Locate 1 , 1
22
Lcd "msb:" ; Msb ; " " ; "lsb:" ; Lsb
23
24
Wait 1
25
Locate 2 , 1
26
Lcd "Start"
27
Wait 1
28
29
Loop
Irgendwas mache ich wohl noch falsch!
Hat noch jemand eine Idee für mich?
Nach Suche in Internet, bin ich auf deinen sehr hilfreichen Code
gestoßen.
Nach einer Anpassung (siehe unten) an mein selbstgestricktes Zielsystem,
lief alles zu meiner vollsten Zufriedenheit.
Übrigens, eine Probeverdrahtung auf z.B. $52 liefert auch bei mir nur
$FFFFFFFF ...., liegt hier vielleicht der Fehler ?
'-----------------------------------------------------------------------
------------
' Copyright 2010 - Bernd Hübener
' IIC-AD.BAS
' Zielsystem: Basic-Box
' Aufgabe: Eingangsspannung an Pin 0 des MAX127 Ausgabe
' in der Form x.yyy, Spannungsbereich 0-5 V
'-----------------------------------------------------------------------
------------
$regfile = "m8535.dat" ' ATMEGA8535
$crystal = 20000000
$baud = 9600
'Declare variables
Dim Msb As Byte
Dim Lsb As Byte
Dim Dummy As String * 20
Dim L As Single , Lu As Single
' Konfiguration für I2C
Config Sda = Portc.7
Config Scl = Portc.6
' Konfiguration LCD
Config Lcdpin = Pin , E = Portd.2 , Rs = Portd.3 , Db4 = Portd.7 , Db5 =
Portd.6 , Db6 = Portd.5 , Db7 = Portd.4
Config Lcd = 20 * 4
' Konstanten für MAX127
Const Adr_w = &B01010000
Const Adr_r = &B01010001
Const Adr_ctl = &B10000000 ' Kanal 0
Portc = 63 ' 63
entspricht 001111111, PortC 6+7 als Ausgänge
I2cinit ' kann entfallen
(!?)
'Initlcd ' wird vom Parallelsystem nach Reset
übernommem
Cls
Do
I2cstart
I2cwbyte Adr_w
I2cwbyte Adr_ctl ' Modus
einstellen
I2cstop
I2cstart
I2cwbyte Adr_r
I2crbyte Msb , Ack ' MSB lesen
I2crbyte Lsb , Nack ' LSB lesen
I2cstop
L = Msb * 16 ' schiebe um
4 Bit nach links und konvertiere nach Single
Lu = Lsb / 16 ' schiebe um
4 bit nach rechts und konvertiere nach Single
L = L + Lu ' "MSB" +
"LSB" stellenrichtig addieren
L = L * 0.0012208 ' "eichen"
Dummy = Str(l)
Dummy = Left(dummy , 5) ' auf
sinnvolle Länge bringen
Locate 1 , 1 : Lcd Dummy ' Ausgabe
Waitms 500
Loop
End