Re: mehrere Frequenzen messen/zählen Kategorie: Programmierung Basic (von Michi - 30.12.2010 14:17) | ||
Als Antwort auf Re: mehrere Frequenzen messen/zählen von ManfredP - 30.12.2010 13:09 | ||
| ||
> > > > > > > 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"? | ||
Antwort schreiben Antworten: Re: mehrere Frequenzen messen/zählen (von Michi - 30.12.2010 17:55) Re: mehrere Frequenzen messen/zählen (von Michi - 30.12.2010 17:59) 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