PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SCL Pin schalten



Xandi11
01.12.2009, 22:18
Hallo erstmal.

Falls ich ein neues Thema eröffnet habe und es schon eines gibt, entschuldige ich mich dafür, aber ich habe irgendwie bei meiner langen Suche nichts passendes gefunden.

Man findet diverse Programme, Codes und sonst was um ein Servo (z.B.) über den SCL Pin zu steuern. Diese ganzen Dinge funktionieren auch perfekt, aber es müsste theoretisch doch möglich sein, den SCL genau so wie die LEDs auf der BasePlatine von LOW auf HIGH zu setzten.
Bei den LEDs kann man ja auch setLed(0b...) verwenden. Es müsste doch so einen ähnlichen Befehl für den SCL Pin auch geben, genau so wie für INT1-3 ... auch wenn diese schon anders verwendet werden.

Gibt es einen so einen Befehl überhaupt???

Ich würde mich sehr über hilfreiche Antworten freuen.

proevofreak
02.12.2009, 09:25
Hallo, ja den gibt es natürlich.

DDRC |= SCL //SCL als Ausgang definieren

PORTC |= SCL //SCL high

PORTC &=~ SCL //SCL low




mfg

Ceos
02.12.2009, 09:51
ist die defintion von SCL irgendwo in der RP6 lib zu finden ?
ich meine dass das so "einfach" nicht funktioniert!

exakt müsste es heissen


DDRC |= (1<<PCn); //SCL als Ausgang definieren

PORTC |= (1<<PCn); //SCL high

PORTC &=~ (1<<PCn); //SCL low


wobei das kleine n durch die pinnummer des SCL pin ersetzt werden muss ... ausserdem gibt das makro PCn (und SCL vermultich auch) nur die bitposition des pins im register wieder, daher muss man eine 1 um n bits nach links schieben um den entsprechenden pin auch anzusteuern ... sonst kommt da nur die binäre darstellung den zahl hinter SCL raus vermutlich

Virus
02.12.2009, 14:53
kann ich scl auch von der m32 aus auf high/low setzen, diese ist ja mit dem scl vom rp6 über den Xbus verbunden?

SlyD
02.12.2009, 15:40
Wenn mehrere Geräte am I2C Bus angeschlossen sind, sollte man diesen üblicherweise auch als I2C Bus verwenden und für nix anderes ;)
Wenn nur ein Mikrocontroller dranhängt ists natürlich egal und man kann mit den Pins machen was man will.


Wenn mehrere Controller am Bus hängen, Du aber auf den Bus verzichten kannst, musst Du sicherstellen das der Pin niemals aktiv auf HIGH geschaltet wird.
Das erledigt der Pullup Widerstand auf dem Mainboard.
Alle am I2C Bus angeschlossenen Geräte schalten nur nach LOW.
Um high pegel zu schalten muss der Pin als EINGANG konfiguriert werden (DDRC Register).


MfG,
SlyD

Virus
02.12.2009, 15:54
gut zu wissen wenn mir mal ein einziger i/0 fehlt

Ceos
02.12.2009, 16:19
moooohment, wenn auf dem board ein pull UP ist, muss man den pin auf ausgang schalten und kann dann auf LOW ziehen ... denn high ist er ja schon!

oder meinst du jetzt statt das PORT register zu bedienen einfach das DDR register toggeln?

also DDRC &= ~(1<<SCL); um den pin (im PORT register steht ne 0) auf high-z zu schalten und das signal vom pullup auf high bringen zu lassen

und DDRC |= (1<<SCL); um den pin auf ausgang und gleichzeitig GND zu bringen (imt PORT steht ja noch 0)und damit das signal auf GND zu ziehen ?!

so müste es gehen ... kenne mich mit dem RP6 schaltplan ja leider nicht aus ^^

SlyD
02.12.2009, 17:01
Das ist nichts RP6 spezifisches - so funktioniert nunmal den I2C Bus.
Es wird nicht aktiv auf high getrieben - das erledigt nur der Pullup der Pin ist dann hochohmig.
Das muss so sein damit mehrere Geräte (vor allem bei Multimaster) am Bus arbeiten können ohne Kurzschlüsse zu verursachen.

Ceos
02.12.2009, 17:04
ja ok klingt logisch ich wollts nur nochmal in code festgehalten und bestätigt haben

damit dann keiner den code ganz oben benutzt und sich damit sein I2C zerschiesst ^^

Xandi11
02.12.2009, 19:02
Danke für euere schnellen Antworten.

Wenn ich Ceos nun richtig verstanden habe dann müsste man den SCL so ansteuern können:

14 Pins --> SCL am 10. Pin

DDRC |= (1<<PC9); //SCL als Ausgang definieren

PORTC |= (1<<PC9); //SCL high

PORTC &=~ (1<<PC9); //SCL low

Stimmt die Zahl nach PC oder ist damit etwas anderes gemein ... werde aus dem PCn nicht ganz schlau!

Ceos
02.12.2009, 22:32
genau das meinte ich, mit dem code zerschiesst man sich den I2C!

wandle es ein wenig ab



PORTC &= ~(1<<PC9); // port auf GND bei output und bei input pullup vopm board

DDRC |= (1<<PC9); // pull down über pin (LOW)
DDRC &= ~(1<<PC9); // pull up vom board (HIGH)


wenn ich das von SlyD richtig verstanden habe !

Xandi11
03.12.2009, 06:59
Ich möchte an den Port einen Transistor anhängen und damit die Beleuchtung, welche ich auf eine Erweiterungsplatine löten möchte, ansteuern bzw. einschalten.

Außerdem ist meine Idee später (wenn das mit der normalen Beleuchtung funktioniert) noch Blinker auf die Platine zu löten und ebenfalls anzusteuern ... und diese dann automatisch bei jedem Programm zu verwenden.

Kann man die obige Ansteuerung eigentlich für jeden Port verwenden?

Ceos
03.12.2009, 09:57
das was ich geschrieben habe muss ich verneinen, das baut darauf auf, dass am board ein sog. pullup widerstand verbaut ist, hier im speziellen fall gehts um die I2C schnittstelle

Xandi11
03.12.2009, 10:22
Heißt das, dass mit dem SCL Pin kein Transistor (vor Transistor ein Vorwiderstand) ansteuerbar ist??

021aet04
03.12.2009, 10:42
Du kannst den SCL Anschluss als normalen Ausgangspin definieren, du kannst dann aber kein I2C mehr verwenden, außer du schließt den Transistor dann ab. Für Erweiterungen würde ich den I2C immer freilassen.
Du kannst am SCL Anschluss einen Transistor anschließen, nur musst du dann den Anschluss nicht mit SCL sondern PC0.

Xandi11
03.12.2009, 12:02
Wie kommt man auf die PC0, im Code zuvor war es PC9.

Jetzt wirds verwirrend ...

radbruch
03.12.2009, 12:15
Versuche mal selbst zu ergründen was PC0 bzw. PC9 bedeutet und was das mit SCL zu tun hat.

SlyD
03.12.2009, 13:47
... wie ich in einem anderen Thread schon gesagt hatte:
Die beste Lösung ist anstatt die I2C Pins direkt zu benutzen, einfach einen Portexpander an den I2C Bus anzuschließen.
Man kann da rein theoretisch 127 Stück mit jeweils 8 Ports anschließen ;)
Es gibt dafür auch AD Wandler, Realtime Clocks, Temperatursensoren, Ultraschallsensoren usw. usf. ...

Xandi11
03.12.2009, 17:20
Kann man solche Portexpander eigentlich fertig kaufen?

SlyD
03.12.2009, 18:44
Da gibts so einige
PCF8574
PCF8591
PCA9554
PCA9555

(google benutzen)

021aet04
06.12.2009, 11:05
Hast du schon herausgefunden warum ich PC0 geschrieben habe? Wenn nicht schau einmal im Datenblatt vom Atmega32 nach. Da stehen die Portbezeichnungen (z.B. PA0-PA7, PB0-7,...) und die Alternativfunktionen in Klammer.

MfG Hannes

Xandi11
06.12.2009, 16:43
Ich habs zwar noch nicht probiert ... aber die Bezeichnungen im Datenblatt habe ich (eigentlich durch Zufall) schon gesehen.

Tja ... manchmal können auch Datenblätter einen Sinn haben :cheesy: :cheesy:

Danke für eure schnelle Hilfe