PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C klappt nicht mehr nach Umstellung auf bascom 1.11.7.7



norafh
28.12.2004, 14:10
nach der Umstellung von basvom 1.11.7.4 auf Version 1.11.7.7 funktionieren Programme mit I2C Routinen nicht mehr. Hat jemand eine Idee warum

tobimc
29.12.2004, 11:36
HI

Du musst eine Library einbinden Namens: "i2c.lib"
Das machst du so:
...
$lib "i2c.lib"
...

Dann musst du mit
config sda = ...
und
config scl = ...
Die Ports definieren.

Anschließend irgendwo VOR den I²C Geschichten
i2cinit
aufrufen.

Und dann kannst du mittels
i2csend <addresse>, <byte>
Senden, oder mittels
i2creceive <addresse>, <variable>
empfangen.

also:

...
dim var as byte

$lib "i2c.lib"

config sda = portc.1
config scl = portc.0

i2cinit


i2csend &H40, 255
i2creceive &H42, var
...


Hoffe, es funktioniert...

Ganz liebe Grüße,
Tobi

30.12.2004, 10:23
Hallo Tobias,
danke für die prompte und ausführliche Beschreibung.
Ich habe die I2C Schnittstelle mit verschiedenen Bausteinen schon seit einiger Zeit in Betrieb. Einer der Bausteine ist die Uhr PFC8583P
Unter BASCOM AVR 1.11.7.4 lief das ganze auch ohne explizite Angabe von $lib "i2c.lib" und i2cinit. Ich habe diese Anweisungen jetzt in mein Programm aufgenommen und mit BASCOM AVR 1.11.7.7 kompiliert
aber trotzdem gelingt es mir nicht die Uhr richtig zu lesen was unter 1.11.7.4 einwandfrei klappt. Meine Uhr zeigt nur noch FF FF FF an.
Ich nutze einen ATmega16L
Gruss Friedel

tobimc
30.12.2004, 10:38
HI

Ahso. Ich sehe gerade, ich habe auch die .4.
Es kann sein, dass diese Version jetzt den Hardwase TWI unterstützt.
Hast du SDA und SCL an den TWI-Pins des Mega?

Schau mal im Internet. Es kann sein, dass man den TWI jetzt die den UART initialisieren muss.

Da bin ich im Moment überfragt.

Aber MCS haben immer gute Beispielprogramme auf ihrer Homepage.

Wir machen nur gerade einen blöden Ausflug.
Schlittenfahren. Als ob ich nix besseres zu tun hätte...

Liebe Grüße, Tobi

PS: Hast du mal geschaut (mit dem Oszi oder so), ob zum TWI auch was rauskommt?

sebastian.heyn
30.12.2004, 14:53
Hast du mal mit dem oszi geschaut, ob da was rauskommt?

30.12.2004, 21:23
An PC1 hängt die SCA Leitung, an PC0 die SCL Leitung
Es sind kurze Impulse von 5V nach Masse auf den SCA und SCL Leitungen egal ob mit 1.11.7.4 oder 1.11.7.7 kompiliert. Beim Auslesen
z.B des PCF8583P (Uhr) erhalte ich mit 1.11.7.4 laufend neue Zahlen (Uhrzeit) während nach der Kompilierung mit 1.11.7.7 lese ich nur 256 (FF) aus (z.B für die Sekunden)

tobimc
30.12.2004, 21:43
HI

Kannst du 'n Bild davon manchen? Wär sehr aufschlussreich... :D
(Möglichst SDA und SCL untereinander, möglichst bei DIV = 2V und 50µs

So in der Art:
http://www.drschlegel.de/tobias/PublicData/SEND1.jpg
(Beispiel, wie das Signal aussehen sollte...)
)

Oder alternativ:
Zeigen sich Start- und Stopbedingungen?
Ist es ein normales I²C-Signal (Wie auf dem Bild oben?)?
Sehen die Signale von .4 und .7 unterschiedlich aus?
Wenn ja, welche Unterscheide?

Es ist möglich, dass du vor und nach deine I²C-Kommandos
i2cstart
und danach
i2cstop
aufrufen musst. Ist aber eher unwarscheinlich!


