PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2Csend Problem



infosystems
02.07.2006, 07:42
Hallo Jungs,

ich komme da echt nicht weiter.
Ich spreche den PCF8574 über I2C als Ausgang an.
Der PCF ist doch mit Latch am Ausgang, der sollte sich doch das Gesendete merken.
Warum tut er das nicht?

Mit Do Loop ist es keine Lösung. Nachdem ich mehrere (n) PCF's anspreche, steht da das Signal nur den n'ten Teil der Zeit an.

Hier erst mal den Code:



$regfile = "m16def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 7372800
$baud = 9600


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



'Daten über I2C an die Anzeigen senden
'Do
I2csend &B1001110 , &B01111111
'I2csend &B1001100 , &B01111111
'I2csend &B1001010 , &B01111111
'I2csend &B1001000 , &B01111111
'Loop

End

Vielen Dank

Rici

tobimc
02.07.2006, 09:30
HI!

Mach mal
$framesize = 32 '64
$swstack = 32 '50
$hwstack = 32 '50
alles größer...

Wenn deine Adressen stimmen, sollte es schon so gehen, ich glaube nur, dass der prozzi sich verhaspelt, wenn du zu kleine Frames und Stacks hast, insbesondere, weil du einen SW-I²C benutzt.

Wenn das nicht hilft, Adresse überprüfen (schreiben, lesen) und sonst mal mit i2cwbyte probieren.

VLG Tobi

PicNick
02.07.2006, 09:31
Seltsam. Wie hast du denn die Outputs vom PCF beschaltet ?

tobimc
02.07.2006, 09:41
Hi

:idea:
Hast du Pullups an SDA und SCL?

Wenn alle (BASCOM-) Stricke reißen, kannst du immernoch den Hardware-TWI des M16 benutzen.
Ist allerdings etwas komplexer anzusteuern.

VLG TS

linux_80
02.07.2006, 10:44
Mahlzeit,
Wenn man unter Bascom beim Master die Hardware benutzen will reicht es diese Zeilen einzufügen:


$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
' und
Config Twi = 100000 ' wanted clock frequency


die anderen Configs kann man dann weglassen, denn die Pins sind da ja festgelegt.

PicNick
02.07.2006, 11:15
Versuch auch mal
I2Cwbyte 'adresse'
if err = 0 then I2Cwbyte daten

Ob der PCF sich überhaupt angesprochen fühlt

bzw. bei der HW-TWI: if TWSR = &H18 ( adresse acked)
und nacher if TWSR = &H28 ( data acked)
Insbesondes das Soft-"I2csend" von Bascom ist etwas schlampig mit den Ack's und nack's

infosystems
03.07.2006, 21:28
Hallo,

ich verstehe es wirklich nicht mehr.
Ich versuche es jetzt mit HW-TWI



$regfile = "m16def.dat"
$framesize = 64
$swstack = 50
$hwstack = 50
$crystal = 7372800
$baud = 9600


'Config Scl = Portc.0 'Ports fuer IIC-Bus MEGA16 bei Software I2C
'Config Sda = Portc.1 'Ports fuer IIC-Bus MEGA16 bei Software I2C


$LIB "I2C_TWI.LBX"
CONFIG TWI = 100000

I2cinit
I2cstart




'Waitms 1000


'Daten über I2C an die Anzeigen senden
'Do
I2csend &B1001110 , &B01111111
'I2csend &B1001100 , &B01111111
'I2csend &B1001010 , &B01111111
'I2csend &B1001000 , &B01111111
'Loop

End

Die PCF's werden angesprochen. Wenn ich alles über die DO-LOOP Schleife laufen lasse, so funktioniert es. Ich möchte aber die Ausgänge der der PCF setzen und danach mit dem Programm weitermachen. Die sind doch latched. Warum geht das nicht. Ohne die Schleife werden die Ausgänge kurz auf 1 gesetzt und danach sind sie wieder auf 0.
Die Hardware ist folgendermaßen: nach dem PCF liegt ein ULN2003, danach ein einige LED's in Reihe, und letztendlich ein Vorwiderstand, alles auf +15V. Das sollte doch OK sein. Die Pullups an SDA und SCL sind eingebaut.
Meine Bascom Version ist: 1.11.8.1

Habt Ihr noch irgend eine Idee???

Viele Grüße

Richard[/code]

linux_80
03.07.2006, 23:04
Lass' mal das I2Cstart weg, das braucht man bei I2CSend nicht !
I2CInit reicht, und dann nur noch mit I2Csend die Bytes senden.

Mit "Print Err" kannst Du einen Fehlerstatus am Terminal ausgeben.
Sollte 0 sein wenns geklappt hat.

infosystems
05.07.2006, 21:04
Hallo,

scheinbar habe ich doch ein HW Problem.
Habe nun einige Beispiele aus dem Internet durchgetestet. Es ist immer so: Der Ausgang wird gesetzt, in kurzer Zeit aber wieder zurückgesetzt. Selbst das Beispiel von der Roboterseite "I2C Relaisplatine RNREL 1.0" funktioniert nicht. Ich verwende den PCF8574P. Habt Ihr noch eine Idee wo ich suchen sollte? Die Relais (hier LED's blinken nur ganz kurz auf, also nicht wie im Programm angegeben 2 Sekunden).


$regfile = "m16def.dat"
$framesize = 64
$swstack = 50
$hwstack = 50
$crystal = 7372800
$baud = 9600

Declare Sub Rnb_relaisschalten(byval Relaisnr As Byte , Byval Status As Byte)

'Const Relaisport_adr = &H76 'I2C Adr PCF 2

Const Relaisport_adr = &B1001110
Dim Relaisstatus As Byte
Dim I As Byte

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


I2cinit
Wiederhole:
For I = 0 To 7
Call Rnb_relaisschalten(i , 1) 'Relais i so anziehen

Wait 2 'Warte 2 Sekundne
Call Rnb_relaisschalten(i , 0) 'Relais i soll abfallen
Wait 2 'Warte 2 Sekundne
Next I
Goto Wiederhole

'Die Hilfsfunktion erleichtert das ein und Ausschalten bestimmter Relais
'Variable: Relaisnr ( 0 bis 7) steht für ein bestimmtes Relais
'Variable: status (1 oder 0) schaltet Relais ein oder aus
'Bei Status 1 wird die entsprechende Relais anziehen, bei 0 abfallen


Sub Rnb_relaisschalten(byval Relaisnr As Byte , Byval Status As Byte)
Relaisstatus.relaisnr = Status

I2cstart
I2cwbyte Relaisport_adr 'Schreibbefehl an PCF schicken
I2cwbyte Relaisstatus 'Datenbyte an PCF
I2cstop
End Sub
End

Viele Grüße

Richard

linux_80
05.07.2006, 23:00
Also bei mir geht das,
getestet mir einem RN-Control (M32, 16MHz)

Ich hab allerdings nur 4 LEDs dran, aber die laufen schön der Reihe nach durch.
https://www.roboternetz.de/wissen/index.php/Bild:I2C_PCF8574_RN-Control.jpg

Edit:
was hast Du an Hardware sonst so zusammengebaut ?

infosystems
04.08.2006, 05:52
Hallo

ich bin wieder da (Urlaub). Nun versuche ich es weiter.

Die Software ist scheinbar in Ordnung. Das Problem ist bei der Hardware.

wenn ich über den PCF8574 nur einen Eingang des ULN2003 ansteuere, da funktioniert alles wunderbar, einzig die Spannung am Ausgang des PCF (also auch am Eingang des ULN bricht auf 1,7 V zusammen. Bei Ansteuerung des 2-ten Eingangs welcher laut Schaltplan parallel liegt, da bricht diese Spannung auf 0,7 V zusammen und vom ULN wird selbstverständlich eine logische 0 verstanden. Wie könnte ich das in Griff bekommen? Woran liegt es eigentlich??

Vielen Dank und Viele Grüße aus Nürnberg

Rici

infosystems
04.08.2006, 05:58
Hier noch der verwendete Code


$regfile = "m16def.dat"
$framesize = 64
$swstack = 50
$hwstack = 50
$crystal = 7372800
$baud = 9600



Const Relaisport_adr = &B1001110
Dim Relaisstatus As Byte 'I2C Adresse.
Dim I As Byte

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


I2cinit

I2cstart
I2cwbyte Relaisport_adr 'Schreibbefehl an PCF schicken
I2cwbyte &B11111111
'Datenbyte an PCF
I2cstop
End


Gruß / Rici

Michael
04.08.2006, 15:08
Hallo infosystems,

Das Problem ist bei der Hardware. ...
...einzig die Spannung am Ausgang des PCF (also auch am Eingang des ULN bricht auf 1,7 V zusammen....Woran liegt es eigentlich?? der ULN ist ein Transistorarray. Zum Schalten wird ein geringer Basisstrom benötigt.
Der PCF8574 (RTFM) liefert aber ohne Pullup-Widerstand nur 100µA am Ausgang.
Der GND des Treiberbausteins sollte auch angeschlossen sein.

Gruß, Michael

repi64
04.08.2006, 16:09
Jo,
der PCF8574 hat keinen Push/ Pull Ausgang.
Du brauchst also Pullup Widerstände am Ausgang des PCF und somit eingang des ULN.
Dies kann aber unerwünschte Zustände zur Folge haben, wenn die Schaltung eingeschaltet wird.
Solange der PCF keine Daten bekommt, sind die Outputs High und somit die Verbraucher am ULN an.

infosystems
09.08.2006, 09:27
Hallo,

ich habe nun 10k Widerstände als PUL-UP geschaltet. Das scheint so zu funktionieren.

10 K Widerstände sollten doch passen, oder?

Viele Dank für eure Hilfe

Gruß

Richard

repi64
10.08.2006, 21:12
10k hören sich recht gut an. 4,7K wären auch nicht schlecht.
Ansonsten messe mal die Spannung im High Zustand am ULN Eingang.
Die sollte nicht zu weit weg von 5V sein. Also über 4,5V.

Millenniumpilot
11.08.2006, 07:36
Hallo,


Dies kann aber unerwünschte Zustände zur Folge haben, wenn die Schaltung eingeschaltet wird.
Solange der PCF keine Daten bekommt, sind die Outputs High und somit die Verbraucher am ULN an.

genau dies hat mich schon immer am der RN-Relais - I2C Relaisplatine gestört. Läst sich dies mit einer kleinen, ich sage mal "Reset-Zusatzschaltung" oder ähnlichem beheben?

Gruß Dirk

infosystems
11.08.2006, 18:21
Hallo,

ich glaub jetzt hab ich das nächste Problem...

Mein ULN 2003 wird richtig warm, ich glaub ich überfordere das Teil.

Wenn alle Ausgänge mit 20 mA belastet werden so ergibt das:

20 mA x 24 V = 0,48 W
7 x 0,48W = 3,36 W

Die Berechnung ist so schon richtig, oder?

Wenn ich nun in das Datenblatt schaue, ja, das ist wohl nichts. Da werden maximal 1,15 W zugelassen.

Welche anderen Treiber sollte ich da verwenden?

Gibt es ander IC's welche eine höhere Leistung vertragen?

Am liebsten würde ich IC's verwenden welche mir auch den Konstanten Strom anbieten. Kennt Ihr irgend was am Markt?

Oder sollte ich eher auf Transistoren umsteigen und eine Konstant Stromquelle basteln? Diese möchte ich aber eher meiden.

Wie würdet Ihr da vorgehen?

Viele Grüße

Richard

molleonair
13.08.2006, 18:47
wieso 20ma x 24V ???

fallen etwa 24V am ULN ab ?? doch wahrscheinlich nicht

infosystems
14.08.2006, 05:48
Aha, da soll ich bei der Berechnung nur die im jeweiligen Schaltzustand an dem ULN anstehenden Ströme und Spannungen annehmen.


Vielen Dank für eure Hilfe.

Rici