Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > > > > > > > > > > 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 > > > > > > > > > > <b> > > > > > > > > > > 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 > > > > > > > > > > </b> > > > > > > > > > > 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.