mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18 MWIRE (MSSP) Problem


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mich wohl verlaufen, will aber nicht auf Anfang zurück.
Problem:
Mein Sensor (ADNS-2610) hat laut Datenbalt ein "synchronous serial 
port". In meiner Unbedachtheit habe ich bei meinem PIC18 das MSSP als 
MWIRE Interface implementiert um die beiden zusammen zu bringen. Dann 
habe ich festgestellt, dass das PIC interface eine dreidraht (SCL, SDI, 
SDO) verbindung möchte, aber der Sensor nur ein zweidraht Interface (SCL 
SDIO) hat. Kann so schlimm nicht sein - kurzerhand beim PIC die SDO und 
SDI über einen Wiederstand verbunden und schon .... geht nichts mehr!

Wenn ich schreiben oder lesen will (SSPBUF = data_out;) und dabei der 
der SDI auf low gezogen ist, bleibt der PIC stehen?!
Habe gedacht es wird wohl ein Interrupt ausgelöst und versucht die zu 
disablen.

PR2 = 6;
T2CON  = 4;
OpenMwire(MWIRE_FOSC_TMR2);
SSPCON1bits.CKP = 1;        // ensure clock state is 1 for transmission
INTCON = 0;
PIE1 &= 0xF7; // SSP interrupt (bit3) disablen
SSPBUF = data_out;          // write single byte to the Microwire1 
device
dummi = SSPBUF;

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du dir mal das datenblatt des ADNS-2610 angesehen bezüglich der 
read/write-operation? hast du gesehen, wieviele bits aufs mal da 
versendet werden? weisst du wie MSSP des PICs funktioniert oder hast mal 
den vorgeschlagenen code von Microchip zu herzen genommen? ..ich glaube, 
keiner dieser fragen kannst du mit einem 'ja' beantworten. komme dem 
erstmal nach. danke.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo snowman.

Das es prinzipiell mit dem MSSP geht kannst du hier sehen:
http://forum.htsoft.com/all/showflat.php?Cat=0&Num...

Kannst Du auch eine Antwort auf die eigentliche Frage geben? Ansonsten 
alles ja.

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dass es mit dem MSSP machbar ist, glaube ich auch. den verlinkten code 
habe ich nicht durchgesehen: wenn er funktioniert, dann nimm ihn doch 
einfach. beim groben durchscrollen des links habe ich keinen schaltplan 
gesehen, vielleicht werden die datenleitungen SDO/SDI auf GND oder +5V 
gezogen und sie sind opendrain definiert oder was weiss ich.
ps: ich habe so geantwortet, weil es nach einem ratespiel ausgsehen hat 
(in der letzten zeit häufen sich solche, bei denen zuerst geraten werden 
muss, was der threadsteller schon weiss (meist nichts), und ich 
zumindest bin echt nicht spitz auf solche ratespiele). nun denn, wenn es 
im besagten link funktioniert, dann frag doch dort nach der 
HW-beschaltung.
..ähm, was macht eigentlich die zeile "device" in deinem code?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

"device" habe ich nur hier geschrieben (aber nicht im sorce) stehen. 
(Mein Fehler -> Zeilenumbruch beim kopieren.)

PR2 = 6;
T2CON  = 4;
OpenMwire(MWIRE_FOSC_TMR2);
SSPCON1bits.CKP = 1;        // ensure clock state is 1 for transmission
INTCON = 0;
PIE1 &= 0xF7; // SSP interrupt (bit3) disablen
SSPBUF = data_out;          // write single byte to the Microwire1 
device
dummi = SSPBUF;

Der Link mit dem mssp ist leider schon alt. Glaube da antwortet keiner 
mehr.
Laut Microchip Beispielen geht das mit Mssp und Mwire tatsächlich anders 
- hab ich auch gelesen. Aber so wie in den Beispiele umgesetzt hatte ich 
das selbe Problem. Deshalb habe ich nach und nach alles was nicht nötig 
ist weggelassen. Der PIC ist übrigens ein PIC18F2455 für den es ein 
Errata gibt. Dort wird die Methode aus den Beispielen mit testen auf BF 
als fehlerträchtig beschrieben.

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
interessant finde ich im link:
unsigned int recv_SPI(unsigned int addr)
{
  SSPBUF = addr & 0x7F;
  while(!BF);
  TRISC= TRISC & 0x20; //high-z state for PORTC? 
  return SSPBUF;
}
wahrscheinlich sind SDI und SDO wirklich mit je einem widerstand auf die 
datenleitung gekoppelt und jenachdem, ob empfangen wird oder gesendet, 
wird der entsprechende pin auf "high-z" geschaltet...

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst.
Der SDI benötigt einen pullup Wiederstand. Ist dieser nicht vorhanden 
"wartet" die Hardware auf eine art "Acknoledge" wie bei I2C.
Man kann tatsächlich ein "SDIO" erzeugen indem man SDI und SDO mit einem 
Wiederstand verbindet. Wie erwähnt, muss aber der SDI zusätzlich einen 
Pullup kriegen. Die Vermutung kamm mir, als ich die Doku zum I2C gelesen 
habe und hier noch einige andere Threads zum Thema MSSP gelesen habe.
Der Code den snowman zitiert muss ebenfalls so ähnlich implementiert 
werden und "jenachdem, ob empfangen wird oder gesendet,
wird der entsprechende pin auf "high-z" geschaltet..."
Nur mit dem "while(!BF);" muss man bei einigen PICs vorsichtig sein -> 
siehe Errata für die jeweiligen Pics.

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.