PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : edit: Brauche Hilfe für I²C Bus System mit Bascom



MiniMax
13.10.2009, 10:49
Hallo Zusammen,
ich brauche mal eure Hilfe:
es geht darum, dass ich an einen ATMega 32 (Hauptcontroller), Schaltsignale (6 Signale) senden Muss. Der andere Controller, der dass Sendet ist auch ein ATMega 32. An ihm hängen nur die 6 Taster und eventuell ein LCD. Das LCD soll vom Hauptcontroller, möglichst gleichzeitig oder mit einer kleinen Verzögerung, gesteuert werden. Ist dass möglich?? Ich habe mir schon jede RNWissen Seite über I²C durchgelesen aber binn nicht schlau draus geworden - und die ganzen HexCodes da drinne ](*,)
Ich hoffe ihr könnt mir Helfen - [-o< [-o< [-o<

MiniMax
13.10.2009, 17:02
keiner ne Idee???

ikarus_177
13.10.2009, 17:41
Hi,

wenn es nur um die zwei Controller geht, wäre wahrscheinlich die UART die bessere Wahl, gleicher Verdrahtungsaufwand wie i²c und in Bascom sehr leicht programmierbar.

Viele Grüße

darwin.nuernberg
13.10.2009, 19:47
BASCOM I2C Master und I2C Slave ist (theoretisch) einfach.

Als erstes mal die Hardware: Stell mal sicher dass Du die 10kR von VCC zu SCL und 10kR von VCC zu SDA angeschlossen hast, sonst geht garnix!!! Den fehler machen viel (hatte ich auch anfangs vergessen).

Im BASCOM Samples gibt es Beispiele (IrgendwoAufDeinemComputer:\Bascom\BASCOM-AVR\SAMPLES\twi)

wichtig ist dass Du vor dem compilieren die die Kostenpflichtige Library von mcselec besorgst (und ich glaube du brauchst dann auch noch die Vollversion von BASCOM).

Frühere Versionen hatten soweit ich mich erinnere eine spezielle LIB, welche vor dem Compilieren die "normle" lib ersetzte.

Dann konnten solange diese, ich nenn sie mal SLVAE-Lib, im Programmverzeichnis vorlag eben nur TWI Slaves compilieret werden.

Nachdem man die original (TWI Master)-Lib wieder zurück kopiert hatte, konnte man wieder "normal" programmieren.

Bis Dato hatte ich noch keinen Bedarf für sowas, aber es wird wohl auch früher oder später der Fall sein.

Es gibt auch diverse Softwarelösungen, welche dann jedoch nicht die volle TWI-Bus Geschwindigkeit nutzen können...


Hoffe das hat Dir ein wenig geholfen, zumindest Licht gemacht.



Hi,
wenn es nur um die zwei Controller geht, wäre wahrscheinlich die UART die bessere Wahl, gleicher Verdrahtungsaufwand wie i²c und in Bascom sehr leicht programmierbar.
Viele Grüße

Wenn nun der gewählte Controller jedoch nur eine Schnittstelle hat, wie die hier verwendeten, bleiben die beiden Controller allein und unter sich, eine PC-Anbindung (RS232/RS485/LAN) wären nicht möglich.

Anders bei ATM64 oder größer, die haben zwei UARTS oder sogar mehr, lassen sich aber nicht so einfach verbauen da höhere Packunsdichte bzw. kleinerer PIN Abstand (PDIP gibts da leider nicht).
Deine Empfehlung bezieht sich also wirklich rein auf zwei Controller, nicht mehr.

Neutro
13.10.2009, 20:01
Wenn du nur Schaltsignale versenden oder empfangen willst dann nehm doch einfach einen PCF 8574 IO Port expander. Die Teile sind relativ einfach anzusprechen auch ohne spezielle LIb.

Gruß

Neutro

darwin.nuernberg
13.10.2009, 20:29
Das war zwar nicht seine Frage, ist aber auch möglich.

Schau mal hier: ApplicationBoard1 für Protobed Mega 16 -32 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=5601)

Den PCF8574 kann man als Eingabe Baustein als auch als Ausgabe Bautein verwenden, auch Mischbetrieb ist möglich...

Neutro
14.10.2009, 17:32
Hast schon Recht das mein Vorschlag nicht das war was er gefragt hatte, aber in einigen Fällen (wie auch in diesem) ist auch ein anderer Lösungsweg möglich. Ich habe mir mal gerade dein Protobed angeschaut, sieht schick aus.

OT: Dein Schrittmotor Protobed habe ich mit einigen Modifikationen anfang des Jahres nachgebaut und auch deine Ätzküvette, funktioniert beides bestens!! Danke hierfür.

Gruß

Neutro

MiniMax
15.10.2009, 10:42
Hallo Zusammen,
danke für die Antworten ! Wie soll ich denn ein Display mit der Free Version von Bascom über I²C oder UART / TWI Ansprechen???


Als erstes mal die Hardware: Stell mal sicher dass Du die 10kR von VCC zu SCL und 10kR von VCC zu SDA angeschlossen hast, sonst geht garnix!!! Kannst du mir einen Schaltplan zeichnen??

Ich verstehe bisher nur Bahnhof! Giebt es denn nicht die Möglichkeit das ganze einfach zu gestalten? Später sollen nochmehr Slaves in den Bus eingebunden Werden!

edit: http://www.rn-wissen.de/index.php/Bascom_I2C_Master
Hier wird doch auch mit der "Normalen" lib gearbeitet???? Oder sehe ich da was falsches

MiniMax
15.10.2009, 16:21
Ist der Beitrag tot???

Bammel
15.10.2009, 16:42
wieso tot? du hast doch heute erst geschrieben?

mit den widerständen ist doch nicht schwer aber ohne die wird der bus nciht funktionieren.

http://www.rn-wissen.de/index.php/I2C

gleich im ersten bild sind die widerstände mit eingezeichnet

MiniMax
15.10.2009, 16:52
danke! Wie Groß sollen die Wiederstände sein? Werden beide gegen Masse Geschaltet????

@Darwin: Habe mir mal den I/O Controller angeschaut und werde mal mit dem Rumexperementieren! Hast du vielleicht einen Codeschnipsel, wie ich den ansteuern kann??? Auch wenn mehrere davon im einsatz (an einem I²C Bus) sind?

021aet04
15.10.2009, 17:56
Widerstände schaltet man auf die 5V. Ich setze 4k7 Widerstände ein. habe aber auch schon 10k gesehen, aber auch weniger. Das hängt soweit ich weiß von der Länge des Busses und von der Taktfrequenz ab.

MiniMax
16.10.2009, 13:19
Danke! Also An beide Leitungen 4k7 Wiederstände gegen VCC Schalten - richtig??? Und wie ist es jetzt mit dem I²C??? Ich möchte gerne den PCF8574 als ein und Ausgabe Modul defenieren? Wie geht das? Und kann ich auch 2 von denen In einem Bus betreiben???

Richard
16.10.2009, 15:21
Wenn nun der gewählte Controller jedoch nur eine Schnittstelle hat, wie die hier verwendeten, bleiben die beiden Controller allein und unter sich, eine PC-Anbindung (RS232/RS485/LAN) wären nicht möglich.



Moin moin.

An der Hardware rs232 hängt bei mir auch der PC, aber unter Bascom
kann man ja (Beliebige (?)) Software Schnittstellen an beliebigen Pin`s
einrichten. Ich habe da schon 2..3 + Hardware rs232 gleichzeitig laufen
lassen.

Gruß Richard

MiniMax
16.10.2009, 15:34
Hi, wie hast du das Gemacht??

021aet04
16.10.2009, 15:37
Beim PCF8574 kannst du bis zu 16 an den I2C hängen. Es gibt den PCF8574, von dem kannst du bis zu 8 anhängen und es gibt den PCF8574A von dem kannst du auch 8 anschließen. Jeder I2C Baustein hat braucht eine eigene Adresse. Beim PCF8574 hast du zusätzlich 3 Eingänge (Pin1-3), damit du die Adresse ändern kannst. Wie du den PCF ansteuern musst solltest du im Datenblatt nachlesen. Wenn du die Anschlüsse als Ausgang nehmen willst musst du den Schreibbefehl nehmen, wenn du die Anschlüsse als Eingänge (z.B. Taster) verwenden willst musst du den Lesebefehl nehmen. Du kannst auch Ein- und Ausgänge mischen, z.B. dass 2 Anschlüsse als Eingänge benutzt werden und die anderen als Ausgänge.

MiniMax
16.10.2009, 15:40
Hi,
also

.... 'der Übliche sempf
$I2CWrite
Wie gehts Weiter??? Ich möchte jetzt z.B. Led 2 einschaltet??? Ich habe bissher alles nur mit Hex codes Gesehen???

Und wie ist dass beim Lesen????

Richard
16.10.2009, 15:52
Hi, wie hast du das Gemacht??


Moin moin.

Steht in den Bascom Beispielen.....


'open channel for output
Open "comd.1:19200,8,n,1" For Output As #1
Print #1 , "serial output"


Gruß Richard

Richard
16.10.2009, 16:06
danke! Wie Groß sollen die Wiederstände sein? Werden beide gegen Masse Geschaltet????

@Darwin: Habe mir mal den I/O Controller angeschaut und werde mal mit dem Rumexperementieren! Hast du vielleicht einen Codeschnipsel, wie ich den ansteuern kann??? Auch wenn mehrere davon im einsatz (an einem I²C Bus) sind?

Moin moin.

Lesen kannst Du aber? Im oben genannten Link sind die Widerstände
doch gegen VCC eingezeichnet? Etwas noch weiter oben wurde
geschrieben das Du 10 k R`s gegen VCC Schalten sollst. Warum liest Du
nicht einfach einmal http://www.rn-wissen.de/index.php/I2C Ordentlich
und komplett durch? Da ist doch alles wichtige beschrieben.

Ein bischen Einsatzwille deinerseits währe schon schön, sich immer "alles"
von anderen vorkauen lassen bingt Dir keinerlei Lehrneffeckt....

Gruß Richard

021aet04
16.10.2009, 16:13
Hier wird beschrieben, wie man den PCF ansteuert https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=50572&highlight= und den Rest sollte man im DB lesen.

MiniMax
16.10.2009, 16:57
Danke - sorry wegen den vielen "vorkau" Fragen - stehe z.Z. ein bissel unter Streß weil ich Am Montag 3 Arbeiten schreibe (Hauptfächer :( )
Habe mir jetzt mal alles Über I²C Durchgelesen und ein paar Fragen sind nun geklärt. Es giebt einen Baustein um Lcd's über I²C Anzusteuern, und den werde ich mal ausprobieren! Mit dem Porterweiterungsbaustein Experementiere ich auch mal rum.

Bammel
16.10.2009, 17:07
das ist der selbe baustein ;)

Neutro
16.10.2009, 17:23
Hier ist noch ein Link in dem genau beschrieben steht wie man einen
PCF ansteuert, ist allerdinge in englisch:
http://www.qsl.net/pa3ckr/bascom%20and%20avr/i2c/index.html

Mfg

Neutro

021aet04
16.10.2009, 17:36
Zum Glück habe ich das mit den Tests und Schularbeiten,... schon hinter mir. Ich bin gerade am Planen von Platinen mit SAA1064 (LED SSG Anzeigentreiber) und PCF8574. In den Links sind die vorläufigen PCBs vom PCF8574 und SAA1064. Die GND Anschlüsse sind frei gelassen, da sie mit der Massefläche verbunden wird. Die Platinen sind 2seitig. Die Masseflächen sind der besseren bersichtlichkeit nicht auf den Bildern zu sehen. Die Platinengröße ist nach RN-Standart.

PCF8574=> http://www.pic-upload.de/view-3395067/PCF8574.jpg.html
SAA1064=> http://www.pic-upload.de/view-3395106/SAA1064.jpg.html

MiniMax
17.10.2009, 10:41
Danke. Englisch ist kein Problem (2+ in der Schule) und notfalls giebt es Babel Fish \:D/

Ich dachte der PCF8574 ist für LED's oder Taster, Relais etc.
und ein anderer Baustein (kp wie der hieß) für die LCD ansteuerung. Oder liege ich da Falsch?

021aet04
17.10.2009, 11:34
Für LCD wird auch der PCF8574 genommen, aber für LED 7Segment Anzeigen wird der SAA1064 genommen, da man für die Leds keine Widerstände braucht und die Helligkeit der Leds einstellen kann. Ein Bild von einer Anzeige mit SAA1064 ist hier
http://gravitech.us/MicroResearch/I2C/I2C-7SEG/I2C-7SEG_1.jpg

MiniMax
17.10.2009, 12:01
Wie kann man den bei dem PCF8574 die Helligkeit Regeln??

021aet04
17.10.2009, 12:09
Beim PCF8574 kann man die Helligkeit der Leds nicht verändern und man braucht eigene Vorwiderstände. Für den SAA1064 braucht man keine Widerstände und die Helligkeit kann man im Programm verändern.

MiniMax
17.10.2009, 14:08
aso!!! und der SAA1064 ist besser als der PCF8574 ????
Ich werde aus der Englischen Seite nicht schlau! I2Cwbyte 255 soll laut erklärung alle Ausgänge auf an Setzten! Aber wie spreche ich z.b. nur Kanal 4 an???

021aet04
17.10.2009, 14:37
Man kann nicht sagen, dass der SAA besser ist als der PCF, weil die Ics unterschiedliche aufgaben haben. Der SAA1064 ist rein für Siebensegmentanzeigen und der PCF8574 ist ein Porterweiterungsbaustein.

MiniMax
17.10.2009, 16:33
ok! naja werde mir mal die Englische Seite heute Arbend durch lesen !

Neutro
17.10.2009, 16:54
I2Cwbyte 255 setzt alle Ausgänge des PCF auf HigH weil 255 dezimal ist und Binär 1111 1111 entspricht. Einfacher und übersichtlicher ist es die Binär Schreibweise zu nehmen, dann lautet der Befehl I2Cwbyte &B11111111. Jede 1 steht für einen ausgang auf High, willst dur nur jeden zweiten Ausgang setzen musst du schreiben I2Cwbyte &B10101010 usw. Der vollständigkeit halber sei noch erwähnt das es auch noch die Hexadezimale schreibweise gibt, dann würde ein Befehl der jeden zweiten Ausgang auf high setzt I2cwbyte &H55 oder invertiert i2cwbyte &HAA.
Einfach mal experimentieren.

Gruß

Neutro

MiniMax
17.10.2009, 17:47
Und wie komme ich auf die Hexadezimal bzw. dezimal befehle? Und wenn ich z.B. nur den 3. Ausgang auf on Setzen möchte heißt dass dann: I2Cwbyte &B00100000 ?????

021aet04
17.10.2009, 18:09
Nicht ganz, da es so aussieht P7|P6|P5|P4|P3|P2|P1 Das bedeutet wenn du den 4ten Ausgang setzen willst musst du 00001000 senden. Wenn du von Binär in Hexadezimal umrechnen willst ist das relativ einfach. Du solltest schauen, dass du immer 8 Ziffern hast. Wenn du weniger hast füllst du auf der linken Seite die Stellen auf bis du die 8 Ziffern hast. Wenn du die 8 Ziffern hast teilst du es in 2x4Ziffern auf (in der Mitte teilen). Auf der rechten Seite von den 4 Ziffern hast du 1, die 2te Stelle ist 2, die dritte Stelle ist 4 und die 4te Stelle ist 8. Überall wo du eine 1 hast zählst du die Werte zusammen. Die Ziffern von 0 bis 9 entsprechen den Zahlen von 0 bis 9. Von 10 bis 15 fängst du mit "A" an. 15 wäre "F". Als Beispiel der Ausgang 3 setzen.

in Binär

00001000

Aufteilen in 2x4 Ziffern

0000 1000

die Wertigkeit der einzelnen Stellen

8 4 2 1 8 4 2 1
0 0 0 0 1 0 0 0

Das Ergebnis

Die ersten vier Ziffern (4x0)

0x8+0x4+0x2+0x1=0

und den 2ten 4 Ziffern

1x8+0x4+0x2+0x1=8

Als Ergebnis kommt heraus

Hex 08

darwin.nuernberg
17.10.2009, 22:18
Noch etwas genauer:
Es gibt unterschiedliche Zahlensysteme.

Wir als Menschen haben 10-Finger daher rechen wir von 1 bis 10, so wie wir es gewohnt sind. (Gut es gibt auch Menschen mit 11 oder mehr Fingern, die zählen (gelten) aber nicht).

Der Computer (konnte) nur 8-Bit und die lassen sich eben kürzer als Hexadezimalzahlen schreiben.

Das dezimale Zahlensystem hat Ziffern von 0 bis 9 (0123456789) Maximum = 9 danach erfolgt ein Übertrag
Das binäre Zahlensystem hat nur die Ziffern 0 oder 1 (01) Maximum = 1 danach erfolgt ein Übertrag
Das hexadezimale Zahlensystem hat die Ziffern von 0 bis F (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) Maximum = F danach erfolgt ein Übertrag

Binär:
Ein Byte besteht aus 8 Bit (ist ja bekannt oder)

Das niedrigste Bit ist rechts und wird Bit 0 genannt, von rechts nach links (also so <--- rum) haben wir dann Bit0, Bit1, Bit2,... bis Bit7 (das ist dann das achte Bit, da man mit 0 begonnen hat).
(Das ist jetzt echt saublöd zum darstellen, da wir ja von links nach rechts schreiben)

Jedes Bit entspricht einem Wert (Tabelle) von 2^n (2HOCHn) wobei n die Bitnummer ist (Probiers mal mit dem Taschenrechner aus)

Noch einfacher ist es mit dem Windows-Taschenrechner, schalte auf Wissenshaftlich um, stelle auf DEZ geben deinen Wert ein und schalte dann auf BIN oder HEX. Das geht auch in alle anderen Richtungen (Zahlenformate), ganz wie du willst.

Hexadezimal:
wenn man nun ein Byte in der mitte Teilt erhält man zwei Nibble(s)
Mit 4-Bit kann man von 0-15 Zählen oder in HEX 0..F (wie von 021aet04 beschrieben)

So nun nimmt man einfach das untere Nibble und notiert dessen wert (4-Bit) und das gleiche macht man mit dem oberen Nibble, wobei man wieder mit 0 beginnt und nicht dem Wert wie er an dieser Stelle gelten würde (der richtige Wert ergibt sich automatisch durch den Übertrag).

Siehe Da:

170dez = 10101010bin = AAhex

Name Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
Wert 128 64 32 16 8 4 2 1
Formel 2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0 (2^0 = 1)




Beispiel
Binär 1 0 1 0 1 0 1 0 = 10101010 bin
Dez. 128 + 0 + 32 + 0 + 8 + + + 2 + 0 = 170 dez
Hexadez. A (10dez) A (10dez) = AA hex

In so ziemlich jeder Programmiersprache kann man die Werte in der gewünschten Notation schreiben.
Voraussetzung ist nur dass man dem Compiler/Interpreter vorher sagt was das da nu sein soll, da der Quelltext "normalerweise" alle werte als dezimalzahlen interppretiert, wenn da jetzt auf einmal 10101010 stehen würde, könnte der Compiler dies als "Zehnmillioneneinhunderteinstausendundzehn" interpretieren, sowas passt natürlich nicht in eine 1Byte große variable (max 255). Also muss man einen Hinweis mitgeben was der Code darstellen soll.

In BASCOM z.B wird durch das voranstellen von
&B10101010 mitgeteilt, daß das folgende ein Binär wert sein soll oder durch
&HAA das es ein Hexadezimalwert sein soll.
Bei dezimalzahlen brauchst/kannst du nichts explizit angeben.

Andere Programmiersprachen andere Sitten, jenachdem mit welcher Programmiersprache du arbeitest gelten dort andere Kennzeichnungen der Zahlensysteme (welche das sind? ...na schau in der Anleitung nach)

Also: 170 = &HAA = &B10101010

Wenn du nu nur eine Lampe (LED) anschalten möchtest, dann setzte nur die entsprechenden Bits auf 1 und alle anderen Bits auf 0.
So nun kannst du daraus einen Wert bilden und in einer dir beliebigen Schreibweise eingeben.

Alles Verstanden?



Hinweis:

...wenn du den 3ten Ausgang setzen willst musst du 00001000 senden.

Du meinst wohl den 4. Ausgang oder?

Sorry Darwin du hast recht. Habe es schon geändert
Ist ja nur um den "armen Kerl" nicht noch ganz zum ausflippen zu bringen O:)

021aet04
17.10.2009, 22:44
Sorry Darwin du hast recht. Habe es schon geändert

MiniMax
18.10.2009, 11:20
hey Jungs! Danke habe so ziemlich (hust hust) alles verstanden ](*,)
Aber wenn ich jetzt in Hex dem Controller sende, er soll den 4 Port ein schalten, woher weiß er dass??? denn aus &H08 werde ich nicht schlau!
Oder füllt der Chip dann wieder bis zur achten Stelle auf?
Also 08Hex = 1000 bin = 0000 1000 bin ???? :-k :-k :-k