Ich habe gerade ein ähnliches Spielchen mit einem 24C64...
Wert = 255... :D
(Muss die Sache demnächst (morgen) mal unterm Oszi abchecken...
Das Problem ist aber glaub' ich eher, dass ich das C64 falsch ansteuere...;))

Ganz liebe Grüße,
Tobi

30.12.2004, 22:19
Hallo Tobias,
die Signale habe ich mit einem Logiktastkopf gemessen, ich kann nur erkennen Hi Low und Übergang von Hi nach Low. Aber ich habe auch einen 24C256 in meiner Schaltung. Dort schreibe ich mit dem alten Compiler eine Zahl x hinein und kann sie auch wieder auslesen. Mit dem neuen Compiler lese ich immer 255 aus egal was ich rein schreibe. Ich glaube daher nicht daß Du den C64 falsch ansteuerst.
Ich bin mal gespannt was dein Oszi bei deinem 24C64 sagt.
Liebe Grüsse aus Mainz
Friedel

tobimc
30.12.2004, 22:39
Hi

Oho! Wieviele KBs hat das 256? Ist das zum 24c64 pinkompatibel?

Könntest du mir deinen Quellcode zum 24C256 schicken?? (Wär' echt super!)
Mich hat das Datenblatt etwas verwirrt...
Ich bin guter Dinge, dass der I²C funzt... ich denke, dass da igendein Fehler drin ist...

Achso. Logiktastkopf...
Hm.

Ich glaube nämlich, dass bei dir letztendlich kein gescheites I²C-Signal hinten rauskommt.
War bei mir auch so.
Wie könnte man das rausfinden?

Ganz liebe Grüße aus Bad Schussenried (;))
Tobi

darwin.nuernberg
31.12.2004, 00:23
Ich habe von Frank erfahren, dass mit der I²Clib was nicht passen soll bzw. dass da ein Fehler drin steckt.

Probiers mal mit Deiner alten version oder schau mal nach ob es die jetzt bei mcselec im download gibt.

Frank
31.12.2004, 02:07
Hi Darwin,

so hab ich es nicht gesagt, da hast du mich etwas missverstanden. Ich meinte in der I2C Lib bei der Version 1.11.7.4 war ein Bug. In der brandneuen Version sollte diese eigentlich korrigiert sein.
Ich hab die neue version aber noch nicht getestet, da die Vollversionen noch nicht als Update bereitstehen. Hoffe kommen auch bald.
Ich nehme aber mal an das in der neuen version auch der Hardware I2C-Bus unterstützt wird. Eventuell ist da unter den Optionen ein Schalter wo zwischen Soft- und Hardware I2C umgeschaltet werden kann. Bedenkt das der Hardware I2C immer auf ganz bestimmten Leitungen liegt.

31.12.2004, 13:57
ich habe die alte i2c Lib nach bascom 1.11.7.7 kopiert, compiliert und schon klappts.
Allen vielen Dank und ein Gutes Neues Jahr

tobimc
31.12.2004, 14:09
HI

Na dann!

Liebe Grüße und guten Rutsch!; Tobi

Frank
31.12.2004, 15:53
Das kann aber nicht Sinn der Sache sein. Die neue Lib sollte viel leistungsfähiger sein. Ab besten nochmal checken ob nicht doch irgendwoanders das problem liegt - z.B. wie schon gesagt bei der Konfigurierung!

tobimc
31.12.2004, 17:43
HI

Also ich habe gerade festgestellt, dass mein Mega auch kein I²C Signal rausschickt.
Ich habe mir schon die neue i2c.lib runtergezogen.

Gibt es denn keinen Standard, wie man das macht?
Oder unterstützt die neue Lib auch den Hardware TWI?
Welche 'Schalter' muss man denn umlegen?

Mein Quellcode:

$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000
$lib "i2c.lib"


Beep Alias Portd.2


Config Sda = Portc.1
Config Scl = Portc.0

Const 24c64 = &B1010_0000


Dim Var As Byte



I2cinit


Do

Sound Beep , 300 , 100


Print "Beginne mit EEPROM-Experiment 1."
Print "Lese aus 24C64!"


I2csend 24c64 , 1
I2csend 24c64 , 1
I2creceive 24c64 , Var


Print "Ergebniss: " ; Str(var)


Sound Beep , 500 , 500

Var = 123

Print "Beginne mit EEPROM-Experiment 2."
Print "Schreibe in 24C64!"

I2csend 24c64 , 1 , 1 , Var

Print "Fertig. Ich schrieb: " ; Str(var)




Sound Beep , 300 , 1500

Loop


End

Es geht mal nicht um das 24C64, sonder allgemein: Es kommt zu portc.0 und portc.1 NIX raus.

Was mache ich denn falsch?

Ganz liebe Grüße und ruten Rutsch,
Tobi

PS:
Ich habe noch die 1.11.7.4.
Meine PullUps sind Metallschicht mit 4,7kOhm.

darwin.nuernberg
01.01.2005, 12:24
Erstmal, ein gesunes neues... (hicks) ;-)

