Re: mehrere Frequenzen messen/zählen Kategorie: Programmierung Basic (von Michi - 30.12.2010 17:59) | ||
Als Antwort auf Re: mehrere Frequenzen messen/zählen von Michi - 30.12.2010 17:55 | ||
| ||
> > > > > > > > > Hallo, > > > > > > > > > > > > > > > > > > Kann der Pro32 eigendlich mehrere Frequenzen messen als über die 2 Timer? > > > > > > > > > > > > > > > > > > Ich müsste Frequenzen von 1 bis ca 400HZ messen und frage mich ob ich das nicht auch über > > > > > > > > > die normalen Ports kann. > > > > > > > > > > > > > > > > > > Mein Gedankengang (umbau der FRQ Messungs Demo): > > > > > > > > > > > > > > > > > > Sub FRQ_Messung() > > > > > > > > > > > > > > > > > > Dim irqcnt As Integer > > > > > > > > > Dim isit As Byte > > > > > > > > > > > > > > > > > > If FRQ_Mode=0 Then > > > > > > > > > If cnt1=0 Then > > > > > > > > > FRQ_Werta=0 > > > > > > > > > isit=0 > > > > > > > > > Timer_T1CNT() > > > > > > > > > End If > > > > > > > > > If cnt1=100 Then > > > > > > > > > > > > > > > > > > FRQ_Wert=Timer_T1GetCNT() > > > > > > > > > > > > > > > > > > FRQ_Mode=1 > > > > > > > > > End If > > > > > > > > > End If > > > > > > > > > cnt1=cnt1+1 > > > > > > > > > > > > > > > > > > If Port_ReadBit(16) <> isit Then 'flanke prüfen > > > > > > > > > FRQ_Werta= FRQ_Werta+1 'wenn flanke da war dann zählen (das wird dann warscheinlich f x2 > > > > > > > > > 'ergeben) > > > > > > > > > isit = Port_ReadBit(16) 'merken wo das Signal war > > > > > > > > > End If > > > > > > > > > > > > > > > > > > irqcnt=Irq_GetCount(INT_TIM2COMP) > > > > > > > > > > > > > > > > > > > > > > > > > > > End Sub > > > > > > > > > > > > > > > > > > geht das oder hab ich schon wieder einen Knopf drinnen. > > > > > > > > > > > > > > > > > > Danke für eure Geduld. > > > > > > > > > > > > > > > > Hallo Michi, > > > > > > > > > > > > > > > > bei 400Hz mü�te der Interrupt mindestens alle 2,5 ms aufgerufen > > > > > > > > werden. (1Sekunde / 400 Hz = 2.5) > > > > > > > > > > > > > > > > Gru� Torsten > > > > > > > > > > > > > > Danke Torsten, > > > > > > > > > > > > > > Stimmt. > > > > > > > der Timer läuft ja im "Hintergrund" weiter.... bis eben cnt=100 (10ms x 100) > > > > > > > > > > > > > > Gibts eine andere Möglichkeit wie ich einen Eingang zählen lassen kann? > > > > > > > > > > > > > > Kann ich in der "Do While FRQ_Mode=0" Schleife zählen? > > > > > > > > > > > > > > Die sollte doch 1 Sekunde aktiv sein. > > > > > > > > > > > > > > Meine Haupftfrage währe aber ob ein Eingang überhaupt schnell genug ist um bis 400HZ gezählt zu werden. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Hallo Miche, > > > > > > > > > > > > die Frage ist nicht ob der Port schnell genug ist, sondern > > > > > > ob du den Port schnell genug abfragen kannst ohne einen > > > > > > Flankenwechsel zu verpassen. Wenn das ganze Programm > > > > > > nur aus der Portabfrage in der Hauptschleife besteht sollte > > > > > > es noch schnell genug gehen. Aber ... ??? > > > > > > Wie viele Frequenzen sollen gleichzeitig gemessen werden? > > > > > > Können die Frequenzen nicht auch nacheinander gemessen werden? > > > > > > Wie werden die ermittelten Werte weiterverarbeitet? > > > > > > > > > > > > Gru� Torsten > > > > > > > > > > > > > > > Ich müsste max. 4 Frequenzen zählen > > > > > alle unter 400HZ > > > > > Wenn ich die Demo richtig verstehe dann bleibt sie in einer Do While hängen bis > > > > > die Torzeit zuende ist. > > > > > Wenn ich nun vergleichbar mit den Frequenz-messdemo mittels Interrupt INT_TIM2COMP > > > > > eine Torzeit von 500 bis 1000ms erzwinge und dann in der Schleife die Eingänge zähle > > > > > sollte ich doch schnell genug sein.? > > > > > > > > > > technisch müsste ja: > > > > > > > > > > If Port_ReadBit(16) <> isit Then > > > > > ++FRQ_Werta > > > > > isit = Port_ReadBit(16) > > > > > End If > > > > > > > > > > reichen. 4 x eben, für jeden Eingang extra. > > > > > > > > > > Ansonsten müsste ich den Timer Eingang multiplexen und hätte dann mindestens 4x500ms > > > > > +Schaltzeit "Pause" bis ich auswerten kann. > > > > > > > > > > Code: > > > > > Sub FRQ_Messung() > > > > > > > > > > If FRQ_Mode=0 Then > > > > > If cnt1=0 Then > > > > > FRQ_Werta=0 > > > > > isit=0 > > > > > End If > > > > > If cnt1=50 Then > > > > > FRQ_Mode=1 > > > > > End If > > > > > End If > > > > > ++cnt1 > > > > > Irq_GetCount(INT_TIM2COMP) > > > > > End Sub > > > > > > > > > > Sub counter() > > > > > > > > > > Do While FRQ_Mode=0 > > > > > > > > > > If Port_ReadBit(16) <> isit Then > > > > > ++FRQ_Werta > > > > > isit = Port_ReadBit(16) > > > > > End If > > > > > If Port_ReadBit(17) <> isit Then > > > > > ++FRQ_Werta > > > > > isit = Port_ReadBit(17) > > > > > End If > > > > > If Port_ReadBit(18) <> isit Then > > > > > ++FRQ_Werta > > > > > isit = Port_ReadBit(18) > > > > > End If > > > > > If Port_ReadBit(19) <> isit Then > > > > > ++FRQ_Werta > > > > > isit = Port_ReadBit(19) > > > > > End If > > > > > End Sub > > > > > > > > > > Sub main() > > > > > Do While True > > > > > cnt1=0 > > > > > > > > > > FRQ_Mode=1 > > > > > Irq_SetVect(11,FRQ_Messung) > > > > > FRQ_Mode=0 > > > > > counter() 'Torzeit routine > > > > > . > > > > > . > > > > > . > > > > > ... ' "langsame" Programmteile > > > > > > > > > > > > > > > End Sub > > > > > > > > > > Ob nun im Counter Sub eine For Next oder 4x if schneller ist weis ich nicht. > > > > > Die Weiterverarbeitung ist dann nicht so kritisch da ich ja bei so niedrigen Frequenzen sowieso > > > > > Torzeitbedingt nur alle 0,5s Daten bekomme. > > > > > > > > Nachtrag: > > > > > > > > Die Variablen "FRQ_Werta" und "isit" ändern sich natürlich. > > > > End While hab ich auch vergessen :-( > > > > > > Hallo Michi, > > > > > > zwei kleine Anmerkungen: > > > Du liest zweimal den Port zu unterschiedlichen Zeiten! > > > Erst vergleichst du und nach dem zweiten lesen speicherst du den Wert des Portes. > > > 1. da das Zweite lesen später erfolgt kann der Port schon einen anderen Wert angenommen > > > haben als zuvor bei der Abrage! > > > 2. Ich könnte mir vorstellen, dass es zeitkritisch künstiger ist erst den Wert des Portes zu speichern > > > und dann zu vergleichen mit der Variablen. > > > Zum Laufzeittest hat ErnstH ein kleines Messprogramm vorgestellt das hier hilfreich sein kann. > > > > > > Viel Spass noch und einen guten Rutsch..... > > > Manfred > > > > > > > > > Danke > > > > Du meinst also so: > > > > If Port_ReadBit(16) <> isit Then > > isit = Port_ReadBit(16) > > ++FRQ_Werta > > End If > > > > Oder: > > > > Sub counter() > > > > Do While FRQ_Mode=0 > > > > Portbyte=Port_Read(1) 'snapshot vom gesamten Port > > For i=0to4 > > If Portbyte>>i <> Oldbyte>>i Then 'die 4 Bit vergleichen und weiterschieben > > Select Case i 'wenn flanke war dann wert inkementieren > > Case 0 'Dynamisch Variablennamen gehen ja nicht > > ++FRQ_Wert1 'ala FRQ_Wert&i > > Case 1 > > ++FRQ_Wert2 > > Case 2 > > ++FRQ_Wert3 > > Case 3 > > ++FRQ_Wert4 > > End Case > > End If > > Next > > Oldbyte = Portbyte > > End While > > > > Muss mal zu testen beginnen..... Brauch aber 4 Generatoren damit ich auch asynchron testen kann. > > Wirft ein Shift eigendlich das Byte um oder verschiebt er nur "virtuell"? > > > > Hab nun einen Mega 32 zur hand genommen (war eigendlich eingebaut und der neue noch nicht da...) > > mit: > If Port_ReadBit(16) <> isit Then > isit = Port_ReadBit(16) > ++FRQ_Werta1 > End If > If Port_ReadBit(16) <> isit1 Then > isit1 = Port_ReadBit(16) > ++FRQ_Werta2 > End If > If Port_ReadBit(18) <> isit2 Then > isit2 = Port_ReadBit(18) > ++FRQ_Werta3 > End If > If Port_ReadBit(16) <> isit3 Then > isit3 = Port_ReadBit(16) > ++FRQ_Werta4 > End If > > innerhalb einer Torzeit-Schleife aus INT_TIM2COMP siehe "FRQ_Messung.cprj" > > > kann ich problemlos bis 400HZ messen, bei einer Torzeit von 500ms hab ich -+1Digit Genauigkeit. > Das entspricht der Genauigkeit des Timer0 eingangs. > > Bei ca 500 HZ ist Schluss an den Eingängen, es könnte an den Eingängen selbst liegen da auch eine > längere Torzeit nichts an den folgenden Messfehlern ändert. (Bei 600HZ fehlen 30HZ) > > Ich kann also auf 4 Eingängen parallel 4 Frequenzen bis 400HZ messen und habe die 2 Timer frei > für höhere Frequenzen. > > Guten Rutsch > michi Nachtrag: Das ganze hab ich in ein kleines Programm eingebaut welches 5755byte Bytecode hat, also nicht in klinischer Umgebung. | ||
Antwort schreiben Antworten: Re: mehrere Frequenzen messen/zählen (von ManfredP - 30.12.2010 20:27) Re: mehrere Frequenzen messen/zählen (von Michi - 31.12.2010 10:38) Re: mehrere Frequenzen messen/zählen (von ManfredP - 31.12.2010 13:30) Re: mehrere Frequenzen messen/zählen (von Torsten - 1.01.2011 12:33) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum