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 14:17)
Als Antwort auf Re: mehrere Frequenzen messen/zählen von ManfredP - 30.12.2010 13:09
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"?



    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)