PIC18F SSI slave (eigentlich sehr simpel.)

Gast #4262591
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich arbeite mit einem PIC18F (PIC18F87J72). Dieser besitzt SPI, I2C und 
USART (asynchronous und sogar synchronous irgendwie...).

Ich möchte den PIC mit einem gewissen Sensor verbinden, welcher im 
Master Mode (leider kein Slave möglich) seinen Wert nach folgendem 
simplen Verfahren ausgibt:

-2 Pins (Clock und Data)
-Clock Frequency: 2 MHz
-Clock inactive HIGH, data on rising edge
-Data word length variable (~10-20 bit)

Also alles in allem sehr simpel. Es gibt einfach hin und wieder mit 
großen zeitlichen Abständen seinen Wert durch, indem der Clock vom 
Sensor aktiviert wird für die Länge des Wortes. (Die Wortlänge bleibt 
fix, sobald einmal festgelegt). Der sensorwert wird direkt als integer 
bit für bit so übermittelt.

Nun meine Frage: Was ist der einfachste, schnellste Weg die Daten in den 
PIC zu bekommen?

Zur info: Das einzige was ich sonst im PIC machen muss ist von zwei 
solcher Sensoren den Wert einlesen und dann output=wert_a-wert_b 
rechnen...

Bin gespannt auf eure Vorschläge!

Swampy
Gast #4262644
Lesenswert?
• ▲
▼
Klingt ja im ersten Moment nach SPI, aber wahrscheinlich ist die Länge 
des SPI-Empfangsregisters unpassend (ich habe aber jetzt nicht ins 
Datenblatt geschaut, aber ich schätze mal 8 bit).

Vermutlich ist der beste Weg, das ist Software zu machen: Den Clockpin 
mit einem interruptfähigen Eingang verbinden und dann bei jedem 
Interrupt den Zustand der Datenleitung lesen. Oder nur auf die erste 
Taktflanke warten und dann die Daten in einem festen Zeitraster 
einsamplen.
Problematisch wirds nur, wenn beide Sensoren gleichzeitig funken. Kannst 
Du das irgendwie verhindern (z.B. zeitversetzt starten) ?

2MHz sind auch recht flott. Wie hoch kannst Du den PIC takten? 
Vermutlich wird der Interrupthandler  zeitkritisch, d.h. du musst die 
Daten erstmal nur möglichst schnell und einfach wegspeichern und alle 
Berechnungen später in der langen Pause machen.

Steht die Anzahl der Datenbits bereits zur Compilezeit fest?
Gast #4262660
Lesenswert?
• ▲
▼
Danke @Vancouver!

Also erstmal bin ich shcon froh, wenn ich es schaffe, einen der beiden 
Sensoren einzulesen. Also lassen wir den zweiten erstmal außen vor.

Der PIC ist auf dem Eval Board mit 12 MIPS.

Ich muss auch nicht unbedingt jeden Wert mitbekommen. Etwas in der Art:

Sequenz:
1. Warten bis Wert kommt.
2. Wert einlesen
3. Berechnung machen
4. Über seriell weitersenden
5. (repeat)

..wäre voll in Ordnung.

Swampy
Gast #4262687
Lesenswert?
• ▲
▼
> Der PIC ist auf dem Eval Board mit 12 MIPS.

Ok, d.h. Du kannst zwischen zwei Samplezeitpunkten 6 Maschinenbefehle 
abarbeiten. Das ist nicht viel. Evtl musst Du hier  in die 
Assemblerkiste greifen (falls Du nicht sowieso Assembler programmierst).

> Ich muss auch nicht unbedingt jeden Wert mitbekommen. Etwas in der Art:

Nein, aber Du musst von einem Wert alle Bits richtig einlesen, das ist 
der weitaus schwierigere Teil an der Geschichte.

Ich würde an Deiner Stelle damit anfangen, die Einlesefunktion zu 
schreiben und zunächst mal nur den eingelesenen Wert über UART wieder 
auszugeben. Bzw. hast Du einen Debugger und kannst  den Speicher 
auslesen? Wenn Du die Werte richtig einlesen kannst, ist der Rest 
wahrscheinlich kein großer Act mehr.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.