mikrocontroller.net

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


Autor: Marie L. (lendl)
Datum:

Bewertung
0 lesenswert
nicht 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:
'**********************************************************
'* Test ATMega32 mit AD-Wandler Max 128 über I2C
'**********************************************************

'Config allgemein:
$regfile = "m32def.dat"
$crystal = 8000000
$baud = 4800
'Config LCD
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
Config Lcd = 16 * 2
Config Portc = Output
Reset Portc.1
Initlcd
Cursor Off
Cls

'$lib "i2c_twi.lbx"
Config Sda = Portd.3
Config Scl = Portd.5
'Config I2cdelay = 10

Const Adr_w = &B01010000                                    'Schreibadresse
Const Adr_r = &B01010001                                    'Leseadresse
Const Adr_ctl = 10001000                                    'Control-Byte für AD-Kanal 0


Dim Msb As Byte
Dim Lsb As Byte

I2cinit
Config Twi = 100000

Do

   Cls
   I2cstart
   I2cwbyte Adr_w
   I2cwbyte Adr_ctl
   I2cstop

   I2cstart
   I2cwbyte Adr_r
   I2crbyte Msb , Ack
   I2crbyte Lsb , Nack
   I2cstop

   Locate 1 , 1
   Lcd "msb:" ; Msb ; " " ; "lsb:" ; Lsb

   Wait 1
   Locate 2 , 1
   Lcd "Start"
   Wait 1

Loop

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!

Autor: MWS (Gast)
Datum:

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

Autor: Marie L. (lendl)
Datum:

Bewertung
0 lesenswert
nicht 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:
Do

   Cls
   I2cstart
   I2cwbyte Adr_w
   I2cwbyte Adr_ctl
   I2cstop
      Locate 2 , 1
      Lcd "ERR: " ; Err
      Wait 2
      Cls
   I2cstart
   I2cwbyte Adr_r
   I2crbyte Msb , Ack
   I2crbyte Lsb , Nack
   I2cstop
      Locate 2 , 1
      Lcd "ERR: " ; Err
      Wait 2
      Cls
   Locate 1 , 1
   Lcd "msb:" ; Msb ; " " ; "lsb:" ; Lsb

   Wait 1
   Locate 2 , 1
   Lcd "Start"
   Wait 1

Loop

Irgendwas mache ich wohl noch falsch!
Hat noch jemand eine Idee für mich?

Autor: Bernd Hübener (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.