Archiv verlassen und diese Seite im Standarddesign anzeigen : edit: Brauche Hilfe für I²C Bus System mit Bascom
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<
ikarus_177
13.10.2009, 18: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, 20: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.
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, 21: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...
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
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
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
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, 18: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.
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???
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
Hi, wie hast du das Gemacht??
021aet04
16.10.2009, 16: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.
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????
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
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, 17: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.
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.
das ist der selbe baustein ;)
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, 18: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
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, 12: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
Wie kann man den bei dem PCF8574 die Helligkeit Regeln??
021aet04
17.10.2009, 13: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.
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, 15: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.
ok! naja werde mir mal die Englische Seite heute Arbend durch lesen !
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
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, 19: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, 23: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, 23:44
Sorry Darwin du hast recht. Habe es schon geändert
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, 18: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, 22: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.
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/
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
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:
Hey Leute.
Alles funkt prima :) Vielen Dank für eure Hilfe!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.