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:59)
Als Antwort auf Re: mehrere Frequenzen messen/zählen von Michi - 30.12.2010 17:55
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

Nachtrag:  Das ganze hab ich in ein kleines Programm eingebaut welches 5755byte Bytecode hat,
also nicht in klinischer Umgebung.


    Antwort schreiben


Antworten:

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)