Ich hatte ähnliche Probleme, welche zwei Ursachen hatten:

1. Nachdem ich, wie von Frank empfohlen, auf SCL und SDA jeweils einen 10k pullup Widerstand (nach VCC) geschaltet habe gings.
2. Außerdem solltest Du prüfen, ob das JTAG in den Configurration & Fusebits ausgeschaltet hast (da habe ich auch lange dran gesucht bis ich drauf kam)

tobimc
01.01.2005, 12:33
HI

Auch erst mal ein frohes neues Jahr!

Das JTAG ist ausgeschaltet.

Ich habe irgendwo gelesen, dass Phillips im I²C-Standard
empfohlen haben soll, 4,7kOhm zu nutzen.

Übrigens: Netter Avatar. Ist das Sony?

Liebe Grüße, Tobi

darwin.nuernberg
01.01.2005, 12:35
Das kann aber nicht Sinn der Sache sein.

Da hat du recht, aber für's erste hat es doch geholfen,
und es funktioniert, bis weitere Erkenntnisse / Dokumentation zur Verfügung stehen.
ODER?

Klar ist das nicht so sauber und vermutlich auch nicht im Sinne des Erfinders, doch was will man machen wenn es keinen (momentan) anderen Weg gibt, welcher auf die Schnelle zum Ziel führt. In der Konsequenz muss man anmerken dass durch solche Versäumnisse auch die 'schlechten' Programme erzwungen werden, von denen man dann immer hört. Die, welche einwandfrei arbeiten 'kratzen keine alte Sau'.

darwin.nuernberg
01.01.2005, 12:39
Übrigens: Netter Avatar. Ist das Sony?
Ich glaube schon, ist auf jeden Fall von der Page.

Ich Arbeite mit den 10 Kilo's und es funktioiert (bisher) problemlos.

Guckst Du Da:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=5601

tobimc
01.01.2005, 12:42
HI

Hm. Ich guck' mal. Ich bau mal schnell andere Widerstände ein...
Meinst du das hilft?

Liebe Grüße, Tobi

darwin.nuernberg
01.01.2005, 13:00
HI

Hm. Ich guck' mal. Ich bau mal schnell andere Widerstände ein...
Meinst du das hilft?

Liebe Grüße, Tobi

