Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: I2C Routinen - Das kann doch nicht war sein! Kategorie: C-Control I Micro (von André H. - 28.08.2004 8:18)
 Als Antwort auf Re: I2C Routinen - jetzt aber richtig,Richtig ;-( von JanPeter - 27.08.2004 21:34
JanPeter,

Wie oft soll ich es noch vorkauen !!!

> Man muss ja nicht gleich so ausfallend werden, wie Du!

Da redet der richtige.

> Wenn man mal eine Frage stellt zu einem  Â„Beispiel“ von Dir.
> Ich provoziere gerne Leute im Internet, um festzustellen, mit wem hab ich es zu tun. Das ist
> interessant, wie die Reaktion kommt.

Leicht provozieren ja, aber nicht so !
Hatt' ich doch das Posting von Dir nicht beantwortet. Dann hätte Dietmar mir die Entscheidung
abgenommen und es gelöscht ...

> Wie z.B. mein TOG funktioniert nicht?
> Dann werde ich erst mal auf die niedrigste Stufe gesetzt u.s.w. .
> Vorher hatte ich eine I2C-Routine ins Netz gestellt.
> Das ist so wie beim Angeln, Köder auswerfen und der Fisch beißt.
> Und Du hast angebissen!
> Und Du hast Deine angebliche „Richtige Routine“ ins Netz gestellt.
> Und mich runter gemacht mit : „Du kannst scheinbar keinen Quellcode lesen

Sind wir hier beim Fischen !?
Da Du eben Fehler siehst, wo keine sind, war das nur eine Feststellung.

> So nun zu meiner Entwicklung zum Programmieren.
> Ich habe 1983 mir einen Computer gebaut.
> Mit Z80 u.s.w. . mit Bildwiederholspeicher, Ausgabe am Fernseher und Kassetteninterface, zum
> abspeichern der Programme . Ich Programmierte alles in Maschinensprache.
> Habe mir eigene Spiele für den Fernseher programmiert.
> Und da weiß ich schon was ein TOG ist!

Schön für Dich.
Das sagt aber nicht über Deine C-Control-Kenntnisse aus.


> Was ist da Falsch?
> Du schreibst:
> 1.Fehler            data=&HA0
> Danach              Gosub i2c_start
> Und danach  data=0
>  Gosub i2c_write

Genau das meinte ich, daß Du keinen Quellcode lesen kannst !
Wenn Du Dir mehr als nur die Einsprungmarken in den Routinen angesehen hättest,
hätteste Du unter Umständen bemerkt, daß meine Startroutine gleich das write
für die Bausteinadresse mit drin hat:

'---------------------------------------
#i2c_start 'returns Ack in i
'---------------------------------------
 SDA = 1
 SCL = 1
 SDA = 0
 SCL = 0
'---------------------------------------
#i2c_write 'returns Ack in i
'---------------------------------------
 SDA = data AND &h80
 TOG SCL
 TOG SCL
 for i=1 to 8
  SDA = data AND (&h80 SHR i)
  TOG SCL
  TOG SCL
 next
 DEACT SDA
 TOG SCL
 i = NOT SDA
 TOG SCL
return


Fällt Dir hier irgendetwas auf ?
Ich bin nämlich gewohnt, die Startbedingung immer gleich mit einem Write zu verknüpfen.
Denn nach einer Start-Bedingung wird immer ein Byte, das Adressbyte, geschrieben.
(wenn man von der 10Bit-Adressierung absieht, für die es sowiso fast keine ICs gibt.)
Darum ist es in der Programmierung von I²C-Bus-Routinen fast schon Gang und Gebe
Ein Start direkt mit einem Write zu verknüpfen.
Und genau das ist es, woran Du Dich sicher so aufhängst !

> Du schreibst:
>
> 2.Fehler data = &HA1
>         gosub i2c_start ' repeated start
>        
> schreibe: gosub i2c_stop
> gosub i2cstart
>
> 3.Fehler
> data = &HA1
> gosub i2c_write

Dasselbe, was ich oben mit dem Start geschrieben habe.


> Das ist ziehmlich närflich mit Dir
> Ich habe 3 Tage verschwendet, zur Analyse Deines Programme und bin nicht weiter gekommen.
> Du hast mir 3 Tage in der Programmierung von meinen Programmen gekostet!
> Ich hoffe auf eine Entschuldigung

LOL. Das könnte ich eher von Dir erwarten.(Da wird mir hier sicher jeder zustimmen.)
Übrigens: "nervlich" würde man mit "e" und "v" schreiben, wenn es dieses Wort geben würde.
Aber du meintest sicher "nervig". Wie war das mit dem lesen und schreiben noch gleich ....

Denn die Routinen waren getestet, bevor ich sie ins Forum gestellt hatte.
Ich hatte sie nocheinmal getestet, als Du geschrieben hattest, sie würden nicht funktionieren.
Nun arbeite ich mit diesen Routinen und schreibe Beispiele für meine CCTools-Hardware,
und teste diese immer erfolgreich.
Und Testen heißt bei mir, daß ich diese wirklich auf die Micro lade, die entsprechende
Hardware anschließe und dann das Ergebnis beobachte, und sie mir
nicht nur oberflächlich ansehe, und daraufhin sage wäre ein Fehler ...

Und anbei z.B. das funktionierende Beispielprogramm zu einem DS1631.
Und wenn Du hier jetzt schreibst, es würde nicht funktionieren, dann kann man Dir eben
nichtmehr helfen.

André H.


'-----------------------------------------------------------------
' CCTools I²C-Bus-Routinen für C-Control Mikro
' CCTools 2004 (http://cctools.hs-control.de
'-----------------------------------------------------------------
' Ansteuerungsbeispiel zum Temperatursensor DS1631
'-----------------------------------------------------------------
define SCL PORT[5] ' Pull-Up mit 4,7k bis 10k notwendig
define SDA PORT[6] ' Pull-Up mit 4,7k bis 10k notwendig


define i byte[1] 'temporäres Byte
define data byte[2] 'Byte zur Datenübergabe zu/von I²C-Bus-Routinen

define MSB byte[3]
define LSB byte[4]

define DS1631addr  &b10010000 'Schreibadresse
define DS1631addrR &b10010001 'Leseadresse

baud 9600

gosub i2c_stop ' "Initialisierung" des I²C-Busses

data = DS1631addr
gosub i2c_start
data = &hAC
gosub i2c_write
data = &b1100
gosub i2c_write
gosub i2c_stop

data = DS1631addr
gosub i2c_start
data = &h51
gosub i2c_write
gosub i2c_stop

#loop
 data = DS1631addr
 gosub i2c_start
 data = &hAA
 gosub i2c_write
 data = DS1631addrR
 gosub i2c_start
 gosub i2c_read
 MSB = data
 gosub i2c_readlast
 LSB = data
 gosub i2c_stop
 
 put 12
 if MSB and &h80 then goto negnum
  put &h20
  LSB=((LSB shr 4)*13)/2
  goto endif
 #negnum
  put &h2D
  MSB=128 - (MSB and &h7F)
  LSB=100-((LSB shr 4)*13)/2
 #endif
 print MSB;",";LSB;"°C"

 pause 10
goto loop

'---------------------------------------
'I²C-Bus-Routinen
'---------------------------------------
'---------------------------------------
#i2c_stop
'---------------------------------------
 SDA = 0
 DEACT SCL
 DEACT SDA
return

'---------------------------------------
#i2c_start 'returns Ack in i
'---------------------------------------
 SDA = 1
 SCL = 1
 SDA = 0
 SCL = 0
'---------------------------------------
#i2c_write 'returns Ack in i
'---------------------------------------
 SDA = data AND &h80
 TOG SCL
 TOG SCL
 for i=1 to 8
  SDA = data AND (&h80 SHR i)
  TOG SCL
  TOG SCL
 next
 DEACT SDA
 TOG SCL
 i = NOT SDA
 TOG SCL
return

'---------------------------------------
#i2c_read 'returns Databyte in data
'---------------------------------------
 gosub i2c_sub_read
 SDA = 0
 TOG SCL
 TOG SCL
return

'---------------------------------------
#i2c_readlast 'returns Databyte in data
'---------------------------------------
 gosub i2c_sub_read
 TOG SCL
 TOG SCL
return

#i2c_sub_read
 DEACT SDA
 data = 0
 for i=0 to 8
  TOG SCL
  data = (data shl 1) or (SDA and 1)
  TOG SCL
 next
return


 Antwort schreiben

Bisherige Antworten:

Re: I2C Routinen - Das kann doch nicht war sein! (von JanPeter - 28.08.2004 20:49)
    Re: I2C Routinen (von André H. - 4.09.2004 11:36)
        Re: I2C Routinen (von JanPeter - 6.09.2004 23:21)
            Re: I2C Routinen (von André H. - 7.09.2004 8:27)
                Re: IR-Routine (von JanPeter - 7.09.2004 22:25)
                    Re: IR-Routine (von JanPeter - 7.09.2004 22:32)