mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom I2C Sensor ansprechen


Autor: i2c (Gast)
Datum:
Angehängte Dateien:
  • preview image for 1.jpg
    1.jpg
    115 KB, 369 Downloads

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche in Bascom einen Sensor auszulesen.
Das Datenblatt schreibt zum Auslesen die Sequenz wie im Screenshot vor.

Mein Code:
Do

   I2cstart
   I2cwbyte 84
   I2cwbyte 182
   I2cstop

   I2cstart
   I2cwbyte 85
   Waitms 1
   I2crbyte Highbyte , Ack
   Waitms 1
   I2crbyte Lowbyte , Nack
   I2cstop


   Temp1 = Highbyte
   Temp1 = Temp1 * 256
   Temp1 = Temp1 + Lowbyte
   Temp1 = Temp1 * 0.01


   Print #2 , "Temp: " ; Temp1

   Waitms 500

Loop

Es kommt aber immer nur der gleiche Wert raus (219.729)
Kann mir jemand sagen, was ich falsch mache?

Danke!

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hatte es auch schon so probiert, mit dem gleichen Erfolg. In Highbyte 
steht immer 85 und in Lowbyte immer 213:
Do

   I2cstart
   I2cwbyte &H54
   I2cwbyte &HB6
   I2cstop

   I2cstart
   I2cwbyte &H55
   Waitms 100
   I2crbyte Highbyte , Ack
   Waitms 100
   I2crbyte Lowbyte , Nack
   Waitms 100
   I2cstop


   Print #2 , Highbyte
   Print #2 , Lowbyte

   Temp1 = Highbyte
   Temp1 = Temp1 * 256
   Temp1 = Temp1 + Lowbyte
   Temp1 = Temp1 * 0.01


   Print #2 , "Temp: " ; Temp1

   Waitms 500

Loop

Das Verhalten ist aufgetreten, seitdem der Hersteller folgende Änderung 
hinzugefügt hat:

The I2C hardware module was change with respect to the SCL “latch-up” 
issue. The
modified I2C module will not pull down SCL to signal the master to wait 
for calculation of
data anymore. Therefore the master has to add wait times to ensure that 
the slave will be
able to organize the data.
For standard data transmission (like reading temperatures) 1ms of time 
is sufficient for
the slave to arrange the data.

Kommt Bascom´s i2crbyte damit irgendwie nicht klar?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das jetzt mit der WH I2C Lib ist, würd' ich's mit der Softlib 
versuchen. Möglicherweise war das auch nicht die einzige Änderung des 
Herstellers.

Auch mal Err auswerten und anzeigen lassen, um zu sehen, ob das Lesen 
erfolgreich war.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei dem folgenden Code bleibt Err immer auf 0:
Do




   I2cstart
   Waitms 10
   I2cwbyte 84
   Waitms 10
   I2cwbyte 182
   Waitms 10
   I2cstop

   I2cstart
   Waitms 10
   I2cwbyte 85
   Waitms 10
   I2crbyte Highbyte , Ack
   Waitms 10
   I2crbyte Lowbyte , Nack
   I2cstop




   Print #2 , Highbyte
   Print #2 , Lowbyte

   Temp1 = Highbyte
   Temp1 = Temp1 * 256
   Temp1 = Temp1 + Lowbyte
   Temp1 = Temp1 * 0.01


   Print #2 , Err

   Print #2 , "Temp: " ; Temp1

   Waitms 500

Loop

Mir ist nicht ganz klar, was du mit  WH I2C Lib und Softlib meinst. 
Kannst du mir das erklären?

Danke

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, Buchstabendreher, sollte HW = Hardwarelib heissen.

Wenn explizit die i2c_TWI.lib eingebunden wird, verwendet Bascom die 
Hardwarelib, also die I2C Unit im µC.

Wenn diese Lib nicht eingebunden ist, wird die Softwarelib verwendet.

Ein wichtiger Unterschied: Die HW Lib kann ohne externen Pullups 
betrieben werden, die SW Lib dagegen nicht.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verwende die Software-Lib. Hier ist das gesamte Testprogramm:
$regfile = "m644pdef.dat"
$crystal = 16000000
$hwstack = 128
$framesize = 128
$swstack = 128
$baud = 38400
$baud1 = 9600

Open "COM2:" For Binary As #2

Config Sda = Portd.5
Config Scl = Portd.4

Wait 2

Dim Highbyte As Byte
Dim Lowbyte As Byte
Dim Temp1 As Single

Temp1 = 0


Do

   I2cstart
   Waitms 10
   I2cwbyte 84
   Waitms 10
   I2cwbyte 182
   Waitms 10
   I2cstop

   I2cstart
   Waitms 10
   I2cwbyte 85
   Waitms 10
   I2crbyte Highbyte , Ack
   Waitms 10
   I2crbyte Lowbyte , Nack
   I2cstop




   Print #2 , Highbyte
   Print #2 , Lowbyte

   Temp1 = Highbyte
   Temp1 = Temp1 * 256
   Temp1 = Temp1 + Lowbyte
   Temp1 = Temp1 * 0.01


   Print #2 , Err

   Print #2 , "Temp: " ; Temp1

   Waitms 500

Loop

End

An den SDL und SDA Leitungen hängen jeweils ein 10k Pullup.
Bin ratlos, da ja anscheinend etwas gelesen wird, aber die Werte falsch 
sind und sich auch nicht verändern.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerade noch die Softlib durchgesehen, Err wird dort nur beim wbyte 
berücksichtigt.

I2CInit scheint mir für die Softlib nicht notwendig, aber schaden tät's 
auch nicht. Mach' mal die Kommunikation mit CONFIG I2CDELAY langsamer.

Funktionierte dieser Code bereits mit einem Vorgängersensor ? Gehört der 
Sensor initialisiert ?

Ansonsten, wenn's die Beschaltung zulässt, auch mal testweise die HW Lib 
verwenden.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gerade i2cdelay und i2cinit getestet - keine Änderung.

Der Code funktioniert mit der Vorgängerversion einwandfrei.
Die neuen Sensoren wurden sogar zum Hersteller eingeschickt, dort wurden 
die gerprüft und funktionieren.

HW i2c ist nicht ohne Weiteres möglich :(

Autor: weinbauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Soft-I2C hat nen "bug", das I2Cstart wird als
Restart ausgeführt, warum, das wissen nur die Leuts von
MCS.
Ich hatte da bei anderem Baustein mal meine liebe Mühe.
Kann man nur umgehen indem man die start-condition
quasi manuell programmiert ... bin aber grad am
falschen Rechner um nen Codeschnipsel rauszusuchen.
Könnte daran hängen.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey weinbauer,

wenn du später den Schnippsel raussuchen könntest, das wäre grosse 
Klasse!

Viele Grüße
Alex

Autor: weinbauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit:
wenn Du den ersten I2Cstop raus nimmst könnts schon was werden.
Soweit ichs noch weis war der Restart so, das nochmal stop und dann 
start
gesendet wird.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

gerade getestet - hat keine Auswirkung.
Die alte Revision funktioniert auch ohne das erste i2cstop.
Beim zweiten keine Änderung.

Grüße
Alex

Autor: weinbauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
welcher Baustein ists denn überhaupt?
ggf. steht ja noch was im Datenblatt

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Soft-I2C hat nen "bug", das I2Cstart wird als Restart ausgeführt,
> warum, das wissen nur die Leuts von MCS.

> Soweit ichs noch weis war der Restart so, das nochmal stop und dann
> start gesendet wird.

Das ist Käse.

http://www.i2c-bus.org/repeated-start-condition/

Ein Restart ist einfach ein weiterer Start zwischen Start und Stop OHNE 
ein Stop zu senden. Deshalb wird's in der Lib auch genauso gehandhabt, 
nämlich als normales Start.  Nur die TWI Unit im µC macht intern eine 
Unterscheidung. Da die Softlib aber keine Emulation der TWI Unit 
aufbaut, ist die gesonderte Behandlung des Restart überflüssig.

Hast Du jetzt mal mit z.B. CONFIG I2CDELAY = 20 den Takt auf 50kHz 
runtergesetzt ?

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Hast Du jetzt mal mit z.B. CONFIG I2CDELAY = 20 den Takt auf 50kHz
>> runtergesetzt ?

Ja, ohne Erfolg.

Autor: weinbauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MWS schrieb:
> Das ist Käse.

dann erzähl das mal der C3188 was die dazu meint :o)