021aet04
18.10.2009, 17:16
So wie du es geschrieben hast ist es richtig. Du darfst diese Hex Werte aber nicht mit der *.hex verwechseln die du an den µC sendest.

darwin.nuernberg
18.10.2009, 21:09
Also relativ einfach... (hrmmhrmm)

Ich gehe mal davon aus, daß du den PCF8574 verwendest.

Der Baustein bekommt über die A0,A1,A2 Eingänge eine eindeutige Adresse (je nachdem wie Du diese Anschlüsse beschaltest)
(steht eigentlich alles in meinem ApplicationBoard1 für Protobed Mega 16 -32 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=5601) klick mal auf meine Signatur oder den Link), die Anleitung kannst Du Dir laden.


An diese I2C Adresse des PCF8574 sendest Du den Code mit folgenden Befehlen (eigentlich nur ein einziger Befehl:)

REM I2C Befehle mit BASCOM

Dim Adresse as Byte
Dim Ausgabe as Byte

Adresse = &H70
Ausgabe = &B00001000

start:
I2csend Adresse , Ausgabe ' send the value

end

recht viel einfacher kann man es nicht machen...
Noch mehr Details sin in den Beispieldateien von Bascom, \samples\twi oder in meiner Anleitung zu finden.


PS: I2C, I²C, IIC , USI oder TWI ist alles das gleiche, nur dass eben PHILIPS das Patent drauf hat und daher der Name "I²C" eigentlich geschützt ist, wurden eben andere Name erfunden, welche aber nach dem exakt gleichen Protokoll arbeiten.

