- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Finde Fehler nicht

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Anzeige

    Praxistest und DIY Projekte
    Ich weiß zwar nicht ob darin das Problem liegt, aber in diesem Teils des Codes fallen zwei Dinge auf:
    Code:
    Led:     Hallimpuls = 0     On Int0 Zaehlen     If Hallimpuls = 0 Then     Toggle Portd.1
    1. Wenn Du in der ersten Zeile die Variable Hallimpuls auf 0 setzt, brauchst D zwei Zeilen später nicht abzufragen, ob sie auch tatsächlich 0 ist
    (das ist aber nur ein "Schönheitsfehler" und dürfte keine Fehlfunktionen nach sich ziehen)

    2. Das Statement "On Int0 Zaehlen" sollte vor die Hauptschleife, denn es muss nur ein einziges mal deklariert werden, welche ISR beim entsprechenden Interrupt ausgeführt werden soll.
    Wenn Du damit erreichen wolltest dass der Interrupt0 als solches aktiviert werden soll, wäre "Enable Int0" der richtige Befehl. Erst nach dieser Anweisung ist der Interrupt "scharf".

    Außerdem sehe ich das gleiche Problem wie Tido: Das Unterprogramm LED wird nach jeweils 10 Hallsensor-Impulsen gleich wieder aufs neue ausgeführt, weil die Bedingung "Stunde = 0 und Minute = 1 (bzw. 3) ja weiterhin erfüllt ist.

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    20.05.2012
    Beiträge
    22
    Dank für die Antwort.
    Außerdem sehe ich das gleiche Problem wie Tido: Das Unterprogramm LED wird nach jeweils 10 Hallsensor-Impulsen gleich wieder aufs neue ausgeführt, weil die Bedingung "Stunde = 0 und Minute = 1 (bzw. 3) ja weiterhin erfüllt ist
    Ich dachte Timer läuft weiter und Bedingung Stunde = 0 Minute =1 bzw 3 ist nur einmal erfüllt ist.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Natürlich ist die Bedingung nur "einmal" erfüllt -aber das für eine ganze Minute lang! Und während dieser Zeit wird die Hautschleife schätzungsweise ein paar Millionen male durchlaufen, und jedes mal wird das Unterprogramm ausgeführt!

    Und der Timer läuft sowieso weiter...

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    20.05.2012
    Beiträge
    22
    Danke, aber dann müsste das Led sofort wieder anfangen zu leuchten und nicht aus bleiben ??? Habe ja das Problem dass es ausgeht und nach der definierten Zeit ( hier 3. Minute )nicht wieder an geht !! Oder habe ich einen Denkfehler ??? Werde wahrscheinlich umdrehungsabhängige Motorenabschaltung aufgeben und zeitgesteuterte verwenden.

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Werde wahrscheinlich umdrehungsabhängige Motorenabschaltung aufgeben
    Das wäre aber schade, denn (fast) jede Aufgabe lässt sich in Bascom realisieren!

    Vielleicht beschreibst Du nochmal etwas genauer, was denn genau passieren soll? Bislang ist zwar von einem Motor, dann aber wieder von an- und ausgehenden LEDs die Rede - und die Bedeutung der 1 und 2 Minuten (die manchmal ja auch 3 sein können) erschließt sich auch noch nicht so ganz...

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    20.05.2012
    Beiträge
    22
    Ich will einen Uhrenbeweger steuern. D.h. Die Uhren brauchen eine bestimmte Anzahl an Umdrehungen z.B 650/ Tag in ca. 6 Drehperioden zeitlich unregelmässig aufgeteilt über den Tag. Z.B. Stunde 00 Minute 1 - Motor starten 108 Umdrehungen Motor aus. Dann z.B. Stunde = 3 Minute = 0 Motor an 108 Umdrehungen Motor aus . Stunde = 4 Minute = 8 ........ Danke für Deine Mühe !!!

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    20.05.2012
    Beiträge
    22
    Ausserdem sollte er auch noch die Drehrichtung Nach jeder Periode, als Periode 1 108* links . Periode 2 108* rechts usw. Wahrscheinlich für einen Anfänger wie mich zu komplex. Wollte zweite sub mit anderer Drehrichtung schreiben.

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von hunikuni Beitrag anzeigen
    Danke, aber dann müsste das Led sofort wieder anfangen zu leuchten und nicht aus bleiben ???
    Das gezeigte Verhalten rührt daher, da die LED nicht über Reset im Else-Zweig ausgeschaltet wird, sondern über Toggle, da nach 10 Impulsen die Sub verlassen, aber sofort erneut angesprungen wird. Bei diesem zweiten Mal wird also die LED ausgeschaltet. Da aber wahrscheinlich dann keine Hallimpulse mehr kommen, hängt es von da an in der Do/Loop und kann natürlich auch nicht auf die dritte Minute reagieren. Du kannst das überprüfen, indem Du nach Ablauf der ersten Minute genügend Hallimpulse erzeugst, damit die Loop verlassen wird. Danach wirst Du sehen, dass die LED bei Minute 3 angeht. Der Fehler wäre Dir einfacher klar geworden, wenn Du statt Toggle ein Set verwendet hättest.

  9. #19
    Neuer Benutzer Öfters hier
    Registriert seit
    20.05.2012
    Beiträge
    22
    Danke für eure Mithilfe. Ich Glaube jetzt funktionietrs. Habe folgende Ergänzungen und Umstellungen vogenommen:

    Code:
    'Bascom Hallsensor test
    
    $regfile = "m328pdef.dat"
    $crystal = 20000000                                         'Quarzfrequenz
    $hwstack = 32
    $framesize = 64
    $swstack = 32
    
    
     On Int0 Zaehlen
    Config Pind.1 = Output
    
    
    
    'Timer und der Teiler festlegen 10ms
    Config Timer0 = Timer , Prescale = 1024
    On Timer0 Timer_irq
    Const Timervorgabe = 175
    Config Int0 = Rising
    Enable Int0
    
    
    
    
    Enable Interrupts
    
    Dim Hallimpuls As Integer
    Dim Cnt As Byte
    Dim Sekunde As Byte
    Dim Minute As Byte
    Dim Stunde As Byte
    Dim Sekunde_last As Byte
    
    
    Hallimpuls = 0
    Stunde = 0
    Minute = 0
    Sekunde = 0
    Enable Timer0
    
    
    
    Do
    
    
    
    
          ' 1. Minute
            If Stunde = 0 And Minute = 1 And Sekunde = 0 Then Gosub Led
          ' 2. Minute
            If Stunde = 0 And Minute = 3 And Sekunde = 1 Then Gosub Led
    
    
    
    Loop
    
    
    
    Led:
         Hallimpuls = 0
        
         If Hallimpuls = 0 Then
          Portd.1 = 1
    
          Do
    
          Idle
          Loop Until Hallimpuls = 10
        Else
    
         Portd.1 = 0
    End If
    Return
    
    
    
    
    
    Zaehlen:
    
    Incr Hallimpuls
    
    Return
    
    
    Timer_irq:
    Timer0 = Timervorgabe
    
       Incr Cnt
    
        If Cnt = 50 Then
           Portb.6 = 0
        End If
    
        If Cnt = 100 Then
           Portb.6 = 1
    
           Sekunde = Sekunde + 1
           If Sekunde = 60 Then
              Sekunde = 0
              Minute = Minute + 1
              If Minute = 60 Then
                 Minute = 0
                 Stunde = Stunde + 1
                 If Stunde = 24 Then
                    Stunde = 0
                 End If
              End If
           End If
           Cnt = 0
        End If
    Return

    Dank eurer Tips scheint es zu funktionieren !!

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Na siehst Du - es geht doch

    Neben dem Toggeln war der Knackpunkt vermutlich, dass die Subroutine "LED" immer wieder auf´s neue ausgeführt wurde, so lange die aktuelle Minute noch nicht rum war - das hast Du jetzt scheinbar dadurch gelöst, dass Du die Zeit sekundengenau abfragst (und die 10 Hallimpulse anscheinend länger als 1 Sekunde brauchen).

    Grundsätzlich (und Zeit-unabhängiger!) kann man so ein Problem auch mit einem "Flag" lösen, wie es Tido schon angedeutet hat:
    Ein Flag ist ein einzelnes Bit, mit dem man sich bestimmte Zustände sozusagen "merken" kann. In diesem Beispiel etwa so:

    Immer wenn eine neue Minute beginnt, setzt Du das Flag in der entsprechenden ISR auf 1 (also hinter dem Befehl Minute = Minute + 1).
    Die Abfrage machst Du dann so: If Stunde = XX AND Minute = YY AND Flag = 1 then...
    Am Ende der LED-Subroutine setzt Du dann das Flag wieder auf 0 - damit ist sie dann gesperrt, bis der nächste Minutensprung stattgefunden hat.

    Aber Hauptsache es funktioniert erstmal - der Spaß am Optimieren kommt schon noch ganz von alleine

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Hilfe...finde die fehler nicht heraus
    Von Kuwe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 21.04.2010, 21:29
  2. Antworten: 4
    Letzter Beitrag: 08.01.2008, 20:03
  3. Antworten: 29
    Letzter Beitrag: 07.01.2008, 18:20
  4. ADC - Ich finde den/die Fehler nicht
    Von Christoph2 im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 07.08.2007, 19:34
  5. AVR 90S2313 Problem, und finde nicht den Fehler!
    Von Alex20q90 im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 01.05.2005, 14:20

Berechtigungen

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

LiFePO4 Speicher Test