-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: wie verschicke ich 12bit per spi??

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26

    wie verschicke ich 12bit per spi??

    Anzeige

    Hallo!
    soweit ich weiß kann ich in Bascom auch eine Software-Spi-Schnittstelle benutzten, das heißt jeden Ausgang in die entsprechende SPI verwandeln. Stimmt das?
    Wenn das möglich ist, möchte ich ein 12-bit Signal vom Microcontroller an zwei parallele DA-Wandler (LTC1451) schicken. Über zwei CS-Ausgänge (CS1 und CS2) möchte ich abwechselnd die beiden DA-Wandler ansprechen.

    Das erste Problem ist, dass ich nicht weiß, wie ich die 12bit rüber kriegen soll. Da müsste ich ja 1 1/2 Byte schicken!? (Variable als Integer deklarieren, oder als Byte??)
    Oder schicke ich beide Bytes und sage über CS nach 1 1/2 Bytes, dass das Register voll ist, und der rest verschwindet einfach irgendwo?

    In der Bascom Hilfe steht, dass wenn ich mit der Software SPI mehrere slaves ansteuern will, die CS/SS nicht deklarieren soll. Muss ich dann einen normalen Ausgang als CS/SS benutzen? Wie krieg ich dass dann hin, dass der zum richtigen zeitpunkt gesetzt wird?

    würd mich über alles freuen, was mir irgendwie helfen kann: Erklärungen, Beispiele, Tutorials,...

    Grüße
    Christian

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Die gute Nachricht: Bascom kann Soft-SPI
    Die schlechte: das geht nur 8-Bit-weise (wie auch die HW SPI)

    Da du das, wie's scheint, sowieso zu Fuss machen mußt, kannst du dir dein Datenformat aussuchen.
    Wie und woher kriegst du die Daten in die Hand ?
    Wird das für Stereo-Audio (also eher flott) ?

    CS wirst du auch selbst machen müssen.

    Eigentlicht schreit das Ganze nach Inline-Assembler

    Was ich nicht weiss: Wie sich der Chip verhält, wenn du ihm einfach zwei Byte, also 16-Bit auf's Auge drückst. Vielleicht wirft er überzählige Bits ohnehin in den Gully. Dann könntest du auch "normale" 16 Bit in zwei Bytes schicken, und auch die Bascom SPI verwenden.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Hört sich ja erst mal gut an, dann aber wieder nicht!
    Bin absoluter Neueunsteiger, daher hab ich noch nicht so wirklich den Durchblick. Brauch das aber für ein Projekt.
    Also, das Ganze ist gedacht für ein Regelsystem nach einer Drehzahlmessung. Der Controller soll dabei die Signale einer Lichtschranke in eine Drehzahl und einen Drehzahlgradienten berechen. Diese beiden Werte sollen für regelungstechnische Aufgaben mit den beiden DA-Wandlern als analoge Spannungssignale ausgegeben werden.
    Die DA-Wandler haben 12 bit Schieberegister, dann müssten eigentlich, wenn ich 2 Byte rein schiebe, die ersten 4 reingeschobenen Bit des ersten Bytes wieder raus fallen.
    Könnte ich nicht meinen Ausgabewert als Integer definieren, den Bereich des Wertes irgendwie auf 0 bis 4095 festlegen (geht das und wie?), dann müssten doch die ersten 4 Stellen (also von links gesehen) des Integer null bleiben. Wenn ich diese Zahl jetzt so in meinen DA-Wandler rein takte hätte ich die ersten vier (wieder von inks gesehen) Stellen null, die letzten 4 (die aber einen wert beinhalten) aber wieder aus dem Register heraus geschoben. Ich könnte aber vorher den wert mit 16 multiplizieren, damit würde ich alle 1en um vier Stellen nach links verschieben, somit hätte ich eine Integerzahl, die am ende immer 4 "0"-Bits hat, die ich ohne Probleme einfach wieder aus dem wandler raus schieben könnte.
    Das war jetzt gerade so meine Idee, funktioniert das evtl.??
    Wie ich das dann aber mit den CS hinkriege weiß ich immer noch nicht..

    Grüße
    Christian

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Wäre das so, dass du die Lichtschrankenimpulse in einer Zeiteinheit zusammenzählst, und das wäre dann der Drehzahl-Wert ?

    Man sollte wirklich den Versuch machen, ob das mit 16 statt 12 -Bit reinschieben klappt. Macht die Sache schon einfacher. Wenn nicht, rührst du dich wieder, das bringen wir schon miteinander hin.

    wert x 16 :
    DIM wert AS WORD
    SHIFT wert, left, 4 ' 4 bit links => x 16

    Das könntest du auch statt je Impuls eine "1" immer gleich eine "16" addieren, dann würde es auch passen und ist für den µC auch nicht mehr Arbeit.

    CS jeder der Chips hängt auf einem eigenen Ouput Pin

    CS1-Pin setzen
    daten1 senden
    CS1-Pin löschen

    CS2-Pin setzen
    daten2 senden
    CS2-Pin löschen
    mehr ist das nicht
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Hi!!
    Finds echt klasse, dass du mir hilfst, vielen Dank!
    Ja, wie du das geschrieben hast ist es richtig, ich zähle die Lichtschrankenimpulse während ein timer läuft, für den ich die zählzeit vorgeben kann. die lichtschrankensignale zähle ich über einen interrupt, wo wir gerade dabei sind, gibt es auch softinterrupts, sodass ich jeden eingang als solchen nutzen kann?
    Über die gezählten Lichtschrankensignale und die Zeit berechne ich dann die Drehzahl, und über die Änderung von der einen Messung zur nächsten den Gradienten.

    Bevor ich jetzt meine ersten Versuche starte noch zwei kleine Fragen:

    1. die CS-Pins muss ich nicht extra als solche deklarieren, da nehm ich einfach irgendwelche ausgägne, setzt die auf 1 oder null, oder? dann muss ich bei config spi,...ss=none wählen!?

    2. ich möchte drehzahlen von 0 bis 10.000 messen, demnach spannungen von 0V bis Vref ausgeben, demnach müssen alle 12 bits entweder "0" (=0), bis maximal alle 12 "1" (4095) sein. gibt es dafür irgend nen befehl?

    Jetzt kommt doch noch eine dritte: Muss ich die Clockrate einstellen, Bei HardSPI ist das ja mit drin, und bei softSPI?? Übernimmt der die Taktfrequenz des uC??

    Gruß

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    1 richtig, denn Bascom kann ja nur einen Pin, du brauchst 2
    2. da mußt du umrechnen, nutzt nix, factor = impulse(10000) / 4095
    3. die Rate is eigentlich wurst, Ich find im Datenblatt keine Angabe, ich würde zu Begin mal nicht zu sehr auf den Tisch hauen und mich auf etwa 100 kHz beschränken. Gas geben kannst du immer noch.
    ( guckst du Bascom help "CONFIG SPI" clockrate)

    Frei definierbare "softinterrupts" gibts nicht wirklich, versuche einen der vorgegeben Pins zu verwenden
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Hab mal ein bisschen Programm geschrieben. wollt zum testen die auszugebenden Variablen einfach mal vorgeben, damit ich ungefähr überprüfen kann, ob das funktioniert.
    So sieht mein Programm aus:

    Code:
    Config Spi = Soft , Din = Pinc.5 , Dout = Portc.1 , Ss = None , Clock = Portc.0       'Konfiguration der Software SPI
    Config Portc.2 = Output                                     'Ausgang für CS1
    Config Portc.3 = Output                                     'Ausgang für CS2
    
    Portc.2 = 1                                                 'CS1 auf High
    Portc.3 = 1                                                 'CS2 auf High
    
    Dim A As Word
    
    Do
    
    A = 0
    Portc.2 = 0                                                 'CS1 auf LOW
    Wait 10e-3
    
    Spiinit
    Spiout A , 1                                                'sende Wort (A=0)
    
    Wait 10e-3
    Portc.2 = 1                                                 'CS1 auf High
    
    Wait 5
    
    A = 65535
    
    Portc.2 = 0                                                 'CS1 auf Low
    Wait 10e-3
    
    Spiinit
    Spiout A , 1                                                'sende Wort (A=65535)
    
    Wait 10e-3
    Portc.2 = 1                                                 'CS1 auf LOW
    
    Wait 5
    
    Loop
    
    End
    Eigentlich bin ich davon ausgegangen, dass der alle 5s zwischen Vmax und 0V am Ausgang hin und her schaltet. Bis jetzt schaltet er aber am Ausgang 1 (mit CS1) auf Vmax und dann bleibt es so.

    Wär cool, wenn du mal ins Programm rein schaust, ich schätze du kannst mir sagen, wo der fehler liegt.
    Dann habe ich noch eine Anmerkung zu deinem 3. Punkt: in der SoftSPI kann man glaub ich die Clockrate gar nicht einstellen, auf jeden fall steht dazu in der Bascom Hilfe nichts drin, und wenn ich das mache wie bei der HardSPI gibt's ne Fehlermeldung.

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Mit der Clockrate hast du recht, kann man "soft" garnicht einstellen. Aber da hab ich keine Sorge, soooo schnell ist das auf Soft eh nicht.

    Sieht soweit unverdächtig aus, das muss aber heissen
    SPIOUT A, 2
    es sollen ja zwei Bytes werden. So gescheit ist der Befehl nicht.

    statt
    Wait 10e-3
    verwende lieber
    Waitms 1
    ich glaub, da trickst du ihn sonst aus, glaub ich

    versuch' mal, und ich bin morgen wieder online
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Morgen Robert!
    Hab deine Änderungsvorschläge mal eingebaut, und jetzt funzts, super geil!
    Hab mal mit ein paar werten rumgespielt, das entspricht aber noch nicht so ganz dem, wie ich mir das vorgestellt habe. Das ist aber schätze ich weniger ein programmfehler, z.B.
    zuerst hab ich einfach mal einen variablenwert von 65535 ausgegeben, dann müssten alle stellen "1" sein, und die höchsten vier sogar schon wieder ausgesschoben werden. das passt auch soweit, am ausgang ist die referenzspannung.
    hier hab ich übrigends herausgefunden, dass das MSB zuerst eingeschoben wird, also brauche ich die shift funktion gar nicht mehr, weil die 4 höchsten bits von den 16 eh zuerst kommen und wieder raus geschoben werden. dann hab ich nachher genau die 12 drin, die ich haben möchte.
    bei 12 bit wäre ja der maximale wert 4095, also müsste dieser den DA-Wandler doch auch mit lauter 1en füllen, und ich wieder Vref am Ausgang haben. Da komm ich aber nicht ganz drauf, liegt etwa 0,2V drunter.
    Bei 0 kommt auch 0V raus, das passt, aber wenn ich als wert 2048 raus gebe kommt auch ca. null raus, erwartet hätte ich ja irgendwie Vref/2. soviel negativen offset kann doch wohl so ein Wadler nicht haben, oder, und wenn ich 3071 als wert eingebe was ja 3/4 von max (4095) entspricht dachte ich, müsst ich auch etwa 3/4 (75%) von Vref haben, da kommt aber dann schon 94%von Vref an, hmmm.

    Dann hab ich noch eine Frage zu rechenvorgängen in bascom: kann ich nicht mehrere rechenvorgänge in einem (in einer zeile z.B. VarA=(VarB*4)/VarC) machen? hab das mal versucht, da gabs nur fehlermeldungen, und hab das dann in mehreren zeilen gelöst: z.B. VarA=VarB*4 und in der nächsten Zeile VarA=VarA/VarC

    Gruß
    Christian

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Moin ! Na fein, wenn der SPI-Part funzt !
    Jetzt kommt's zu den Feinheiten:
    Du hast als Wert ein WORD, d.s 16 Bit bzw 2 Byte, das gewünschte MSB ist 2^^11
    Das wird vom µC (und auch am PC) folgendermassen gespeichert
    Code:
    2^^7 , 2^^6 , 2^^5 ...... 2^^0              erstes Byte
    2^^15 , 2^^14 , 2^^13  , 2^^12  , 2^^11 .... , 2^^8    zweites byte
    Wir haben gesagt, wir schicken einfach 16 Bit mit MSB first, d.h. wir müssen mit dem 2. Byte beginnen und dann das 1.

    empfohlen:
    Code:
    DIM byte1 AS BYTE
    DIM byte2 AS BYTE
    DIM val  AS WORD AT byte1 OVERLAY  
    
        val = 2048               ' 0 - 4095
    
        Portc.2 = 0                       ' CS1 setzen 
        SPIOUT  byte2, 1              ' Bit 15 - BIT 8
        SPIOUT  byte1, 1              ' Bit 7 - BIT 0
        Portc.2 = 1                       ' CS1 clear
    jetzt sollten wir bessere Ergebnisse haben

    (00000 und FFFFFF) stimmt natürlich immer
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •