Warum funktioniert "const LED = 1.0" und "const LED = 1" nicht?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Warum funktioniert "const LED = 1.0" und "const LED = 1" nicht?

      Hi,

      in der BASCOM-Hilfe steht nichts davon das eine Zahl für eine Konstante eine Kommastelle haben soll, und bei 1,0 finde ich die ,0 auch überflüssig. Oder habe ich irgendwas übersehen warum "const LED = 1" nicht funktioniert?

      BASCOM-Quellcode

      1. ' Compiler: Bascom-Demo 2.0.7.5
      2. ' --- Mikrocontroler Daten -------------------------------------------------------------------------------------
      3. $regfile = "attiny84.dat"
      4. $crystal = 1000000
      5. $hwstack = 40
      6. $swstack = 40
      7. $framesize = 40
      8. const LED = 1.0
      9. config portb.0 = output : LED_1 alias portb.0
      10. config portb.2 = output : LED_2 alias portb.2
      11. do
      12. if LED = 1 then
      13. toggle LED_1
      14. else
      15. toggle LED_2
      16. end if
      17. waitms 333
      18. loop
      19. end
      Alles anzeigen
      Grüßle, Naubaddi
    • Eine Konstante im Programm für eine spätere Entscheidung zu nehmen ist nicht nötig.
      Die Entscheidung musst du ja nicht mehr zur Laufzeit machen.

      Für solche Sachen gibt es eine Compilerdirelktive, das Raute-Zeichen:
      #if Led = 1
      Toggle Led_1
      #else
      Toggle Led_2
      #endif

      Alternativ kannst du die Konstante im Programm in eine Variable packen und die dann mit If abfragen:

      Dim X As Bit
      Const Led = 1
      X = Led

      If X = ... usw
    • Ja, es geht auch anders, was mein Verständnis warum es mit const so ist nicht verbessert ;-).

      Das Programm oben war als Beispiel gedacht um es so kurz wie möglich zu halten, das Programm worum es geht sieht so aus:

      BASCOM-Quellcode

      1. ' Compiler: Bascom-Demo 2.0.7.5
      2. '
      3. ' Dateiname: Taster Poti Display.avr
      4. ' Funktion: Es werden die Werte von einem Taster und einem Poti auf einem Display angezeigt, der Wert vom
      5. ' Taster ist 0 für nicht gedrückt und 1 für gedrückt, der Wert von getadc() ist 0-1023 und vom
      6. ' Poti 0-10,000K.
      7. ' Datum: Start 22.02.2022, Stand 22.02.2022
      8. ' Von: Naubaddi foto-schubser@arcor.de
      9. '
      10. ' --- Mikrocontroler Daten -------------------------------------------------------------------------------------
      11. $regfile = "attiny84.dat" : const uC = 2.0
      12. ' $regfile = "attiny44.dat" : const uC = 3.0
      13. ' $regfile = "m8def.dat" : const uC = 4.0
      14. $crystal = 1000000
      15. $hwstack = 40
      16. $swstack = 40
      17. $framesize = 40
      18. ' --- Deklarationen... -----------------------------------------------------------------------------------------
      19. config adc = single , prescaler = auto , reference = avcc
      20. #if uC = 2 or uC = 3
      21. config porta = output
      22. config lcdpin = pin , Db4 = porta.2 , Db5 = porta.3 , Db6 = porta.4 , Db7 = porta.5 , E = porta.0 , Rs = porta.1
      23. config porta.6 = input : Taster alias pina.6
      24. config porta.7 = input : ADC_v alias getadc(7)
      25. #else
      26. config portd = output
      27. config lcdpin = pin , Db4 = portd.2 , Db5 = portd.3 , Db6 = portd.4 , Db7 = portd.5 , E = portd.0 , Rs = portd.1
      28. config portc.6 = input : ADC_v alias getadc(6)
      29. config portc.7 = input : Taster alias pinc.7
      30. #endif
      31. ' const LCD_Art = 1.0
      32. dim LCD_Art as byte : LCD_Art = 2
      33. if LCD_Art = 1 then : config lcd = 16 * 2 : end if
      34. if LCD_Art = 2 then : config lcd = 20 * 4 : end if
      35. cursor off : cls
      36. ' --- Variablen... ---------------------------------------------------------------------------------------------
      37. dim Wert as string * 6
      38. dim ADC_v_alt as word : ADC_v_alt = 1111
      39. dim Taster_alt as bit
      40. dim dumm_w as word
      41. dim dumm_s as single
      42. ' --- Programm Anfang ------------------------------------------------------------------------------------------
      43. locate 1,1 : lcd " Taster: 0 "
      44. locate 2,1 : lcd " Poti: K "
      45. if LCD_Art = 2 then
      46. locate 3,1 : lcd " ADC: v "
      47. locate 4,1 : lcd " Platz fuer Werbung "
      48. end if
      49. do
      50. if Taster <> Taster_alt then
      51. if Taster = 1 then
      52. Taster_alt = 1
      53. locate 1,14 : lcd "1"
      54. else
      55. Taster_alt = 0
      56. locate 1,14 : lcd "0"
      57. end if
      58. end if
      59. dumm_w = ADC_v
      60. dumm_s = dumm_w * 9.775171065
      61. dumm_w = dumm_s
      62. Wert = str(dumm_w)
      63. if ADC_v <> ADC_v_alt then
      64. locate 2,9
      65. lcd format(Wert, " 0.000")
      66. end if
      67. dumm_w = ADC_v
      68. Wert = str(dumm_w)
      69. if ADC_v <> ADC_v_alt then
      70. if LCD_Art = 2 then
      71. locate 3,11
      72. lcd format(Wert, " ")
      73. end if
      74. end if
      75. ADC_v_alt = ADC_v
      76. loop
      77. ' --- Programm Ende --------------------------------------------------------------------------------------------
      78. end
      79. ' --------------------------------------------------------------------------------------------------------------
      Alles anzeigen
    • Wie gesagt, solche Konstanten abfragen machst du mit der Compilerdirektive.
      Da die Konstante schon beim Programmanfang bekannt ist, ist die If-Abfrage zur Laufzeit sinnlos.
      #if Lcd_art = 1
      Config LCD 16x2
      ...
      #endif
      #if Lcd_art = 2
      Config LCD 20x4
      ...
      #endif

      Warum soll der Compiler das mitcompilieren, das per Const nicht zutrifft?

      Anders sieht es bei mathematischen Sachen aus:

      Const Korr = 0.234
      Temp = Adwert * Korr
      If Temp > 12 Then ...

      Da wird mit der Constanten und einer Variable gerechnet und die Variable dann abgefragt.
    • Du hast ja recht, es war nicht optimal es mit zu kompilieren.

      Bisher waren Konstanten bei Berechnungen Kommazahlen, irgendwann wenn eine Konstante ohne Komma gebraucht wird würde ich wieder darüber stolpern weil ich es nicht verstanden habe warum es so ist. Darum meine Frage warum das so ist.
      Auch verstehe ich nicht warum es bei "#if" funktioniert und bei "if" nicht, und solange ich es nicht verstanden habe ist das jetzige Wissen in ein paar Wochen wieder weg. So war es auch beim "Timer", erst als es mir mit den Sicherungen erklärt wurde war der Groschen gefallen.

      Grüßle, Naubaddi
    • Auch wenn es sinnlos ist sollte es funktionieren. Mann könnte diese Fehlermeldung als "Hier wird Flash verschwendet" deuten. ein Variabeln Vergleich funktioniert ohne murren:

      Quellcode

      1. $regfile = "attiny84.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 40
      5. $framesize = 40
      6. Const Led = $01
      7. config portb.0 = output : LED_1 alias portb.0
      8. config portb.2 = output : LED_2 alias portb.2
      9. Dim B As Byte
      10. 'B = Led 'das würde auch funktionieren
      11. do
      12. If Led = B Then
      13. toggle LED_1
      14. else
      15. toggle LED_2
      16. end if
      17. waitms 333
      18. Incr B
      19. loop
      20. End
      Alles anzeigen
    • Morjen,

      Pluto25 schrieb:

      Auch wenn es sinnlos ist sollte es funktionieren. Mann könnte diese Fehlermeldung als "Hier wird Flash verschwendet" deuten...
      O.K., mein Programm war nicht ordentlich gestaltet, darauf hat mich Michael ja direkt zu Anfang hingewiesen. Mit einer Fehlermeldung wie "Hier wird Flash verschwendet" und es wird trotzdem kompiliert wäre es mir aufgefallen, die Fehlermeldung war "Variable not dimensioned [2]" und "IF THEN expected". Was soll ein Laie mit so einer Fehlermeldung anfangen, er verzweifelt an der Sache und sucht in einer falschen Richtung.

      Vielen Dank Michael für Deinen Hinweis auf die nicht optimale Schreibweise und vielen Dank Pluto25 für die Info "auch wenn es..." und "Hier wird Flash..."!

      Grüßle, Naubaddi