Das Datenblatt behauptet die Pullups seien schon integriert,
mach Deine mal weg zum Test. (I2C pull-up resistors are provided on the 
sensor)

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> dann erzähl das mal der C3188 was die dazu meint :o)

Beleg oder Link für die Behauptung ?

Autor: weinbauer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Link? nö, eigene Erfahrung.

probieren geht über studieren :o)

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Link? nö, eigene Erfahrung.
> probieren geht über studieren :o)

Na super... Eigene Erfahrung schlägt natürlich Datenblätter und 
Information aus so "nutzlosen" Weblinks s.o. :-(

Kleiner Auszug aus dem ATM644P Datenblatt:

A special case occurs when a new START condition is issued between a 
START and STOP condition. This is referred to as a REPEATED START 
condition, and is used when the Master wishes to initiate a new transfer 
without relinquishing control of the bus. After a REPEATED START, the 
bus is considered busy until the next STOP. This is identical to the 
START behavior, and therefore START is used to describe both START and 
REPEATED START for the remainder of this datasheet, unless otherwise 
noted.

Ein Stop würde die Kontrolle über den Bus abgeben, das wäre dann 
besagter Käse.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Les' gerade im TSEV01CL55 DB, daß I2C max. 3.6V verträgt und wie schon 
winbauer gesagt hat interne PUp's im TSEV01CL55 vorhanden sind.

Wenn, dann was für PUp's verwendest Du ? Wo angeschlossen ? PUp's sind 
nichte nötig, aber wenn das nicht der einzige Teilnehmer am Bus ist, 
dann musst Du 'ne andere Lösung suchen, d.h. Pegelwandler.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich verwende 10k PullUps auf VCC.
Vom Hersteller habe ich die Info, dass die Internen Pullups ebenfalls 
10k sind.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Also ich verwende 10k PullUps auf VCC.
> Vom Hersteller habe ich die Info, dass die Internen Pullups ebenfalls
> 10k sind.

Falls VCC = 5V ist, dann hast Du hier wahrscheinlich Deinen Fehler. Aus 
dem Datenblatt: Input High Level 2 --- 3.6 ist anzunehmen, daß die PUp's 
intern auf einer niedrigeren Spannung liegen, werden um die 3V sein. Das 
sollte sich an den Eingängen des Sensors messen lassen. Mit PUp's auf 5V 
bringst Du das sehr wahrscheinlich durcheinander.

Und Filth, sei so gut und poste mit richtigem Namen, damit ich mir das 
nächste Mal überlegen kann, ob ich antworte. Ich persönlich mag keine 
Crossposter, siehe MCS Forum. Damit ist diese Antwort auch mein letztes 
Post in diesem Thread.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe die beiden PUs entfernt. Das Verhalten ändert sich nicht. Sprich 
daran liegt es nicht.

Autor: i2c (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade das Ganze auf den HW TWI umgebaut und es läuft.
Also muss es doch ein Bascom Bug sein.

Danke an alle fürs Mitdenken

Autor: Weingut Pfalz (weinbauer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und jetzt könnt ich sagen ...

"isch habs jo glei gsaat" :o))))


also i2c start ist:
'ausgangssituation ist:
set sda
set scl
' start:
nop
nop
nop
reset SDA
nop
nop
nop


stop ist:
'Ausgangssituation
reset SDA
set SCL
'stop
nop
nop
nop
set SDA
nop
nop
nop

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.