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
> 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
>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.
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
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...
> 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!)
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:
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!
PS: Beim 690 gibts iirc ein Bug im I2C-Modul, dazu müsste es von Microchip ein "Silicon Errata" oder so ähnlich geben.
Wäre nett wenn Jochen Sch. sich nochmal melden würde!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.