PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : I2C macht PIC Anfänger Problem



oderlachs
09.07.2017, 17:15
Hallo Freunde !

Bestimmt hänge ich wieder in den Fussangeln für Anfänger fest, aber ich komme nicht weiter. Nachdem ich mich schon mal mit I2C so recht und schlecht abgequält habe, dachte ich nun übernimm mal ein Tutorial aus dem Internet.

Ich habe zwei PIC Entwicklerboards(MCU:PIC16F877A) per I2C verdrahtet nach folgendem Beispiel / Anleitung: https://electrosome.com/i2c-pic-microcontroller-mplab-xc8/#Start_Condition

Nun habe ich zwar keine 8er Dipschalter verwendet, sondern stecke das mit Drahtbrücken.

Auf beiden Boards bleiben alle 8 LEds auf ON , auch wenn ich die PortB Eingänge auf GND also Low lege. Die Stromversorgung erfolgt vom grösseren Bord, so das es dabei auch zu keinen Störungen(2.Netzteil) kommen kann.

Vielleicht kann kann ja mal ein Profi sich den Code ansehen und darüber urteilen.

Mit besten Dank im Voraus

Gerhard

witkatz
10.07.2017, 00:18
Vielleicht kann kann ja mal ein Profi sich den Code ansehen und darüber urteilen.
Hallo Gerhard,
während du auf den Profi wartest, kann ich als Laie einen Hinweis los werden.
In den Kommentaren auf der zitierten Seite lese ich, dass der Master einfrieren kann, wenn er zu früh startet und der Slave noch nicht bereit ist. Deine PICs bekommen gleichzeitig Spannung, laufen gleichzeitig hoch und evtl. ist ein Timingproblem die Ursache. Versuche vielleicht, den Start des Masters mit einem delay vor der Endlosschleife zu verzögern.

Gruß
witkatz

oderlachs
10.07.2017, 11:13
Hallo Witkatz !

Na Du bist ja in meinen Augen schon ein Profi !! Ich habe mal ein "__delay_ms(100....1000)" eingefügt...kein Erfolg.

Ich habe ja zu meinem EasyPIC-40 Board ja Beispiele, aber die sind alle nicht XC-8 Compiler kompatibel, so das ich alles umschreiben muss. Darum versuche ich ja manches aus dem Web um mich einfach mal ein zu lernen.
Durch Zufall bin ich im Web auf ein Beispiel gestossen , wo ich sah wie ich einzelne Bits eines Registers ansprechen kann. Habe so etwas nirgends gefunden in den MPLABX /Compiler Beschreibungen auch im Datenblatt nicht.
Ich hatte immer das ganze Register zum Vergleich rangezogen, das war immer umständlich.

Es ist eben grosser Mist, wenn man in English ne Null ist und solch ein Hobby hat. :( :(

Da mir gerade ein paar Amazon-Gutscheine ins Haus geflattert sind, möchte ich mal da schauen, ob nicht ein gutes Buch, auch für C/C++ Programmierer, für PIC's dort zu finden ist.

Auf meine alten Hobbyistentage möchte ich nicht noch wieder anfangen mich wie zu Zeiten von C-64, 8080 und 8085 mit Assembler rumzuschlagen.

Gruss und Dank

Gerhard

indeas
10.07.2017, 16:05
Versuch es mal mit einem CCS Compiler.
Da gibt es einfache und funktionierende Befehle für solche und andere Probleme.
Eine kostenlose Demo gibt es auch.

oderlachs
10.07.2017, 17:34
Hallo Indeas, vielen Dank für den Hinweis.
Ich bekomme das unter Linux nicht gebacken mit dem CCS, schon versucht. Ich müsste doch bestimmt auch wieder umdenken/umlernen, wie ich dann den Code schreibe.

Ich denke ich bleibe da beim XC-8 Compiler "free" von Microchip, bevor ich mir noch selbst mehr Fussangeln auslege ;)

Gruss und Dank

Gerhard

RoboHolIC
10.07.2017, 20:30
Gretchenfrage @ Gerhard:
Wie hältst du's mit den PullUp-Widerständen an den I2C-Leitungen? Sind die vielleicht doppelt (also auf beiden Boards je einmal) und recht niederohmig?

Gruß
Christian

oderlachs
11.07.2017, 08:30
Hallo RoboHolIC !
Ich kann Dir die Gretchenfrage beantworten, mit 4k7 bis 7k5 getestet.
Keine auf beiden Boards schon vorhanden, sonder extern angeschaltet sind. Das Problem scheint anderswo zu liegen.
Werde das Test-Projekt nochmals neu anfassen, beginnen.

Gruss und Dank

Gerhard

RoboHolIC
12.07.2017, 01:01
Du hast doch schon erfolgreich per I2C externe Bausteine angesprochen, richtig? Du könntest doch als Master erstmal bewährte eigene Source verwenden und mit dem anderen Controller den I2C-Slavecodse entwickeln. Dann fehlt allerdings die Behandlung der Write Collision.
Vielleicht geht das aber auch zu weit am Ziel vorbei.
Gruß
Christian.

oderlachs
12.07.2017, 11:00
Ja das habe ich :) .....nun habe ich noch was entdeckt, was bestimmt wieder zu den Anfängerfallen gehört.