MiniMax
19.10.2009, 15:27
Hey danke, ich habe es schon verstanden. Deine Protobed Projekte habe ich bereits alle Durchgelesen und daraus viele Insperationen besorgt :cheesy: :cheesy:
Achja noch ne Frage: Was ist der Unterschied Zwischen "... Alias ..." und
"Dim ... as Byte / Word / Single / String*..."?? Also Alias meine Ich, dass man so z.B. Port's Namen zuweisen kann (bsp.: Porta.1 alias Led_1) und diese dann über diese Namen auch Ansprechen! Den Rest verstehe ich bisher noch nicht
Vielen dank für eure Gedult mit mir <=D> \:D/

Bammel
19.10.2009, 15:55
mit dem alias hast du so richtig verstanden.

der dim befehlt definiert eine variable mit der länge bzw. den eigentschaften eins bit / byte / word / usw.

in einem bit kan nur eine 1 oder 0 stehen
8 bit's ist ein byte und kann die werte von 0 bis 255 beinhalten
und 2 byte also 16 bit's ist ein word und dann die werde von 0 bis 65535 beinhalten

MiniMax
19.10.2009, 16:40
Danke an euch \:D/ \:D/
Wenn ich Fragen habe/aufkommen werde ich sie hier stellen! Wenn jemand Vorschläge für I²C Versuchsschaltungen hat, möchte er sie hier bitte Posten - :cheesy:

MiniMax
21.10.2009, 15:14
Hey Leute.
Alles funkt prima :) Vielen Dank für eure Hilfe!