- 3D-Druck Einstieg und Tipps         
Seite 6 von 10 ErsteErste ... 45678 ... LetzteLetzte
Ergebnis 51 bis 60 von 92

Thema: Howto Frequenzzähler

  1. #51
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Teslanikola,

    wenn Du schon dabei bist Deinen Code zu überarbeiten...

    Zwei Fragen...

    1. warum verwendest Du für die Variable Freq den Datentyp integer?
    negative Frequenzen tauchen nur mathematisch bei komplexen Rechnungen im Frequenzbereich auf. Real gibt es sie nicht.

    2. wenn "Tim = counter ( timer1) und die anzahl der Überläufe*255"
    wieso dann im Code "Tim = Var2 * 1024"
    Abgesehen davon, Timer1 hat wieviele bits? und
    nach wievielen Zähl-Takten kommt es zu einem Überlauf bei einem 8 o. 16bit Timer?

    Da Du inzwischen sicher einiges an Deinem Code geändert hast, postest Du den aktuellen nochmal?

    > ach sch*** das erklärt auch die var1 = 9 then ...
    > muss eigentlich so heisen
    > If var1 = 38 then ... ( anzahl der überläufe zur Sek)

    stimmt. 38 ist sehrviel näher dran als als 9.
    Es geht noch näher, aber das besprechen wir wenn Dein Code erstmal läuft. Genauso wie man Berechnungen ala "Überläufe * 256" elegant umgehen kann. Multiplikation brauchen immer unangenehm viel Rechenzeit.

    Ciao,
    Werner

  2. #52
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    So Update 1.2 is fertig, währe das jezt IO,hab au die Multipikation weggekriegt.
    Code:
    $regfile = "2313def.dat"
    Dim Var1 As Byte
    Dim Var2 As Byte
    Dim Freq As Word
    
    
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Counter , Edge = Rising
    Config Pinb.5 = Input
    
    Portb.5 = 0
    
    On Timer0 Test1
    On Timer1 Test2
    
    Enable Interrupts
    
    Mess:
    
    Timer0 = 126
    Timer1 = 0
    
    
    Start Timer0
    Start Timer1
    
    Do
    ' Hier Zeige ich freq an
    Loop
    
    
    Test1:
    
    Incr Var1
    
    If Var1 = 38 Then
    
      Freq = Timer1
    
      Freq = Var2 + Freq
    
      Var1 = 0
      Var2 = 0
    
      Stop Timer0
      Stop Timer1
    
      Goto Mess
      End If
    
    
    
    Return
    
    
    Test2:
    
    Var2 = Var2 + 256
    
    Return
    Gruß teslanikola

  3. #53
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Teslanikola,

    nette Idee das mit dem Var2 = Var2 + 256
    lassen wir es vorerst dabei. Wie man das elegant macht kommt später.

    Mein "Lappsus" ist immer noch drin. Siehe Post von "Gast".
    OnTimer0/1 schaltet nicht den Interrupt ein! Es sagt nur wohin gesprungen werden soll wenn der Interrupt denn eingeschaltet, freigegeben und aufgetreten ist.

    Dann wird Deine Frequenz doch sicher > 65kHz werden. Wolltest Du nicht bis zu 1-2 MHz messen?

    Was passiert wenn Du zu einer Byte-Variablen 256 dazu addierst?

    Eine Interrupt Routine wird nur und immer nur mit Return verlassen (ultra wichtig!) . Man springt NIEMALS mit einem Goto aus einer Interupt Routine.
    Hintergrund: der µC speichert die Stelle im Programm, von dem aus er in die Interrupt-Routine gesprungen ist auf dem Stack. Dort schaut er beim Return auch nach, wohin er zurück springen soll und löscht dann den Eintrag im Stack wieder. Wenn Du mit einem GOTO aus der Interrupt Routine springst, werden die Daten auf dem Stack nicht gelöscht. Der Stack belegt immer mehr Speicher und irgendwann überschreibt er den vom Programm genutzten Speicher. Das Ergebnis ist, der µC hängt sich auf.


    So, kann Montag werden bis ich wieder online bin. Vielleicht auch mal kurz irgendwann am Wochenende. Weiß ich noch nicht.

    Ciao,
    Werner

  4. #54
    DanTheMan
    Gast

    Oh bitte...

    Hi Teslanikola,

    Also, wenn ich den Thread schon vorher gesehen hätte, hätte ja gleich am Anfang gesagt:

    Lies http://www.lugbz.org/documents/smart-questions_de.html!
    Da steht z.B. nochmal drin, wieso dir wohl kaum jemand den kompletten Code schreiben wird...

    Und lerne Englisch: wie willst du denn jemals ein Datenblatt lesen können und jemals die einfachsten Schaltungen bauen können?

    Ich bin ja auch Anfänger, aber ich habe herausgefunden, dass man, wenn man mal ein AVR Datenblatt liest doch relativ weit kommt...
    Dann muss man noch gucken wie die Befehle in Basic heißen und schon bekommt man zumindest mal den Code zusammen...

    Naja und dann gehört es doch wohl dazu das man seinen Code zumindest mal simuliert, ob jetzt im Kopf und auf Papier, oder mit dem mitgelieferten Simulator...

    Zeig doch mal ein bisschen mehr Engagement!

    Viele Grüße,

    Daniel

  5. #55
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470

    Update1.3

    Servus, hab eure Ips mal eingebaut, außer das mit Goto hab nen Kom. dazugeschrieben, kann sein das ihr das ja nicht verstandenhabt was ich damit will.
    Code:
    $regfile = "2313def.dat"
    Dim Var1 As Byte
    Dim Var2 As Word
    Dim Freq As Word
    
    
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Counter , Edge = Rising
    Config Pinb.5 = Input
    
    Portb.5 = 0
    
    On Timer0 Test1
    On Timer1 Test2
    
    Enable Interrupts
    
    Mess:
    
    Timer0 = 126
    Timer1 = 0
    
    
    Start Timer0
    Start Timer1
    
    Do
    ' Hier Zeige ich freq an
    Loop
    
    
    Test1:
    
    Incr Var1
    
    If Var1 = 38 Then
    
      Freq = Timer1
    
      Freq = Freq + Var2
    
      Var1 = 0
      Var2 = 0
    
      Stop Timer0
      Stop Timer1
    
      Goto Mess                                                 'soll nur bei Var1 = 38 zu Mess Springen, wenn man hier kein goto MESS setzten darf , wo/wie dann
      End If
    
    
    
    Return
    
    
    Test2:
    
    Var2 = Var2 + 256
    Return
    Danke für eure Hilfe

  6. #56
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470

    Update1.4

    Servus, hab den Multiplex auch mit eingebaut:
    Code:
    $regfile = "2313def.dat"
    Dim Var1 As Byte
    Dim Var2 As Word
    Dim Freq As Word
    Config Portb = Output
    Config Portd = Output
    Dim A As Byte
    Dim S As String * 5
    Dim X As Byte
    Dim Pos As Byte
    Dim Z As String * 1
    Dim L As Byte
    Dim W As Long
    
    
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Counter , Edge = Rising
    Config Pinb.5 = Input
    
    Portb.5 = 0
    
    On Timer0 Test1
    On Timer1 Test2
    
    Enable Interrupts
    
    Mess:
    
    Timer0 = 126
    Timer1 = 0
    
    
    Start Timer0
    Start Timer1
    
    Do                                                          ' Anzeige Multiplex
    
        S = Str(freq)
        L = Len(s)
    
    For A = 0 To 10
    For X = 1 To L
    
          S = Str(w)
          Pos = L - X
          Pos = Pos + 1
          Z = Mid(s , Pos , 1)
    
        If Z = "0" Then Portb = 63
        If Z = "1" Then Portb = 34
        If Z = "2" Then Portb = 94
        If Z = "3" Then Portb = 118
        If Z = "4" Then Portb = 99
        If Z = "5" Then Portb = 117
        If Z = "6" Then Portb = 125
        If Z = "7" Then Portb = 38
        If Z = "8" Then Portb = 127
        If Z = "9" Then Portb = 119
    
        If X = 1 Then Portd = 1
        If X = 2 Then Portd = 2
        If X = 3 Then Portd = 4
        If X = 4 Then Portd = 8
        If X = 5 Then Portd = 16
    
        If L = 1 Then Waitus 99813
        If L = 2 Then Waitus 49906
        If L = 3 Then Waitus 33271
        If L = 4 Then Waitus 24953
        If L = 5 Then Waitus 19963
    
    Next X
    Next A
    
    Loop
    
    
    Test1:
    
    Incr Var1
    
    If Var1 = 38 Then
    
      Freq = Timer1
    
      Freq = Freq + Var2
    
      Var1 = 0
      Var2 = 0
    
      Stop Timer0
      Stop Timer1
    
      Goto Mess                                                 'soll nur bei Var1 = 38 zu Mess Springen, wenn man hier kein goto MESS setzten darf , wo/wie dann
      End If
    
    
    
    Return
    
    
    Test2:
    
    Var2 = Var2 + 256
    
    Return
    Gruß teslanikola

  7. #57
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124

    Re: Update1.3

    Halllo Teslanikola

    Servus, hab eure Ips mal eingebaut, außer das mit Goto hab nen Kom. dazugeschrieben, kann sein das ihr das ja nicht verstandenhabt was ich damit will.
    und Du hast nicht verstanden das das nicht geht!
    Mit dem Goto läuft Dein Stack über und der µC schmiert ab!

    Der Sprung zurück zum Lable Mess: muß daher ins Hauptprogramm. Oder Du verzichtest auf den Sprung und setzt die Timer in der Interrupt Routine neu.


    Wie Du das machst ist eigentlich egal, solange Du nicht mit einem GOTO aus der Interrupt-Routine springst! z.B. kannst Du eine Abfrage ala If Var1=38 then goto Mess: in die Do-Loop-Schleife einbauen.



    [Daniel schrieb:]
    > Zeig doch mal ein bisschen mehr Engagement!
    und lies gründlich und vollständig was geschrieben wird.

    Es tut schon fast weh, wenn nach dem 3. Hinweis auf den Beitrag von "Gast" immernoch die beiden Zeilen:

    [ nach reiflicher Überlegung gelöscht]

    fehlen.



    Servus, hab den Multiplex auch mit eingebaut:
    nichts für ungut, aber wir sollten noch beim Code-ohne-Multiplexer bleiben. Es wird sonst leicht etwas unübersichtlich.

    Ciao,
    Werner

  8. #58
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470

    Aber jetzt

    So endlich hab ichs, nach den vielen Tipps; das GOTO ist raus, ich hab den Befehl RETURN verwendet und ein paar Kleinichkeiten verändert. Wenn das jetzt so laufen würde ohne das mir die µC abschmiert oder sonst was passiert was nicht soll bin ich wahnsinnig GLÜCKLICH ( ich betonte WENN)
    Code:
    $regfile = "2313def.dat"
    Dim Var1 As Byte
    Dim Var2 As Word
    Dim Freq As Word
    Config Portb = Output
    Config Portd = Output
    Dim A As Byte
    Dim S As String * 5
    Dim X As Byte
    Dim Pos As Byte
    Dim Z As String * 1
    Dim L As Byte
    Dim W As Long
    
    
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Counter , Edge = Rising
    Config Pinb.5 = Input
    
    Portb.5 = 0
    
    On Timer0 Test1
    On Timer1 Test2
    
    Enable Interrupts
    
    
    Timer0 = 126
    Timer1 = 0
    
    
    Start Timer0
    Start Timer1
    
    Do                                                          ' Anzeige Multiplex
    
    Loop
    
    
    Test1:
    
    Incr Var1
    
    If Var1 = 38 Then
    
      Freq = Timer1
    
      Freq = Freq + Var2
    
      Var1 = 0
      Var2 = 0
    
      Stop Timer0
      Stop Timer1
      Timer0 = 126
      Timer1 = 0
      Start Timer0
      Start Timer1
    
      Return
                                                  'soll nur bei Var1 = 38 zu Mess Springen, wenn man hier kein goto MESS setzten darf , wo/wie dann
      End If
    
    Return
    
    
    Test2:
    
    Var2 = Var2 + 256
    
    Return
    PS:
    Es tut schon fast weh, wenn nach dem 3. Hinweis auf den Beitrag von "Gast" immernoch die beiden Zeilen:

    [ nach reiflicher Überlegung gelöscht]

    fehlen.
    Hallo werner-just haste mir schon viel geholfen, und das ich die langsam nerve ist mir auch klar! Sorry

  9. #59
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.02.2005
    Alter
    36
    Beiträge
    470
    Hallo werner, hab noch was vergessen:
    Es tut schon fast weh, wenn nach dem 3. Hinweis auf den Beitrag von "Gast" immernoch die beiden Zeilen:
    Will nicht frech sein , aber es sind DREI.
    Code:
    $regfile = "2313def.dat"
    Dim Var1 As Byte
    Dim Var2 As Word
    Dim Freq As Word
    Config Portb = Output
    Config Portd = Output
    Dim A As Byte
    Dim S As String * 5
    Dim X As Byte
    Dim Pos As Byte
    Dim Z As String * 1
    Dim L As Byte
    Dim W As Long
    
    Enable Interrupts
    Enable Timer0
    Enable Timer1
    
    
    
    Config Timer0 = Timer , Prescale = 1024
    Config Timer1 = Counter , Edge = Rising
    Config Pinb.5 = Input
    
    Portb.5 = 0
    
    On Timer0 Test1
    On Timer1 Test2
    
    Enable Interrupts
    
    
    Timer0 = 126
    Timer1 = 0
    
    
    Start Timer0
    Start Timer1
    
    Do                                                          ' Anzeige Multiplex
    
    Loop
    
    
    Test1:
    
    Incr Var1
    
    If Var1 = 38 Then
    
      Freq = Timer1
    
      Freq = Freq + Var2
    
      Var1 = 0
      Var2 = 0
    
      Stop Timer0
      Stop Timer1
      Timer0 = 126
      Timer1 = 0
      Start Timer0
      Start Timer1
    
      Return
                                                  'soll nur bei Var1 = 38 zu Mess Springen, wenn man hier kein goto MESS setzten darf , wo/wie dann
      End If
    
    Return
    
    
    Test2:
    
    Var2 = Var2 + 256
    
    Return

  10. #60
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo Teslanikola

    Code:
    Enable Timer0
    Enable Timer1
    ich hatte die Hoffnung schon fast aufgegeben die beiden Zeilen in Deinem Code zu sehen.

    > Will nicht frech sein, aber es sind DREI.
    Welche ist die Dritte? "Enable Interrupts" hab ich nicht vermisst, die hattest Du ja

    Ciao,
    Werner

Seite 6 von 10 ErsteErste ... 45678 ... LetzteLetzte

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress