- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 19

Thema: Frequenzmesser bis 100Hz

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Dann versuch' Dich mal hiermit:
    Code:
    $regfile = "m32def.dat"
    $crystal = 8000000
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.1 , Db6 = Portd.5 , Db7 = Portd.0 , E = Portd.2 , Rs = Portd.3
    Config Lcd = 16 * 2
    Cursor Off
    
    Const True = 1
    Const False = 0
    Const Measure_success = 0
    Const Measure_failed = 1
    Const Measure_request = 2
    
    Dim Frequency As Long
    Dim Capt_prev_val As Word
    Dim Capt_curr_val As Word
    Dim Measure_result As Long
    Dim Capt_result As Word At Measure_result Overlay           ' Differenz aus Capture beschreibt das Low-Word von Measure_Result
    Dim Ovf_result As Word At Measure_result + 2 Overlay        ' Mit dem Overflowergebnis das High-Word von Measure_Result beschreiben, spart das multiplizieren mit 65536
    Dim Ovf_ctr As Word
    
    Dim F_str As String * 10
    
    ' Variablen zur Ablaufsteuerung
    Dim Got_edge As Byte
    Dim Measure_status As Byte
    
    Config Timer1 = Timer , Prescale = 1                        ' , Noise Cancel = 1     ' , Capture Edge = Falling       ' , Noise Cancel = 1
    
    ' Trigger durch Analogkomperator an Pin4, AIN1, AIN0 an Bandgap Reference 1V
    Config Aci = On , Compare = On
    Acsr.acbg = 1 
    
    On Capture1 Isr_capt Nosave
    Enable Capture1
    
    On Ovf1 Isr_ovf
    Enable Ovf1
    
    Ovf_ctr = 0
    Got_edge = False
    Tifr = Bits(icf1 , Tov1)
    Enable Interrupts
    
    Initlcd
    Cursor Off Noblink
    Cls
    Locate 1 , 1
    Lcd "START"
    Wait 2
    
    Cls
    Do
      Locate 1 , 1
    
      Measure_status = Measure_request
        While Measure_status = Measure_request
        Wend
          If Measure_status = Measure_failed Then
            Lcd "Timeout K.Erg."
          End If
          If Measure_status = Measure_success Then
            If Measure_result > 0 Then
              Measure_result = Measure_result / 10
    '           Frequency = 826787928 / Measure_result           ' Kalibrierung für abweichenden internen RC Oszillator
               Frequency = 830996156 / Measure_result
    '          Frequency = 800000000 / Measure_result
              F_str = Str(frequency)
                Lcd "Freq: " ; Format(f_str , "000.000") ; " Hz"
            Else
              Lcd "Fehler, Ergebnis = 0"
            End If
          End If
        Waitms 50
    Loop
    
    End
    
    Isr_capt:
      PUSH    R22
      LDS     R22,                  ICR1L
      STS     {Capt_curr_val},        R22
      LDS     R22,                  ICR1H
      STS     {Capt_curr_val +1},     R22
      POP     R22
        Pushall
          If Measure_status = Measure_request And Got_edge = True Then       ' Messung angefordert und eine Flanke erkannt ?
            Capt_result = Capt_curr_val - Capt_prev_val         ' Ja, dann Werte übernehmen
              Measure_status = Measure_success
                If Capt_curr_val < Capt_prev_val Then           ' Natürlicher Overflow ?
                  Decr Ovf_ctr                                  ' Bereichsgrenze überschritten, Overflows um 1 erniedrigen
                End If
              Ovf_result = Ovf_ctr
        End If
           Capt_prev_val = Capt_curr_val                        ' Aktuellen CAP-Wert speichern
             Ovf_ctr = 0                                        ' Overflowzähler zurücksetzen
               Got_edge = True
      Popall
    Return
    
    Isr_ovf:
        Incr Ovf_ctr
    '      If Ovf_ctr > 122 Then                                 ' Niedrigste Messfrequenz 1 Hz unterschritten
          If Ovf_ctr > 126 Then                                 ' Korrektur für zu hohe RC Oszillatorfrequenz
            Got_edge = False
              Ovf_ctr = 0
                If Measure_status = Measure_request Then Measure_status = Measure_failed
          End If
    Return
    Edit:
    µC wird momentan mit 'nem 16MHz Quarz betrieben, war noch so im Code gestanden, hab's geändert.
    Musst die Werte halt auf 4MHz Takt anpassen.

    EditEdit:
    Hab' gerad' mal den ATMega8 als µC angegeben, das compiliert ohne Probleme. Es sollte also reichen den Takt auf 4MHz anzupassen, da ist nur:
    Code:
    Frequency = 830996156 / Measure_result
    If Ovf_ctr > 126 Then
    zu ändern. Dann LCD anpassen und der Analog-Comparator-Pin ist auch ein anderer.
    Geändert von MagicWSmoke (10.11.2012 um 18:01 Uhr)

Ähnliche Themen

  1. Frequenzmesser
    Von Matze 3 im Forum PIC Controller
    Antworten: 1
    Letzter Beitrag: 01.03.2012, 11:53
  2. Frequenzgenerator mit Frequenzmesser
    Von Meister Joda im Forum Elektronik
    Antworten: 15
    Letzter Beitrag: 12.08.2010, 17:04
  3. Stimmgerät / Frequenzmesser
    Von EDatabaseError im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 30.03.2007, 13:01
  4. Probleme bei C->Basic Frequenzmesser
    Von EDatabaseError im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 22.09.2006, 14:17
  5. Frequenzmesser mit ATtiny2313
    Von Raven² im Forum AVR Hardwarethemen
    Antworten: 7
    Letzter Beitrag: 18.04.2006, 17:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test