Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: mehrere Frequenzen messen/zählen Kategorie: Programmierung Basic (von ManfredP - 31.12.2010 13:30)
Als Antwort auf Re: mehrere Frequenzen messen/zählen von Michi - 31.12.2010 10:38

> > > > > > > > > > > > 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.
> >
> > Hallo Michi,
> > vorhin meinte ich den Aufbau so:
> >
> > Wert = Port_ReadBit(16)
> > If Wert <> isit Then
> >     isit = Wert
> >     ++FRQ_Werta1
> >  End If
> >
> > Ich bin sicher das die EingÀnge mehr als 500Hz können!
> > Probiere es mal nur mit der Abrage nur eines Eingangs.
> > Sollte die messbare Frequenz höher liegen, bremst dich wohl die
> > Software aus.
> >
> > Gruß, Manfred
>
> NatĂŒrlich können die EingĂ€nge physikalisch mehr aber ich wĂŒsste nicht (ausser mit Assambler)
> wie ich den Mega 32 dazu bringen könnte diese auch schnell genug zu lesen.
> Selbst bei der "richtigen" Frequenzmessung" schafft er es nur knapp innerhalb der 10ms die Routine
> abzuarbeiten, ein paar If Schleifen und er hat schon Messfehler.
>

Hallo Michi,
ich hatte mal vor einiger Zeit einige Taktmessungen vorgenommen.
Die Angaben sind ca. Angaben!!!!

PortRead     ca. 365 Takte
PortReadBit ca.420 Takte
If <>            ca. 310 Takte
b1=b2          ca. 155 Takte
b1=b1+1      ca. 290 Takte
b1++           ca. 220 Takte

Assembleraufruf  ca.  80Takte  (ohne Inhalt)

Ich denke, dass bei dieser Aufgabe nicht viel in einer Hochsprache drin steckt.
Das Incrementieren benötigt ca. 220 Takte, in Assembler (ich sag mal vorsichtig) 1 - 5 Takte.
Dazu addieren sich einmalig: der Aufruf, eventuel Registersicherungen usw.
Sicher, bei komplexeren Aufgaben ist der Unterschied lange nicht so ĂŒberragend.

Gruß, Manfred



    Antwort schreiben


Antworten:

Re: mehrere Frequenzen messen/zählen (von Torsten - 1.01.2011 12:33)