Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: If Anweisung reagiert falsch Kategorie: Programmierung Basic (von Daneie - 17.04.2016 13:03)
Als Antwort auf Re: If Anweisung reagiert falsch von HPausL - 15.04.2016 21:25

> Hallo zusammen,
> eigentlich wollte ich nur eine Menü Steuerung schreiben die,
> wenn sie am oberen Ende(OGR) angekommen ist von neuen am unteren Ende(UGR) neu startet.
> Ebenso anders herum.
>
> Mit positiven Zahlen ist das kein Problem.
> Mit negativen schon. Wieso? Ich hab da keine Erklärung.
> Jetzt kommt ihr ins Spiel.
> Kann mich bitte jemand aufklären was ich falsch mache.
>
> In der Funktion Sub MINUS() habe ich die UGR(Untergrenze) nochmals an die
> lokale Variable u (Integer) übergeben.
> Wenn ich nun in der folgenden IF Anweisung u anstatt UGR benütze, funktioniert es.
> Wird an dieser Stelle aber UGR anstatt u programmiert, reagiert die If Anweisung falsch
>
> Kurios ist, wenn ich in der Funktion Sub Plus() durchzähle und über 2 komme,
> wird die OGR aktiv, setzt y auf UGR (-2) und inkrementier munter weiter.
> Hier scheint es zu funktionieren, und es ist kein nochmaliges umladen der
> �bergabe Variable OGR nach z.B. o nötig. hmmmmm
>
> WIIIEEESOOO?????
>
> Hier mein Code: (keine Leerzeilen etc. ist nur ein Test)
> Board: C-Control Pro AVR32
>
> Dim ERG As Integer
> Sub main()
>     Port_Attribute(PORT_T5, PORT_ATTR_INPUT)
>     Port_Attribute(PORT_T4, PORT_ATTR_INPUT)
>     Port_Attribute(PORT_LED1, PORT_ATTR_OUTPUT Or PORT_ATTR_INIT_LOW)
>     Port_Attribute(PORT_LED2, PORT_ATTR_OUTPUT Or PORT_ATTR_INIT_LOW)
>     Do While True
>         If Port_ReadBit(PORT_T5) = False Then
>             ERG = Plus(2,-2,ERG)
>         End If
>         Port_WriteBit(PORT_LED1, PORT_OFF)
>         If Port_ReadBit(PORT_T4) = False Then
>             ERG = Minus(2,-2,ERG)
>         End If
>         Port_WriteBit(PORT_LED2, PORT_OFF)
>         Msg_WriteInt(ERG)
>         Msg_WriteChar(13)
>         AbsDelay(100)
>     End While
> End Sub
> Sub Plus(OGR As Integer, UGR As Integer, x As Integer) As Integer
>     Dim y As Integer
>     y = x + 1
>     If y > OGR Then
>         y = UGR
>     Else ' nicht unbedingt nötig
>         y = y ' dto.
>     End If
>     Port_WriteBit(PORT_LED1, PORT_ON) ' nur zum prüfen ob ich in die richtige Funktion springe
>     AbsDelay(100)
>     Return y
> End Sub
> Sub Minus(OGR As Integer, UGR As Integer, x As Integer) As Integer
>     Dim y As Integer
>     Dim u As Integer
>     u = UGR ' hier wird UGR "NOCHMALS" an u übergeben
>     y = x - 1
>     If y < u Then ' Mit UGR reagiert die If Anweisung falsch. Mit u funktioniert es. Wieso???
>         y = OGR
>     Else ' nicht unbedingt nötig
>         y = y ' dto.
>     End If
>     Port_WriteBit(PORT_LED2, PORT_ON) ' nur zum prüfen ob ich in die richtige Funktion springe
>     AbsDelay(100)
>     Return y
> End Sub
>
> Vielen Dank schon mal im Voraus, ein verzweifelter HPausL ;-))

Hallo HPausL,

das mit dem Minus ist so. Hat mich auch schon geärgert.
Ich verstehe auch nicht warum du bei einer Menüsteuerung durch Null durch musst.

Aber du solltest lieber Romane schreiben, bei so einen Talent was in die Länge zu ziehen.

Das macht das gleiche wie Deines!

Dim ERG As Integer
Sub main()
    Dim X As Integer
    Port_Attribute(PORT_T5, PORT_ATTR_INPUT)
    Port_Attribute(PORT_T4, PORT_ATTR_INPUT)
    Do While True
        If Port_ReadBit(PORT_T5) = False Then
            ERG++
            If ERG > 2 Then
               ERG = -2
            End If
        End If
        If Port_ReadBit(PORT_T4) = False Then
            ERG--
            X = -2
            If ERG < X Then
               ERG = 2
            End If
        End If
        Msg_WriteInt(ERG)
        Msg_WriteChar(13)
        AbsDelay(100)
    End While
End Sub



Und dann hier noch eine Variante bei der die Taste auch richtig funktionieren (entprellt und man kann auch lange drücken)

Dim ERG, vTZ4, vTZ5 As Integer
Sub main()
    Dim X As Integer
    Port_Attribute(PORT_T5, PORT_ATTR_INPUT)
    Port_Attribute(PORT_T4, PORT_ATTR_INPUT)
    Do While True
      If Port_ReadBit(PORT_T5)= 0 Then 'beim Tastendruck wird der Port 0
         vTZ5 ++                       'der zähler wird um 1 erhöht
      End If
      If vTZ5 = 5 Then                 'wenn die Taste 5 Durchläufe gedrückt war
         ERG++                         'Tastenbefehle
         If ERG > 2 Then
            ERG = -2
         End If
      End If
      If Port_ReadBit(PORT_T5)= 1 And vTZ5 > 5 Then 'wurde die Taste wieder losgelassen
          vTZ5 = 0   'wird die Variable für den nächten Tastendruck auf null gesetzt
      End If
      If Port_ReadBit(PORT_T4)= 0 Then
         vTZ4 ++
      End If
      If vTZ4 = 5 Then
         ERG--
         X = -2
         If ERG < X Then
            ERG = 2
         End If
      End If
      If Port_ReadBit(PORT_T4)= 1 And vTZ4 > 5 Then
          vTZ4 = 0
      End If
      Msg_WriteInt(ERG)
      Msg_WriteChar(13)
      AbsDelay(10)
    End While
End Sub


Tastenabfrage sollte aber in grö�eren Programmen im 100Hz Interrupt laufen.

Grü�e Daneie




    Antwort schreiben


Antworten:

Re: If Anweisung reagiert falsch (von Daneie - 17.04.2016 13:12)
    Re: If Anweisung reagiert falsch (von HPausL - 17.04.2016 13:28)
        Re: If Anweisung reagiert falsch (von Torsten - 17.04.2016 16:01)
            Re: If Anweisung reagiert falsch (von PeterS - 20.04.2016 19:26)
                Re: If Anweisung reagiert falsch (von Danei - 20.04.2016 21:04)
                    Re: If Anweisung reagiert falsch (von UlliS - 2.05.2016 11:53)
            Re: If Anweisung reagiert falsch (von HPausL - 18.04.2016 15:26)