Fehler in bus characteristic

Gast #2246904
Lesenswert?

Hallo miteinander,

ich möchte den CO2-Sensor K22_LO am Atmega8 über I2C verwenden.

Im comm-guide vom K22 ist eine Abbildung zur bus characteristic. Die 
zeigt den Verlauf SDA. Dieser stimmt nicht mit dem am Ossi gemessen 
überein.

Warum zieht der Master SDA nicht wieder runter? Woran kann das bitte 
liegen?


Besten Dank vorab!


BASCOM AVR:
$lib "i2c_twi.lbx"
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
$hwstack = 40
$swstack = 32
$framesize = 60
Ddrc = 00001000
Portc = 00001000
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
Config Twi = 100000
Enable Interrupts
Dim X As Byte
Dim Slave As Byte
X = 0
Slave = &H7F
Main:
Do
  Waitms 12
   I2creceive Slave , X
   Print "Error : " ; Err
      Waitms 500
   Print X
Loop
End
Angehängte Dateien:
Gast #2246950
Lesenswert?

Danke Joachim für die schnelle Antwort!

Die Adresse stammt aus dem Datenblatt des Sensors: "Sensor answers on 
data transfers with this address disregarding configured sensor 
address."

Hast du noch eine andere Idee, woran es liegen könnte?
Gast #2246987
Lesenswert?

Klaus schrieb:
> Gib mal als Adresse FE an, da diese bei I2C um ein Bit geschiftet
> verwendet wird.

Der I2C kann da nichts für, wenn BASCOM das so braucht.
Die I2C Adresse hat immer 7-bit (sofern man nicht 10-Bit Bausteine 
verwendet) und wird zusammen mit dem R/W-Bit im ersten Datenwort 
übertragen.
Gast #2246997
Lesenswert?

Willi schrieb:
> Die I2C Adresse hat immer 7-bit


Das ist schon richtig was du schreibst, aber schau Dir mal sein 
Oszi-Bild an dann siehst du dass das erste Bit (bei I2C wird MSB zuerst 
gesendet) auf 0 ist und das RW-Bit auf 1 und das entspricht der addresse 
3f mit gesetzten RW

Gruss Klaus
Gast #2247128
Lesenswert?

Also nochmal kurze Zusammenfassung:
Auf dem Oszi-Bild sieht man dass das erste Bit (bei I2C wird MSB zuerst
gesendet) auf 0 ist und der Rest auf 1.
Das entspricht der Adresse 3f mit gesetzten R/W-Bit.

Ausserdem sieht man auf dem rechten Bild (ev Auszug aus dem Datenblatt) 
dass der Slave auch eine richtige Addresse (die "any-Sensor" Adresse) 
nicht mit einem ACK beantwortet.
Dass ist ein Bruch zur I2C-Konvention!

Ich weiss nicht was BASCOM mit der Slave-Adresse macht, aber zumindest 
scheint die "i2creceive" Routine nicht zu funktionieren.

Ein Ausweg ist vielleicht es zu Fuss zu machen wie in Beispielen
vorgemacht:

    I2cstart
    I2cwbyte &HFF     Adresse mit gesetztem R/W zum Lesen des nächsten 
Byte
    I2crbyte X, NACK
    I2cstop

Vielleicht mach dann auch das fehlende ACK-Bit keine Probleme !!??

Gruss Klaus
Gast #2247886
Lesenswert?

Ich habe jetzt die "default-adress" gewählt. Der Sensor antwortet, indem 
er die SCL (siehe neuer Anhang) nach unten zieht, um zu messen.
Mein neues Problem besteht darin, dass die SCL aber nicht mehr High wird 
und somit die Datenübertragung stattfnden kann.

Vorschläge?


$regfile = "M8def.dat"
$crystal = 3686400
$baud = 9600

$lib "i2c_twi.lbx"

Config Scl = Portc.5
Config Sda = Portc.4

Dim B1 As Byte , B2 As Byte
Dim W As Word At B1 Overlay
W = 0

I2cinit
Config Twi = 50000

Dim B As Byte , X As Byte

Do
  I2cstart
  I2cwbyte &B11010001
  I2crbyte B2 , Nack
  I2cstop
  Print "Error : " ; Err
  Print "received A/D : " ; B2
  Waitms 500
Loop
End
Angehängte Dateien:
Gast #2248098
Lesenswert?

Hallo

Das ist ja schon ein aussergewöhnliches Ding.
Ich glaube du kommst bei den Anforderungen nicht um eine 
Assembler-Routine herum bzw. um eine Eizelansteuerung der Port-Pins.

Dass bei einer "broadcast address" kein ACK kommt ist im Rahmen.
Auch dass der Slave den CLK Impuls verlängern darf ist bei I2C 
vorgesehen.
Dass er dies aber 40msec lang macht bis er seinen Wert fertig hat, das 
denke ich, erwartet keine Standard-Software.

Ob BASCOM überhaupt mit vom Slave verlängerten CLK-Impulsen umgehen kann 
weiss ich nicht. Da bin ich überfragt!!!

Gruss Klaus

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren