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.
Seit wann stehen die Funktionen in header Dateien?
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.