Ich glaube nicht.
Meiner Meinung dürfte der Pegel auch so passen, Wichtig erscheint mir, dass im HI die VCC anliegt und dass bei Low ein sauberes GND anliegt. Ob das jetzt 10k oder 4,7k sind wirkt sich zunächst auf die Stromaufnahme aus. Wenn deine Chips daran keinen schaden genomen haben (davon gehe ich aber nicht aus (5V/4,7k = ~ 1mA und 5V/10k = 0,5mA = 100 uA). Mit Deiner 4,7k Variante könnte sogar die Leitung etwas länger ausfallen und dürfte gegen Störstrahlung (induktiv) besser geschützt sein.

tobimc
01.01.2005, 13:16
Hi

Hast recht.
Mit den 10K geht's auch nicht besser.

Aber an was liegt's dann?

Ich mach gerade einen Porttest.

Liebe Grüße, Tobi

darwin.nuernberg
01.01.2005, 13:33
Ob das jetzt 10k oder 4,7k sind wirkt sich zunächst auf die Stromaufnahme aus.


Ich habe gerade mal in 'nem schlauen Buch nachgesehen...

"I²C-BUS angewandt" vom Elektor Verlag (ISBN 3-92851-71-7):
Da sind sogar 'nur' 3,3k Widerstände auf der Leitung.

Also kann man Entwarnung geben, Du scheinst da ein anderes Problem zu haben.

Übrigens wird in dem Buch auch ein I²C Tester vorgestellt, welchen ich NATÜRLICH nicht nachgebaut habe. Könnte aber ein Hilfreichers Werkzeug sein.
Das Teil hat nur einen Haken, man braucht einen GAL, welcher programmiert werden muß und der Source dazu ist nicht abgedruckt und die beiliegende Dikette hab ich verschlampt, galube aber nicht dass da der Source dabei war. so muß man den Chip wohl kaufen, oder besser das ganze Teil (als Bausatz) von elektor beziehen.

tobimc
01.01.2005, 13:39
HI

Ich habe gerade ein Beispielprogramm von BASCOM aufgespielt.
UND DAS HAT TADELLOß FUNKTIONIERT!!!

*kriesekrieg*

Ich glaube, ich bin dem Fehler auf der Spur.

Liebe Grüße, Tobi

darwin.nuernberg
01.01.2005, 13:51
Hi

Hast recht.
Mit den 10K geht's auch nicht besser.

Aber an was liegt's dann?

Ich mach gerade einen Porttest.

Liebe Grüße, Tobi

In so einem Fall, erst 'amal' tief Luft holen,
Bestimmt hat du dich Verfranzt oder einer Deiner Chips ist TOT (dann hat Du äben päch gehäbt).

Erst mal Kaffee trinken (und falls süchtig eine rauchen) erst dann:

Check nochmal ab ob du die richtigen Pins abgreifst (Ohmisch Messen nicht gucken!).
(SCL = PC0 = Pin 22 (mega32) und SDA = PC1 = PIN 23 (mega32))
und ob Dein Prog richtig eingestellt ist:


Config Scl = Portc.0 ' Ports fuer IIC-Bus
Config Sda = Portc.1

I2cinit ' I2C - BUS initialisieren

Und dann die Verbindung 1:1 (SCL auf SCL sowie SAD auf SDA und Masse nicht vergessen)

darwin.nuernberg
01.01.2005, 13:56
HI

Ich habe gerade ein Beispielprogramm von BASCOM aufgespielt.
UND DAS HAT TADELLOß FUNKTIONIERT!!!

*kriesekrieg*

Ich glaube, ich bin dem Fehler auf der Spur.

Liebe Grüße, Tobi

Wie schon erwähnt,
Schau dir mal das Prog an.


I2cinit ' I2C - BUS initialisieren

Es gibt da auch noch I2C start und end Befehle, schau mal in der Hilfe nach und mach mal ein paar ms Pause nach jedem Befehl (waitms 100).

tobimc
01.01.2005, 14:04
HI

Es scheint zu funktionieren.
Allerdings ziemlich lllllllaaaaaannnnggggggssssaaaaammmm.

Ich werde jetzt mal suchen, und finden, welche Anweisung (i2csend oder i2cwbyte) für dieses kleine Wunder zuständig ist...

Liebe Grüße, Tobi

darwin.nuernberg
01.01.2005, 14:20
HI

Es scheint zu funktionieren.
Allerdings ziemlich lllllllaaaaaannnnggggggssssaaaaammmm.

Ich werde jetzt mal suchen, und finden, welche Anweisung (i2csend oder i2cwbyte) für dieses kleine Wunder zuständig ist...

Liebe Grüße, Tobi

Die Geschwindigkeit hat mich auch etwas entsetzt, aber funktioniert hat es.

Man sollte eines bedenken:
Philips hat den Bus zum Steúern von. z.B. Stereoanlagen, Video- und DVD , also AV-Geräten entwickelt (da komt es auf ein paar ms hin oder her nicht an, abder die summieren sich (beachtlich).

Ich lasse mich gerne eines besseren belehren.
Wie schnell kann das denn sein?

tobimc
01.01.2005, 14:43
HI

ES FUNKTIONIERT.
UND ZWAR MIT BEIDEN BEFEHLEN.

-> Aber frag mich nicht, was ich anders gemacht habe!!!

Uff. Und ich dachte schon, das funzt nie mehr...

Aber das funzt immer erst, wenn ich alle technischen Register ziehe,
die mir in dieser Richtung messtechnisch zur Verfügung stehen.

Willst du ein Bild vom Bus sehen?

Ganz liebe Grüße, Tobi

Achso:
Das ist der Aktuelle Quellcode:
(Quick & Dirty)



$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000
$lib "i2c.lib"


Beep Alias Portd.2


Config Scl = Portc.0
Config Sda = Portc.1


Const 24c64 = &B10100001


Dim Var As Byte



I2cinit


Do

For Var = 0 To 5

Sound Beep , 500 , 350
Waitms 250


I2cstart
I2cwbyte 24c64
I2cwbyte 23
I2cstop


Wait 1

Sound Beep , 500 , 500
Waitms 1



Next Var








Sound Beep , 750 , 3000
Wait 1







For Var = 0 To 5

Sound Beep , 500 , 350
Waitms 250

I2csend 24c64 , 255


Wait 1


Sound Beep , 500 , 500

Next Var



Sound Beep , 750 , 3000
Wait 1


Loop



End

darwin.nuernberg
01.01.2005, 15:49
HI

ES FUNKTIONIERT.
UND ZWAR MIT BEIDEN BEFEHLEN.

-> Aber frag mich nicht, was ich anders gemacht habe!!!

Uff. Und ich dachte schon, das funzt nie mehr...

Aber das funzt immer erst, wenn ich alle technischen Register ziehe,
die mir in dieser Richtung messtechnisch zur Verfügung stehen.

Willst du ein Bild vom Bus sehen?

Ganz liebe Grüße, Tobi

Achso:
Das ist der Aktuelle Quellcode:
(Quick & Dirty)



$regfile = "m16def.dat"
$baud = 9600
$crystal = 16000000
$lib "i2c.lib"


Beep Alias Portd.2


Config Scl = Portc.0
Config Sda = Portc.1


Const 24c64 = &B10100001


Dim Var As Byte



I2cinit


Do

For Var = 0 To 5

Sound Beep , 500 , 350
Waitms 250


I2cstart
I2cwbyte 24c64
I2cwbyte 23
I2cstop


Wait 1

Sound Beep , 500 , 500
Waitms 1



Next Var








Sound Beep , 750 , 3000
Wait 1







For Var = 0 To 5

Sound Beep , 500 , 350
Waitms 250

I2csend 24c64 , 255


Wait 1


Sound Beep , 500 , 500

Next Var



Sound Beep , 750 , 3000
Wait 1


Loop



End

Ja,
zeig doch mal.

PS Deinen Code solltest Du auch als 'Tag' einbauen.
{markiere deinen Code von Anfang bis Ende und wähle den Button Code an.} Just for info, dann wirds 1. eindeutig, was dazugehört und 2. wird deine Message übersichtlicher.

tobimc
01.01.2005, 16:23
HI

http://www.drschlegel.de/tobias/PublicData/I2c.jpg

Das Codefenster ist ja schon praktisch. Aber ich finde, es könnte ein bisschen hoher sein.

Liebe Grüße, Tobi

01.01.2005, 17:16
Du kannst das Codefenster doch aufklappen, dann ist es groß

Frank
02.01.2005, 00:51
Na fein das es geht. Wäre mal interessant zu wissen woran´s lag.
Übrigens muss man eigentlich nicht den Befehl

$lib "i2c.lib"

in den Quelltext schreiben. Hab ich noch nie gemacht und ging immer!

tobimc
02.01.2005, 11:41
HI

Ehrlichgesagt - Ich weis nicht worans lag.
Ich hab's angeschlossen, und es ging.
Aber das War am Robby auch so.

Man hat eigentlich nichts wirklich verändert, aber blubb es funktioniert.

Man könnte den Code jetzt mit dem von vorher vergleichen.

Bis auf dass sich die Testprogrammstruktur leicht verändert hat...

Manchmal komm ich mir da ein bisschen verarscht vor... :D

Ganz liebe Grüße, Tobi

tobimc
02.01.2005, 11:44
HI

Der einzige relevantere Unterschied, der mir auffällt, ist,
dass ich im ersten Programm SDA zuerst deklariert habe, im zweiten
SCL zuerst.
Aber daran kanns doch nicht liegen, oder?

Ganz liebe Grüße, Tobi