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 Michi - 30.12.2010 17:55)
Als Antwort auf Re: mehrere Frequenzen messen/zählen von Michi - 30.12.2010 14:17
Ich nutze:
C-Control Pro Mega32, CC-Pro 32 Application Board
> > > > > > > > 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


    Antwort schreiben


Antworten:

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)