Forum: Mikrocontroller und Digitale Elektronik PIC 16F877 und PIC 16F688 per I2C verbinden.


von Jochen S. (Firma: ---) (nechoj)


Lesenswert?

Hallo,
schon am 2.11. -21:53- hatte ich aus denselben Gründen im Forum 
angefragt.
Programmierung in C. PICClite-Compiler.
Anscheinend stießen meine Probleme auf zu viele ungeklärte Gegenfragen, 
so-
daß ich jetzt versuchen werde, sie auf ein paar wichtige Fragen zu 
begren-
zen.  (teilweise abgeändert und Neufragen)
Frage 1: Ich möchte 8 verschiedene bits zu einem byte zusammenfügen.
         bit7=1;bit6=0;bit5=0;bit4=1;bit3=0;bit2=1;bit1=0;bit0=1;

         byte=(byte(byte | 0xff)<<1;   // bit7
         byte=(byte(byte | 0xfe)<<1;   // bit6
         byte=(byte(byte | 0xfe)<<1;   // bit5
         byte=(byte(byte | 0xff)<<1;   // bit4
         byte=(byte(byte | 0xfe)<<1;   // bit3
         byte=(byte(byte | 0xff)<<1;   // bit2
         byte=(byte(byte | 0xfe)<<1;   // bit1
         byte=(byte(byte | 0xff)<<1;   // bit0

              Ergebnis:  byte=10010101;

         Ist das ok?

         Jetzt erfolgt die Übetragung vom SLAVE (PIC 16F688) zum MASTER
         (PIC 16F877).
Frage 2: Wie lauten die Befehlsfolgen für die Übertragung?

         Im MASTER wird das empfangene byte wieder in 8 einzelne bit-
         Werte aufgeteilt und die Daten weiterverarbeitet.
         Diese veränderten Daten werden wieder als 1 byte zusammenge-
         fasst und an 3 verschiedene SLAVES übertragen. Alle PIC 16F688.

Frage 3: Wie adressiere ich die verschiedenen SLAVEs? Müssen die selbst
         gewählten SLAVE-Adressen vorher in deren EEPROM gespeichert und
         dort abgerufen werden? Wie geht das?

Frage 4: Wie lauten die Befehlsfolgen für die Übertragung? (ähnl. wie 
2)?)

Zur Beantwortung der Fragen 2) und 4) genügt die Angabe der einzelnen
Anweisungen. (Funktionen) Die einzelnen bezugnehmenden "I2C.c" und 
"I2C.h"
Unterprogramme habe ich den Angaben im 'PICClite-Compiler' entnommen.

Für weitere Erläuterungen stehe ich gerne zur Verfügung.
Näheren Interessenten kann ich ja einmal per E-Mail mein komplettes
Programm zusenden. Dessen Umfang würde wohl den 'Rahmen' im Forum
übersteigen!
Lasst 'Milde walten', es wimmelt darin sicherlich noch an Fehlern. Deren
wohlwollende Aufdeckung hilft mir aber in meinen gewollten 'Studien'
weiter.

Gruß Jochen

von Wahhhhhhh (Gast)


Lesenswert?

>          byte=(byte(byte | 0xff)<<1;   // bit7
>          byte=(byte(byte | 0xfe)<<1;   // bit6
>          byte=(byte(byte | 0xfe)<<1;   // bit5
>          byte=(byte(byte | 0xff)<<1;   // bit4
>          byte=(byte(byte | 0xfe)<<1;   // bit3
>          byte=(byte(byte | 0xff)<<1;   // bit2
>          byte=(byte(byte | 0xfe)<<1;   // bit1
>          byte=(byte(byte | 0xff)<<1;   // bit0
>

Was ist den das für ein Chaos?

byte=(bit7<<7) | (bit6<<6) | (bit5<<5) | (bit4<<4) | (bit3<<3) | 
(bit2<<2) | (bit1<<1) | bit0;

Was den I2C-Kram betrifft: Datenblatt der Viecher lesen, dazu

I²C-bus specification and user manual:
http://www.nxp.com/documents/user_manual/UM10204.pdf

Using the PIC Devices’ SSP and MSSP Modules for Slave I2C Communication:
http://ww1.microchip.com/downloads/en/AppNotes/00734b.pdf

Using the PICmicro MSSP Module for Master I2C Communications:
http://ww1.microchip.com/downloads/en/AppNotes/00735a.pdf

von Wahhhhhhh (Gast)


Lesenswert?

>Im MASTER wird das empfangene byte wieder in 8 einzelne bit-Werte aufgeteilt

Das geht so:

bit7 = (byte>>7) & 1;
bit6 = (byte>>6) & 1;
usw.

von Wahhhhhhh (Gast)


Lesenswert?

Rückmeldung?

von Jochen S. (Firma: ---) (nechoj)


Lesenswert?

Autor: Wahhhhhhhh
Danke für Deine Antwort!

Meine Frage am Anfang war wirklich chaotisch.

Eigentlich sollte die 1-te Zeile lauten: byte=(byte | 0xff)<<1;  //bit7
die nächste Zeile                        byte=(byte | 0xfe}<<1;  //bit6
usw. ...
Wo das zusätzl. (byte( in meiner Aufstellung herkam ist mir schleier-
haft..., das habe ich gar nicht gemerkt! Sorry!
Es hat sich ja jetzt mit Deiner Antwort geregelt.
Was mit aber noch fehlt, ist ein Hinweis wie ich die SLAVE-PIC's 
adressieren
muß? Frage 3. (Adressierung im EEPROM des Slaves und wie erfolgt die 
Bestä-
tigung nach der Anfrage durch den MASTER???)
In meinem aufwendigen Projekt korrespondiert 1 MASTER (PIC) mit 
insgesamt
8 SLAVES (6 PIC 16F688 und 2 PIC 16F690) Der MASTER PIC hat intern einen
MSSP-Modul, während dieser bei den zu verwendenden SLAVES nicht 
vorhanden
ist. Was muß ich da beachten?

Weitere Fragen habe ich noch genügend, scheinen aber für ein Forum zu
aufwendig! Bei Interesse kann ich Unterlagen auch per E-Mail senden.

Gruß Jochen

von Wahhhhhhh (Gast)


Lesenswert?

Das Umbrechen der Zeilen bitte dem Server überlassen, nicht selbst Enter 
drücken! Liest sich etwas schwierig dein Beitrag.

>byte=(byte | 0xff)<<1;
Auch das ist noch chaotisch, tut nämlich überhaupt nicht das was du 
willst... Was hast du eigentlich genau vor? Wie sind deine Kenntnisse in 
Sachen C und PIC?

>Was mit aber noch fehlt, ist ein Hinweis wie ich die SLAVE-PIC's adressieren muß?
PICs bitte ohne Apostroph.

Hast du mal in die ganzen PDFs geschaut? Ist dir das Grundprinzip des 
I2C-Busses bekannt & hast du es verstanden? Die entsprechenden Kapitel 
der Datenblätter der einzelnden PICs sowie die beiden AN studiert? Dann 
solltest du dir die Frage eigentlich selbst beantworten können...
(Ich kann dir das natürlich vorkauen, aber erstmal lernst du so nichts 
und zweitens sind mir die Details nicht mehr bekannt, ist schon länger 
her das ich damit zu tun hatte.)

Der Compiler sowie die Datei "I2C.c" (wo kommt dir her?) sind mir 
unbekannt, solch grundlegende und gleichzeitig relativ einfache Dinge 
wie eine I2C-Bibliothek kann man sich aber ganz gut selber schreiben...

von Wahhhhhhh (Gast)


Lesenswert?

> Der Compiler sowie die Datei "I2C.c" (wo kommt dir her?) sind mir
> unbekannt, solch grundlegende und gleichzeitig relativ einfache Dinge
> wie eine I2C-Bibliothek kann man sich aber ganz gut selber schreiben...

Der Satz ist wohl etwas verwuselt... Sollte heissen:
-Den Compiler kenne ich nicht.
-Wo kommt die Datei her?
-I2C ist relativ einfach, da kann man sich seine Funktionen ohne zu viel 
Aufwand selber schreiben. (im Gegensatz z.B. zu USB, da ist es mit ein 
paar Zeilen nicht getan!)

von Jochen S. (Firma: ---) (nechoj)


Angehängte Dateien:

Lesenswert?

Autor Wahhhhhhh,
vielen Dank für Deine Stellungnahme.

Deine Vermutung ist ok. Meine C- und Compiler-Kenntnisse sind leider 
schon noch sehr bescheiden und ich will mich langsam aber stetig in die 
Materie einlernen. Vor schon längerer Zeit wurde von einem Kollegen 
(Programmierer)
und mir (Grundaufbau, Layouts und Prototyp des Vorhabens) ein 
aufwendigeres Projekt in Angriff genommen. Leider ist der Kollege wegen 
beruflicher Belastung nicht mehr in dar Lage seine Arbeiten 
fortzusetzen. Auf Grund der bereits geleisteten Arbeiten möchte ich die 
Arbeiten fortsetzen. Mal sehen vieleicht gelingt es mir nach und nach 
durch festes Weiterstudium und Hilfen aus Foren, das Vorhaben zu 
vollenden.
Derzeit befasse ich mich mit der Weiterleitung von Informationen von 1 
MASTER (Pic-16F877) zu insgesamt 8 SLAVEs. (PIC 16F688 und 16F690) Die 
Übertragung soll durch I2C-Übertragung erfolgen.
Als Compiler verwende ich den HI-TECH-Comiler (PICC-Lite 9.8) Aus den 
Beispielen habe ich die notwendigen I2C-Programme entnommen. Siehe 
Beilage.
Was ich nach wie vor suche, ist wie adressiere ich die mit dem MASTER 
korrespondierenden SLAVEs. (alle Beisp. im Internet zu diesem 
Programmatik
zeigen die Adressierung mit bereits voradressierten I2C-Produkten 
verschiedener Anbieter und nicht die Adressierung von nur PICs mit 
selbst zu wählender Adresse.
Wie soll ich das festlegen?

Jochen

Beilage:

von Wahhhhhhh (Gast)


Lesenswert?

Ich muss mal etwas weiter ausholen. Ist nicht böse gemeint, bitte nicht 
übel nehmen:

> Deine Vermutung ist ok. Meine C- und Compiler-Kenntnisse sind leider
> schon noch sehr bescheiden
Das hatte ich vermutet...

> und ich will mich langsam aber stetig in die Materie einlernen.
Das ist sehr lobenswert, aber... Ich glaube du überforderst dich gerade 
deutlich. Hast du überhaupt schon eigene Programme für den PIC 
geschrieben (und sei es eine blinkende LED)?

Ich schreibe das aus folgendem Grund (eigene Erfahrung): Wenn man nicht 
ein Minimum an soliden Grundkenntnissen hat auf welche man mit Hilfe von 
Datenblättern, Tutorials, Application Notes und Co. aufbauen kann wird 
es sehr schnell sehr frustrierend. Dann sucht man Hilfe in Foren und 
wird dort zu Recht wieder an den Anfang (C-Syntax, Datenblätter, ...) 
verwiesen ("RTFM"), das frustet noch mehr und einige Fragesteller werden 
ausfallend.

Du machst anscheinend den (beliebten?) Fehler deine Programme ohne 
Kenntnisse des PICs mithilfe von fertige Bibliotheken aufbauen zu 
wollen, anstatt das ganze "von Null auf" zu programmieren und zu 
verstehen. Am PC ist das vollkommen OK, kaum einer wird sich seine 
eigene Standardbibliothek schreiben (bzw. kaum einer ist dazu in der 
Lage, mich eingeschlossen!), aber im µP-Bereich ist das gerade für 
Anfänger imho sehr kontraproduktiv. Natürlich muss man nicht das Rad 
ständig neu erfinden, aber selber machen ist am Anfang sehr lehrreich 
bzw unabdingbar. Ansonsten passiert nämlich sowas: Man hat keine Ahnung 
vom Aufbau des zu programmierenden Käfers, glaubt es gibt für jedes 
Problem (Text/Daten per RS232/I2C/... senden, Text auf LCD ausgeben, 
Spannung per ADC einlesen usw. usf.) einen fertigen "Befehl" in 
irgendeiner Bibliothek (Bascom und Co. sei Dank, sry for that), das 
Programmieren verkommt zur Aneinanderreihung dieser "Befehle". Wenn es 
für eine Aufgabe mal keinen "Befehl" gibt ist man verloren...
> Was ich nach wie vor suche, ist wie adressiere ich die mit dem MASTER
> korrespondierenden SLAVEs. Wie soll ich das festlegen?
..., dabei steht das alles im Datenblatt (welches man aber nicht gelesen 
oder nicht verstanden hat).

Bei dir scheint das ähnlich zu sein, einige Fragen hast du 
interessanterweise nämlich nicht beantwortet:
> Hast du mal in die ganzen PDFs geschaut? Ist dir das Grundprinzip des
> I2C-Busses bekannt & hast du es verstanden? Die entsprechenden Kapitel
> der Datenblätter der einzelnden PICs sowie die beiden AN studiert?

Kurz und gut: Wenn du sowohl Anfänger in Sachen C als auch PIC bist 
vergiss letzteres erstmal und lerne C (d.h. Syntax, Schlüsselwörter, 
Operatoren, Bitschieberei, Variablentypen, Arrays, Pointer, Structs, 
usw.) unter Windows bzw. Linux (Google: GCC als Compiler, Code::Blocks 
als IDE, ...). Wenn du (dann) C beherrscht nimm einen einzelnden PIC 
(ohne I2C und tausend Sachen drumherum) guck ihn dir genau an, studiere 
das Datenblatt, versuche zu verstehen wie "so ein Ding" überhaupt 
funktioniert. Danach kommt das klassiche "Hallo Welt" in Form einer 
blinkenden LED, die Benutzung der RS232-Schnittstelle, Interrupts, usw. 
Wenn du soweit bist hast du gute Chancen dein "I2C-Problem" zu lösen. 
Den Weg dahin kann dir aber kein Forum abnehmen, da hilft nur selber 
machen.

GANZ WICHTIG: Datenblätter lesen (nicht nur Tutorials!) und KEINE 
Bibliotheken (dazu gehört auch I2C.c) nutzen (nur das passende 
Headerfile für den µP). In den Datenblättern steht drin wie der Käfer 
funktioniert, mehr brauchst du nicht (eventuell noch das Manual vom 
Compiler, aber gut, für einen Anfänger vielleicht etwas viel). Ein µP 
ist so "simpel", da kann man ALLES selber machen, ohne Bibliotheken. Da 
gibts Register, die wollen beschrieben werden, so geht das! (OK, wenn 
man USB oder FFT braucht greift der Grundsatz von wegen Rad und neu 
erfinden, aber wer soweit ist hat die Grundlagen hoffentlich intus.)
Wer wirklich "Lowlevel" verstehen will nimmt Assembler, aber zugegeben, 
das ist nicht jedermanns Sache. (Ich hab mit ASM für AVR angefangen und 
es keine einzige Sekunde bereut! Die Maschinensprache des Zielsystems zu 
beherrschen hilft ungemein, man versteht wirklich was da passiert und 
kann (in ASM oder C) entsprechend programmieren.)

Ist länger geworden und mit ziemlich viel Kritik gespickt, aber wie 
gesagt, es ist nicht böse gemeint!

von Wahhhhhhh (Gast)


Lesenswert?

PS: Beim 690 gibts iirc ein Bug im I2C-Modul, dazu müsste es von 
Microchip ein "Silicon Errata" oder so ähnlich geben.

von Wahhhhhhh (Gast)


Lesenswert?

Jetzt hab ich ihn wohl vergrault... :-(

von Wahhhhhhh (Gast)


Lesenswert?

Wäre nett wenn Jochen Sch. sich nochmal melden würde!

von Jochen S. (Firma: ---) (nechoj)


Lesenswert?

Hallo Wahhhhhhh!

Zuerst vielen Dank für Deine recht ausführlichen Stellungnahmen zu 
meiner
schon bald 3 Jahre zurückliegenden Anfrage an's Forum.
Auf meine damalige Anfrage hatte ich keine Antworten bekommen oder
diese hier nicht wahrgenommen. Seit jenen Tagen hat sich hier viel
zugetragen und ich konnte mich mit dem angeschnittenen Thema nicht
mehr befassen und so blieb alles unbearbeitet liegen und geriet in
Vergessenheit!!
Durch Zufall entdeckte ich heute (6.10.2013 !!!) daß Du damals geant-
wortet hast.

In das damals angedeutete und noch heute 'brach liegende' Projekt wurde
ich damals ohne Programmierkenntnisse 'hineingeworfen'. Nach dem 
Ausscheiden
des damaligen Kollegen (Programmierer in einer bekannten Firma) wollte
ich, das schon bis auf die Programmierungsarbeiten vorbearbeitete 
Projekt,
weiterführen. Zeichnungen (eagle) für Layouts sind komplett vorhanden.
Teilweise wurden schon -wieder überholte- Prototypen angefertigt.
Alles liegt noch hier und könnte -sollte- weiterbearbeitet werden.
Für mich scheint es wohl nicht mehr zu klappen!?
Solltest Du evtl. Interesse an einer Weiterführung in Eigenregie und
evtl. späterer Vermarktung finden, bitte ich um kurze Nachricht!

Gruß Jochen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.