mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Software I2C will mit PIC16F88 nicht richtig


Autor: bernd h. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will auf einem PIC16F88 ein Software I2C realisieren, da der SSP 
schon mit SPI belegt ist. So, zunächst hatte ich das Sample von Hi-Tech 
genommen, man muss das rad ja nicht immer neu erfinden. Das 
funktionierte nicht, und irgendwo hatte ich gelesen, dass der Code 
fehlerbehaftet sei. Ich habe mittlerweile mehrere Codes gefunden, und 
keine hat funktioniert. nehmen wir mal als Beispiel den Code von dieser 
Seite: http://www.electronicslab.ph/forum/index.php/topic...

Eigentlich muss ich nur noch die Pins definieren. Bei mir sieht dieser 
Teil dann so aus:
 #define SCL             RA7
 #define SCL_TRIS        TRISA7
 #define SDA             RA6
 #define SDA_TRIS        TRISA6
 

Um vorweg mögliche andere Fehler auszuschließen: Was ich ansteuern will 
ist ein RDS processor, der TDA7333. Dazu habe ich ein kleines Platinchen 
gemacht, wo dieser drauf sitzt. Verbinde ich diese an eine I2C Leitung, 
die von einem PIC24 mit Hardware I2C gesteuert wird, antwortet mein 
Platinchen brav. Will sagen, hardwaremäßig sollte alles in Ordnung sein. 
Sowohl beim PIC24 als auch beim PIC16 sind 10k Pull ups an den Clock- 
und Datenleitungen.

Mit dem Oszi sehe ich mit dem PIC24 als Master folgendes: Gebe ich die 
richtige Adresse ein, setzt der Slave (in diesem Fall der TDA7333) SDA 
auf LOW, der Master erkennt dies erwartungsgemäß, und gibt den Bus mit 
Setzen der SCL auf HIGH wieder frei. Anschließend wird dann auch SDA auf 
HIGH gesetzt. Gebe ich die falsche Adresse ein, bleibt SDA auf HIGH, der 
Master belässt somit die SCL auf LOW.

So, mit dem PIC16F88 verhält sich immer so, als würde sich der Slave 
nach Senden der richtigen Adresse erwartungsgemäß quasi zurückmelden, 
auch wenn ich die falsche Adresse schicke! Timings und Signale scheinen 
zu stimmen, aber irgendwie kommt immer nur Müll heraus. Was stimmt hier 
nicht? Wahrscheinlich übersehe ich irgend eine Banalität...

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: bernd h. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, ok, es scheint mir, als hätte ich zwar bidirektionale I/O-Ports 
ausgewählt, aber im datenblatt sehe ich nun, dass RA6 und RA7 den Input 
nur analog entgegennehmen, wohingegen digitale vorausgesetzt werden.

Autor: bernd h. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, nö, leider nicht. Abgesehen davon, dass ich per ANSEL eh' schon 
alle Inputs als digitale definiert hatte, habe ich mit RB6 und RB7 das 
gleiche Problem. Bleiben nur noch RB3 und RB5 als Testkandidaten übrig, 
aber ich schätze, das wird auch nichts bringen.

Autor: bernd h. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht immer noch alles prima aus, bis auf die Tatsache, dass mir der 
Slave keinen ACK gibt. :( Keine Ideen?

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der PIC16F88 kann mit seinem eingebauten Teil keinen Master-Modus (s. 
Datenblatt 3.Seite bzw. Page 1, mehr auch ab Page 92), nur Slave! 
Deswegen habe ich Dir ja auch den Link mit dem Software-I2C geschickt. 
Das läuft bei mir auch auf einem 16F88

Autor: bernd h. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Stephan,

aber ich bin ja schon von Anfang an dabei, I2C mit Software machen zu 
wollen, und genau das funktioniert nicht! Da hat mir der Link leider 
auch nicht geholfen. :(

Hast Du Deinen 16F88 mit Assemlber gefüttert? Ich bin mit C unterwegs, 
und alle Softwarelösungen (drei oder vier an der Zahl) machen's nicht. 
Da muss bei mir ein anderes Problem vorliegen, das ich aber grad nicht 
blicke. Hardware ist eigentlich ok, wie bereits erwähnt, weil der Slave 
an einem anderen Controller mit Hardware I2C definitiv funktioniert.

Am Oszi sieht alles vom Timing her gut aus, nur sehe ich eben, dass der 
Slave bei der neunten Clock SDA nicht auf LOW zieht, also kein Ack. (?!)

grüße
bernd

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Am Oszi sieht alles vom Timing her gut aus, nur sehe ich eben, dass der
>Slave bei der neunten Clock SDA nicht auf LOW zieht, also kein Ack. (?!)

Falsche Adresse gesendet? Oder die Bits in der falschen Reihenfolge?
Neben ADCON/ANSEL sollte man auch immer ein Auge auf ein
möglicherweise vorhandenes CMCON (Komparatoren) habe.
Dann macht man I2C auch nicht über die Portregister sondern
über die TRIS Register.

Ansonsten kann dir ohne kompletten Code wohl kaum jemand helfen.

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ...dass der Slave bei der neunten Clock SDA nicht auf LOW zieht, also
> kein Ack. (?!)

Das könnte daran liegen, dass der Data-Pin noch auf Output eingestellt 
ist.
Sollte aber von der Soft-I2C Routine richtig angesteuert werden.

Bei den Original I2C Pins macht das nichts, da die open Collector 
Konfiguration haben.

Autor: Tajas R. (tony)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du denn die Eingänge auf die digital Eingänge umgeschaltet? Die 
werden standartmäßig analog initialisiert... Im Anhang die nötige Init 
laut Datenblatt. Ansonsten bitte mal die ganze ASM uppen.

Autor: bernd h. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JIPPPIIIIIEEEEE!!!

Also, mal vorweg, der Code ist im Link oben. ;) Was ich hätte noch 
einfügen können war die init.h. Ob ich die betroffenen Portpins auf IN 
oder OUT setze, ist egal, weil das I2C per TRIS arbeitet (siehe Link). 
Mit Herumspielen an den Adressbits habe ich überhaupt erst 
herausgefunden, dass das software i2C nicht funktionierte. Ich hatte 
also immer wieder zwischen richtiger und falscher Adresse hin- und 
hergeswitcht. ANSEL hatte ich bereits auf 0x00 gestellt.

Was aber geholfen hat, war, den Komparator und die AD explizit auf OFF 
zu stellen! Danke an euch alle und speziell an Holger mit seinen Tipps, 
die die Lösung brachten!!!!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.