Im Datenblatt vom PIC16F877A spricht man von von SSPSTAT, SSPCON1 und SSPCON2 Registern. Mit dem SSPCON1 kann der XC8 Compiler aber gar nichts anfangen, da muss ich dann SSPCON bzw. SSPCONbits.xxx usw. schreiben, beim SSPCON2 kann ich getrost SSPCON2 bzw. SSPCON2bits.xxx verwenden.
Na ich komme mir vor wie "Columbus auf Entdeckungsreise", nicht wissend in welche Falle man mit dem nächsten Schritt tritt... ;)

Kommt Zeit kommt Rat und neue Entdeckungen.

Vielen Dank für Eure Mithilfe !!!

Gerhard

Nachtrag : Ich habe jetzt eine gute dokumentierte Anleitung (http://www.stefan-buchgeher.info/elektronik/i2c_pic_slave/i2c_slave_pic.html) für PIC I2C gefunden, da werde ich mich mal belesen

witkatz
12.07.2017, 11:26
Im Datenblatt vom PIC16F877A spricht man von von SSPSTAT, SSPCON1 und SSPCON2 Registern. Mit dem SSPCON1 kann der XC8 Compiler aber gar nichts anfangen,
Das Datenblatt ist diesbezüglich nicht konsistent, in der Überschrift der Tabelle wird der Name SSPCON1 verwendet und im Text SSPCON. Der exakte Name des Registers ist letztendlich egal, so lange die Adresse 0x14 im eingebundenen Header pic16f877a.h richtig deklariert ist. Das kannst du einfach mit STRG-Klick auf den Registernamen feststellen. Der richtige Header kommt über xc.h und Projektsettings rein. Die Zeile #include <pic16f877a.h> würde ich löschen. Es könnte vielleicht problematisch sein, wenn in den Projektsettings ein anderer Chip ausgewählt wurde als der includierte Header.

Nachtrag:
Dir alten Hasen ist dir das Debuggen wahrscheinlich nicht fremd, Oder?
Ich benutze gerne eine LED als Debug Ausgabe, vielleicht zunächst blinken lassen um zu schauen ob der PIC anläuft und mit welcher Frequenz. Die Option FOSC=XT passt z.B. nicht zu 8MHz Quarz, FOSC=HS wird im Datenblatt empfohlen. Mit einer Debug LED kannst du auch leicht feststellen, wo das Programm hängen bleibt, ob das Interrupt ausgelöst wird usw.
Mit PicKit 3 auf 16F877A hast du auch die Möglichkeit ein Breakpoint in der Software zu setzen und in der Schaltung zu debuggen.

oderlachs
12.07.2017, 12:41
Danke Witkatz !!!

Na nun ich wollte nicht noch die in der MPLAB-Lib vorhandenen Lib durchsuchen nach den definierten/deklarierten Registern. Da ja PDF und die LIbs vom selben Hersteller sind, egal.
Nun habe ich vom DevBoard Hersteller ein Beispie (http://oderlachs.de/code/PIC/at24c02_i2c_eeprom.html)l umgeschrieben und es geht. Werde mich daran weiter orientieren.

Gerhard