Forum: Mikrocontroller und Digitale Elektronik ATmega32 Max127/128 Bascom I2C-Problem


von Marie L. (lendl)


Lesenswert?

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:
1
'**********************************************************
2
'* Test ATMega32 mit AD-Wandler Max 128 über I2C
3
'**********************************************************
4
5
'Config allgemein:
6
$regfile = "m32def.dat"
7
$crystal = 8000000
8
$baud = 4800
9
'Config LCD
10
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
11
Config Lcd = 16 * 2
12
Config Portc = Output
13
Reset Portc.1
14
Initlcd
15
Cursor Off
16
Cls
17
18
'$lib "i2c_twi.lbx"
19
Config Sda = Portd.3
20
Config Scl = Portd.5
21
'Config I2cdelay = 10
22
23
Const Adr_w = &B01010000                                    'Schreibadresse
24
Const Adr_r = &B01010001                                    'Leseadresse
25
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!

von MWS (Gast)


Lesenswert?

1
Const Adr_ctl = 10001000
Hier fehlt ein &b
1
Config Twi = 100000
muss mit der HW TWI verwendet werden, während:
1
Config I2cdelay = 10
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.

von Marie L. (lendl)


Lesenswert?

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?

von Bernd Hübener (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.