- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 22

Thema: wie verschicke ich 12bit per spi??

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

    Powerstation Test
    Ja super, das ist jetzt optimal!
    Das heißt vorher hat der das 1.Byte mit dem MSB zuerst, und dann das zweite Byte mit dem MSB zuerst reingeschoben. Insgesamt hat er mir dann die 4 höchsten bits des 1.Bytes wieder raus geschoben,und die vier höchsten vom 2.Byte (die ich eigentlich raus haben wollte) waren dann mitten drin.
    witzig
    Sehr cool, dann bau ich das jetzt schon mal in mein komplettes Programm mit ein. Da kommt dann sicher auch noch mal die ein oder andere Frage. Hatte vorhin schon mal wegen dem zeitlichen Ablauf überlegt, muss mir das noch mal anschaun, dann bastel ich das soweit wie ich komme, dann meld ich mich noch mal. Interrupt-routinen laufen immer nebenbei ab, oder, d.h. auch wenn das programm nebenbei noch was anderes macht, oder?
    Kannst du mir noch was zu den berechnungen sagen, was ich beim letzten mal schon geschrieben hatte? Könnt mir damit ein paar variablen und zeilen sparen, insgesamt fänd ich das schöner und übersichtlicher.
    bis später

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich fürchte, da gibt es überhaupt ein Problem:
    Bei 10000/Min würde er >24 sekunden brauchen, um auf die Zahl 4095 zu kommen. Mißt man aber kürzer, wird die Auflösung immer schlechter
    bei 1 sekunde wäre die Auflösung dann 24 (bei 5Vmax also~0,2 V schritte)
    ==> wenn das reicht, isses aber auch ok


    Sonst wäre es wohl besser, die Sache umzudrehen: nicht Impulse je Zeit, sondern Zeit je Impuls

    Da werd' ich mal grübeln
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Ähhhh?
    <<Bei 10000/Min würde er >24 sekunden brauchen, um auf die Zahl 4095 zu kommen...>> nix verstehn

    Am besten schick ich dir gerade mal mein ganzes Programm, dann kannst sehn, was ich gemacht hab:

    Code:
    Config Int0 = Falling                                       'Der Interrupt wird bei fallendem Flankensignal aktiviert
    Config Timer1 = Timer , Prescale = 256
    Const Markierungenproscheibe = 12                           'Hier steht die Anzahl der auf dem Inkrementenrad vorhandenen Markierungen/Löcher
    Const Berechnungszeit = 1                                   'Zeit (in s) für die Berechnung. Das jeweilige Ausgangssignal bleibt die doppelte Berechnungszeit lang konstant
    
    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
    Dim B As Word
    
    
    Dim Impulszaehler As Long                                   'Zaehlt die Impulse der Lichtschranke waehrend der eingestellten Berechnngszeit
    Dim Impulse As Long                                         'in dieser Variablen werden die gezaehlten Impulse für die Berechnung gespeichert
    Dim Umdrehungen_neu As Single                               'enthaelt den neuen berechneten Wert der Umdrehungen innerhalb der Berechnungszeit
    Dim Umdrehungen_alt As Single                               'enthaelt den vorangegangenen Wert der Umdrehungen innerhalb der Berechnungszeit
    
    Dim Umdps1 As Byte
    Dim Umdps2 As Byte
    Dim Umdrehungenprosekunde As Word At Umdps1 Overlay         'enthaelt den aktuellen Drehzahlwert in U/s
    
    Dim Grad1 As Byte
    Dim Grad2 As Byte
    Dim Gradient As Word At Grad1 Overlay                       'enthaelt den Drehzahlgradienten in U/s2
    
    Dim Timertakt As Long                                       'wird nur als Zwischenspeicher gebracht
    Dim Timervorgabe As Single                                  'mit diesem berechneten Wert wird der Timer vorgeladen um die gewuenschte Berechnungszeit zu erreichen
    
    
    Timertakt = 16000000 / 256                                  'In diesen drei Zeilen wird der Wert für die Aufladung des Timers berechnet
    Timervorgabe = Timertakt * Berechnungszeit                  'in der ersten dieser drei Zeilen muss der Wert des Prescalers eingetragen werden!
    Timervorgabe = 65536 - Timervorgabe
    
    Impulszaehler = 0
    Umdrehungen_neu = 0
    
    
    On Int0 Irq0
    Enable Int0
    
    On Timer1 Timer_irq
    Enable Timer1
    
    Enable Interrupts
    
    Do
    
       Umdrehungen_alt = Umdrehungen_neu
       Umdrehungen_neu = Impulse / Markierungenproscheibe
       Umdrehungenprosekunde = Umdrehungen_neu / Berechnungszeit
       Umdrehungenprosekunde = Umdrehungenprosekunde / 16       'Begrenzung der 2Byte (2^16=65536) auf 12bit (2^12=4096)
       Print "Umdrehngen pro Sekunde: " ; Umdrehungenprosekunde
    
          Portc.2 = 0                                           'CS1 auf LOW
             Spiinit
             Spiout Umdps2 , 1                                  ' Bit 15 - BIT 8
             Spiout Umdps1 , 1                                  ' Bit 7 - BIT 0
          Portc.2 = 1                                           'CS1 auf High
    
       Gradient = Umdrehungen_neu - Umdrehungen_alt
       Gradient = Gradient / Berechnungszeit
       Gradient = Gradient / 16                                 'Begrenzung der 2Byte (2^16=65536) auf 12bit (2^12=4096)
       Print "Drehzahlgradient in Umdrehungen/s2: " ; Gradient
    
          Portc.3 = 0                                           'CS1 auf LOW
             Spiinit
             Spiout Grad2 , 1                                   ' Bit 15 - BIT 8
             Spiout Grad1 , 1                                   ' Bit 7 - BIT 0
          Portc.3 = 1                                           'CS1 auf High
    
    Loop
    
    End
    
    
    'Pro Impuls (Markierung auf Scheibe) ein Aufruf
    Irq0:
     Incr Impulszaehler
    Return
    
    
    'wird beim Ablauf der Berechnungszeit aufgerufen
    Timer_irq:
      Timer1 = Timervorgabe
      Impulse = Impulszaehler
      Impulszaehler = 0
      Return

    Ich hab überlegt, dass ich doch eigentlich den ganzen Inhalt der DO...LOOP schleife in das Timer_irq unterprogramm rein legen kann.
    Dann hätte ich doch gewährleistet, dass ich immer am Ende von dem timer (also nach jeder neuen Berechnung) meine Werte ausgeben würde.
    Sosnt könnte es doch auch passieren, das aufgrund irgendwelcher Laufzeiten die Wertausgabe eine Berechnung überspringt, dann käme sowohl die drehzahl als auch der Gradient falsch heraus, da die berechnungszeit dann nicht mehr stimmt.

    Die Berechnungszeit soll später natürlich nicht mehr bei 1s liegen, das ist nur, damit ich im moment noch was erkennen kann. die liegt später bei k.A. vielleicht 1000 Berechnungen pro Sekunde.

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich seh, du hast 12 Impulse je Umdrehung, ja, das geht dann wohl.
    Ich rühr mich
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Ich hab sogar 100 Impulse pro Umdrehung, die 12 war auch nur ein Beispiel
    Aber da hast du mich jetzt natürlich auf was hingewiesen, wenn ich wie ich einfach mal ohne groß zu überlegen gesagt habe, 1000mal in der Sekunde(also jede milisekunde) berechnen will, dann bräucht ich ja pro milisekunde mindestens 2 besser mehr impulse von der lichtschranke. sonst käm ja immer null raus hihi
    also 2 Impulse auf 1ms wären 2000 auf 1s, das wären bei 100Impulse pro umdrehung 20U/s=1200U/min. Das ist natürlich schon ein recht großer minimal messbarer drehzahlwert.
    Wenn ich eine minimaldrehzahl von sagen wir 60U/min messen will, dann kann die berechnungszeit also nur 0,02 sekunden und nicht kürzer sein.
    Soweit so gut, dass sollt ich mir merken, sonst kommt ja nur müll raus.

    Ich hatte ja geschrieben, dass ich die DO...LOOP schleife mal in die unterroutine timer_irq einfügen wollte, hab das mal probiert, nur irgendwie scheint mit die timerzeit jetzt nicht mehr zu passen, der is viel schneller als vorgegeben. Probier noch mal was rum

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Also eigentlich war ich ja davon ausgegangen, dass ich mit dem timer klar komme. ich hab gerade mal folgenden test gemacht mit nem ganz kleinen timerprogramm:
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    $crystal = 16000000                                         'Angabe der Quarzfrequenz
    $baud = 9600
    
    
    
    
    Config Timer1 = Timer , Prescale = 256
    
    Const Timervorgabe = 3036
    
    On Timer1 Timer_irq
    Enable Timer1
    
    Enable Interrupts
    
    
    
    'wird beim Ablauf der Berechnungszeit aufgerufen
    Timer_irq:
      Timer1 = Timervorgabe
    
      Print "in der timerschleife"
      Return
    Nach meinem Verständnis müsste nach jedem Überlaufen des timers, die unterroutine aufgerufen werden, dann würde ich nach dieser einstellung jede sekunde diesen kleinen text "in der timerschleife" im terminalprogramm angezeigt bekommen. das läuft bei mir aber in einem wahnsinns tempo durch.

  7. #17
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wo is'n da DO..LOOP ?
    So wie's aussieht, geht er bei "return" (mangels Interrupt oder call) einfach wieder an den Start.
    Die einzige Bremse ist der Print
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #18
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wie sophisticated soll es denn werden ?
    Man könnte einen "umschaltpunkt" festlegen. darunter Zeit je Impuls, darüber Impulse je Zeit.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Hast recht, das do...Loop fehlte.
    und in dem anderen programm kam der timer nicht mit der variablen (var): Timer1=var klar, die war als single deklariert, als integer gehts aber.
    Ja, dann sieht das ganze doch jetzt gar nicht mal so schlecht aus! Dann schau ich noch mal durch und mach alles etwas übersichtlicher.

    Das mit dem Umschaltpunkt lass ich erst mal weg, kann ich eventuell später noch mal überlegen, möcht das jetzt erst mal so testen

    Vielen dank noch mal, warst mir ne riesen Hilfe, hätt ich sonst nie gepackt!
    Meld mich, wenn ich wieder wo fest stecke
    Bis dann

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    18.05.2008
    Beiträge
    26
    Hallo Robert!
    Jetzt wo ich dachte ich hätts soweit geschafft, kommt doch noch mal eine Frage. Das Programm habe ich meiner Meinung nach fertig. Habe mit vorgegebenen Werten im Programm simuliert, und es hat alles funktioniert.
    Jetzt habe ich heute mal die Lichtschranke in Betrieb genommen und mit einem Motor samt Lochscheibe ein paar tests gemacht. da kam dann ziemlicher schrott bei raus.
    Ist natürlich gut möglich, dass der Signalpegel nicht ganz ausgereicht hat (1,27V Low; 3,24V High), aber der hat auf jeden Fall was gemessen, nur passte das überhaupt nicht, war immer viel zu wenig, als hätte er alls paar signale einfach eins ausgelassen zu zählen. Hab mit einer Signalfrequenz von etwa 250Hz angefangen, und je höer die wurde, desto schlechter das ergebnis, bis irgendwann wieder null angezeigt wurde.
    Sind die Interrupts denn zeitlich so stark begrenzt, können die nicht so hohe Frequenzen, immerhin müssten die bei mir mit maximal 10.000/60*100=16kHz signal klar kommen.
    Komisch fand ich ja auch, dass ich nur werte bekommen hab, wenn ich parallel zum Interrupt-eingang das sigal mim Oszi messe. Ohne bleibts null.
    Naja, werds noch mal mit nem vernünftigen eingangssignal versuchen, aber wenn du was zur maximalfrequenz von Interrupts weißt, hab da im datenblatt nix gefunden.
    Gruß christian

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen