- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 21

Thema: Finde Fehler nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    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 !!

  2. #2
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von hunikuni Beitrag anzeigen
    Ich Glaube jetzt funktionietrs.
    Also wenn Du noch anderen Code hast, der mag dann funktionieren, der Gezeigte dürfte das nicht.
    Code:
         Hallimpuls = 0
        
         If Hallimpuls = 0 Then
    folgt ein paar Takte aufeinander und somit wird der Else-Zweig
    Code:
        Else
         Portd.1 = 0
    unter normalen Umständen nie durchlaufen und damit wird die Led auch nicht ausgeschaltet.
    Es gibt nur eine einzige Ausnahme, nämlich wenn der Int0 genau nach
    Code:
    Hallimpuls = 0
    triggert und das dürfte eher nicht der Fall sein, die Wahrscheinlichkeit dafür beträgt eins zu mehreren Millionen.
    So in etwa wär's besser:
    Code:
    Led:
      Disable Int0          ' wird im restlichen Code Int0 nicht erlaubt, so kann dieser Befehl entfallen
      EIFR = Bits(INTF0)    ' löscht anstehende Interrupts
        Hallimpuls = 0
        Portd.1 = 1
          Do
            Enable Int0
              Idle
            Disable Int0
          Loop Until Hallimpuls = 10
        Portd.1 = 0
    Return
    Der Zugriff auf eine Variable größer 8 Bit muss gekapselt werden, sobald ein Interrupt sie verändern kann.
    Einen Fehler daraus würdest Du allerdings bei den gezeigten kleinen Werten nicht bemerken.
    Warum benötigst Du ein Idle ? Batteriebetrieb ?
    Geändert von MagicWSmoke (03.06.2012 um 17:45 Uhr)

Ähnliche Themen

  1. Hilfe...finde die fehler nicht heraus
    Von Kuwe im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 21.04.2010, 20:29
  2. Antworten: 4
    Letzter Beitrag: 08.01.2008, 19:03
  3. Antworten: 29
    Letzter Beitrag: 07.01.2008, 17: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, 18:34
  5. AVR 90S2313 Problem, und finde nicht den Fehler!
    Von Alex20q90 im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 01.05.2005, 13:20

Berechtigungen

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

Labornetzteil AliExpress