Forum: Mikrocontroller und Digitale Elektronik SPI + I2c(softwäremässig) vertragen sich nicht?


von Elektroniker1 (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits.
Ich hab ein kleines Problem mit meinem PIC16F876A.
Ich benutze ihn, um einen max6952-Baustein über SPI(Hardware) 
anzusteuern.
Ausserdem noch um den Temperatursensir LM75 über I2C(Software) 
anzusteuern.

Jedes für sich in einem Einzelnen Projekt funktioniert perfekt.
Sobald ich aber beides zusammen in einem Projekt führe, funktioniert 
weder das eine noch das andere. Wenn ich die Ausführung der Funktion 
Init_Temp ( siehe anhang ) jedoch ausführe, funktioniert das SPI wieder 
problemlos.

für das SPI benutze ich PIN C2-C5
für das I2C benutze ich Pin C0+C1.

wäre erfreut über einige antworten.
mfg
Elektroniker1.

von Gast (Gast)


Lesenswert?

Seit wann stehen die Funktionen in header Dateien?

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Also,
meine Erfahrung mit Hardware-I2C und der Nutzung von Portpins am 
gleichen PortC führten zu einem großen Chaos !
Du solltest es tunlichst vermeiden, das TRISC-Register zu ändern 
(Read-Modify-Write!), während die I2C-Hardware aktiv ist.
Vielleicht ist das bei Deinem Projekt ähnlich.

von Peter D. (peda)


Lesenswert?

Elektroniker1 wrote:

> Wenn ich die Ausführung der Funktion
> Init_Temp ( siehe anhang ) jedoch ausführe, funktioniert das SPI wieder
> problemlos.

Dann mußt Du erstmal mal den Code aller verwendeten Unterfunktionen 
zeigen (output_high, i2c_start usw.)

Mit dem Anhang läßt sich jedenfalls absolut garnix anfangen, da sind ja 
nichtmal die SPI-Aufrufe drin.


> für das SPI benutze ich PIN C2-C5
> für das I2C benutze ich Pin C0+C1.

Dann sollte das so im Code stehen (per Defines).
Code läßt sich nicht verbal beschreiben.


Peter


P.S.:
Ich weiß, daß es beim PIC Fallgruben gibt (Latch-Register nehmen, 
Schattenregister für Richtungsumschaltung), wenn Pins eines Ports 
verschiedene Sachen machen sollen.
Aber unmöglich ist es jedenfalls nicht, sowas ist schließlich die Regel 
bei MC-Anwendungen.

von Elektroniker1 (Gast)


Lesenswert?

hallo leute.
erst mal danke für eure posts.
das sind header-dateien, die ich im mainprog dann mit dem befehl
#include "name" einschliesse.
dies führt zu Übersichtlichkeit, da man so die Funktionen gut gliedern 
kann, und ausserdem muss man nicht eine halbe stunde scrollen bis zum 
main.
Und wenn ein Kollege fragt, ob er mal meine Funktionen zum LM75 haben 
kann brauche ich die nicht mühsam rauszukopieren, sondern ich geb ihm 
einfach das File und er legt es in seinem Projektordner ab und schliesst 
es dann in seinem mainprog ein.
Man kann nicht 2 Dateien anhängen, und da ich davon ausging, dass der 
fehler bei den I2C Funktionen war, hab ich mich entschlossen, dieses 
File anzuhängen.
Jetzt zum Fehler:
Als ich das List-File genauer unter die Lupe genommen hab, hab ich 
schliesslich gemerkt, dass die I2C-Befehle das Tris-Register verändert 
haben, genau so wie Bernd gesagt hat. Ich habe also bei jeder 
SPI-Funktion das TrisC-Register neu iniatialisiert und schon war der 
Fehler behoben.
einen schönen tag noch.

mfg
Elektroniker1

von Peter D. (peda)


Lesenswert?

Elektroniker1 wrote:

> Und wenn ein Kollege fragt, ob er mal meine Funktionen zum LM75 haben
> kann brauche ich die nicht mühsam rauszukopieren, sondern ich geb ihm
> einfach das File und er legt es in seinem Projektordner ab und schliesst
> es dann in seinem mainprog ein.

Wenn aber der Kollege etwas erfahrener ist, wird er Dich sofort fragen, 
was er nur mit dem h-File soll, er braucht ja auch das dazugehörende 
c-File oder die Lib.

Er erwartet nämlich, daß in dem h-File kein Code steht, sondern nur die 
zu exportierenden Funktions- und Variablendeklarationen.

Schau Dir mal die standard h-Files Deines Compilers an, da steht auch 
kein Code drin.

In C ist es üblich, daß ein Programm aus mehreren c-Files besteht, die 
separat zu Objectfiles compiliert werden und die dann erst zusammen 
gelinkt werden.
Das hat bei großen Projekten den Vorteil, daß nicht jedesmal sämtliche 
Files neu compiliert werden müssen und das es keine Seiteneffekte 
zwischen den Objekten gibt (Konflikte zwischen Defines, Variablen-, 
Funktionsnamen).



> Man kann nicht 2 Dateien anhängen, und da ich davon ausging, dass der
> fehler bei den I2C Funktionen war, hab ich mich entschlossen, dieses
> File anzuhängen.

Dann macht man ein ZIP daraus und postet dieses.


> Jetzt zum Fehler:
> Als ich das List-File genauer unter die Lupe genommen hab, hab ich
> schliesslich gemerkt, dass die I2C-Befehle das Tris-Register verändert
> haben, genau so wie Bernd gesagt hat. Ich habe also bei jeder
> SPI-Funktion das TrisC-Register neu iniatialisiert und schon war der
> Fehler behoben.

Behoben ist er nicht, Du hast nur einen Workaround dazu gebastelt.

Die korrekte Methode ist, daß ein Schattenregister im RAM angelegt wird 
und jede Funktion, die ein Tris-Bit ändern will, dieses Schattenregister 
ändert und ausgibt. Damit bleiben alle anderen Bits ungeändert, wie es 
sich gehört.

Wenn Du den Sourcetext zu dieser fehlerhaften Lib hast, dann solltest Du 
ihn entsprechend korrigieren.
Ansonsten kann es passieren, wenn das Projekt wächst, daß der Workaround 
irgendwann nicht mehr funktioniert oder Du vor lauter Workarounds den 
Überblick verlierst.

Du hast ja noch 2 weitere PORTC-Pins, was ist wenn Du die auch noch 
brauchst?
Oder wenn andere Ports auch geteilt werden müssen?
Besser ist es also, einen einmal erkannten Fehler gleich zu berichtigen.


Peter

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.