PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wie verschicke ich 12bit per spi??



drivepro82
09.09.2008, 09:50
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

PicNick
09.09.2008, 13:25
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.

drivepro82
10.09.2008, 08:50
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

PicNick
10.09.2008, 09:13
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

drivepro82
10.09.2008, 09:53
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ß

PicNick
10.09.2008, 12:18
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

drivepro82
10.09.2008, 17:03
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:



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.

PicNick
10.09.2008, 18:39
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 :-)

drivepro82
11.09.2008, 10:12
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

PicNick
11.09.2008, 10:27
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


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:


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

drivepro82
11.09.2008, 11:27
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

PicNick
11.09.2008, 11:59
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

drivepro82
11.09.2008, 13:08
Ä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:




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.

PicNick
11.09.2008, 13:12
Ich seh, du hast 12 Impulse je Umdrehung, ja, das geht dann wohl.
Ich rühr mich

drivepro82
11.09.2008, 13:46
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

drivepro82
11.09.2008, 14:13
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:


$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.

PicNick
11.09.2008, 14:22
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

PicNick
11.09.2008, 14:28
Wie sophisticated soll es denn werden ?
Man könnte einen "umschaltpunkt" festlegen. darunter Zeit je Impuls, darüber Impulse je Zeit.

drivepro82
11.09.2008, 15:24
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

drivepro82
14.09.2008, 21:27
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

PicNick
15.09.2008, 07:37
Die mögliche Grenze wird durch die Anzahl der Befehle in der ISR bestimmt. Das kann man noch um Einiges verbessern.

drivepro82
16.09.2008, 18:36
Hallo mal wieder!
ISR ist die Interrupt Sub-Routine?? Wenn das so wär, dann würd ich verstehen, was du geschrieben hast, da ich ja fast mein ganzes programm da drin hab, ist das entsprechend langsam, sollte man also extra machen, und in die sub-routinnen so wenig wie möglich.
na gut, aber mein programm ist vom prinzip her schon ungeeignet, wie ich feststellen musste. ich muss die berechnungszeit viel zu groß machen, um eine vernünftige auflösung von 2,5 1/min hin zu kriegen (das wären 0,25s, möchten aber mit 10ms rechnen), schließlich kann ich das ungefähr mit den DACs auflösen bei 0bis 10000 1/min.
Dann muss ich also das Prinzip ändern und nicht impulse in einer festgelegten Zeit, sondern festgelegte Impulse und dann die Zeit messen.
Ich würde das dann gestaffelt machen, dass ich am amfang die zeit für einen Impuls zum nächsten messe und ab einer bestimmten drehzahl die zeit für mehrere impulse.
Bleibt erstmal nur die Frage: Wie kann ich die Zeit zwischen zwei impulsen bestimmen? Die Timer/Counter funktion kann nur ereignisse zählen, oder?, es müsste also was sein, was mit einem Impuls startet, mit dem nächsten wieder stoppt, und die zeit dann in ner variablen speichert.
Kannst du mir noch mal helfen?