Display über SPI

    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!

    • ...eben. Den Wert von 1000 habe ich einfach besispielhaft genommen. Du kannst auch die Bereichsgrenze eines Word, DWord oder sonstwas eintragen.
      Nur ist es eben so, dass diese Prüfungen verhindern, dass Werte erreicht werden, welche außerhalb des Wertebereichs deiner Variable liegen.

      Dieses Thema hatte ich in einem kleinen Beitrag auch behandelt und in der ISR eben die Bereichsgrenzen Prüfung drin
      bascomforum.de/index.php?threa…rementalgeber-on-the-fly/
      Code first, think later - Natural programmer :D
    • ich habe Deinen schon früher gemachten Vorschlag mit dem Flag mal probiert, leider mit negativem Ergebnis.
      Ich weiß nicht, wie ich es begründen, oder prüfen kann, ich habe den Eindruck, dass mir die pcint-isr das ganze zerschiesst.
      Bei max. 6,25U/sec sind das also 3125Striche/s also 6250 pcint`s,
      ich vermute, dass die die main so zerstückeln, dass der Flag ausgeschaltet wird.
      Wie gesagt, ich kann das nicht beweisen/begründen, aber die Ergebnisse ohne Flag sind öfters plausibler, als ohne Flag.
      Ich bin nur noch nicht dahntergekommen, an welcher Stelle der Mist passiert.

      Defacto ist es für das Programm der Spulenwickelmaschine nicht relevant, mit dem Programm möchte ich ja nur die Beschleunigungsrampe (welche ich programmiert habe) überprüfen, und leider stimmen die Ergebnisse nicht unbedingt mit der Theorie überein, der Schrittmotor beschleunigt langsamer als er sollte, (rechnerisch sollte er nach 3 Umdrehungen auf Nenndrehzahl sein, in der Praxis sind es etwa 4 Umdrehungen)
      Ist prinzipiell auch kein Problem, aber wie schon erwähnt, es interessiert mich halt, hinter solche Abweichungen zu kommen, erhöht auch im Laufe der Versuche das Verständnis.
      (Mein Geld könnte ich damit wahrscheinlich nicht verdienen)
      Als nächstes will ich mal probieren, die Betriebsspannung zu erhöhen, viellecht wird ja der Nennstrom /Phase nicht erreicht, also erstmal versuchen die Hardware zu optimieren.
      Gruß
      Hans
    • Zeig doch mal deine Version mit dem flag.
      Mit deinem Drehgeber könntest du ja auch den timer als counter verwenden. Die Drehrichtungserkennung ist ja nicht relevant, nur die Strichzahl. Wenn du die Strichzahldifferenz/Zeit berechnest, kannst du die U/s errechnen. Die Zeit kann ja dann auch 50ms oder 100ms sein, dann hast du weniger interrupts. Halt noch die interrupts, wenn der counter überläuft und die Anzahl der Überlaufe gezählt wird.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wenn du den timer1 nimmst, als counter und nach 499 einen interrupt auslöst (compare1a, kombiniert mit clear timer=1), dann kannst du in der isr gleich die ganzen Umdrehungen mittzählen und brauchst die nicht aus den Schritten errechnen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hallo,

      habe jetzt 2 Tage probiert und das Programm soweit abgespeckt wie möglich.

      Ich konnte mal den Fehler auf Zeile 124 eingrenzen, ohne sicher zu sein, dass es wirklich daran liegt.
      Aber wenn ich diese Zeile aktiviere, tritt irgendein Berechnungsfehler auf, welcher mir das Programm stoppt (springt aus der Do loop until Schleife, obwohl die Bedingung noch nicht erfüllt ist, deaktiviere ich diese Zeile, läuft es problemlos durch.
      Ich bin etwas ratlos


      Quellcode

      1. 'Bascom ATmega328
      2. 'LCD 20x4a
      3. 'Drehzahleingang über ROD 426, 500 Striche
      4. '
      5. $regfile = "m328pdef.dat"
      6. $crystal = 16000000
      7. $hwstack = 64
      8. $swstack = 64
      9. $framesize = 48
      10. Baud = 9600
      11. '---------------------------------------------------------------------------------
      12. 'Definition LCD
      13. '---------------------------------------------------------------------------------
      14. Config Lcd = 20x4a , Chipset = Ks077
      15. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.5 , Rs = Portc.4
      16. Config Lcdbus = 4
      17. Waitms 200
      18. Initlcd
      19. Cursor Off
      20. '---------------------------------------------------------------------------------
      21. 'Definition der Ein- und Ausgänge
      22. '---------------------------------------------------------------------------------
      23. Config Pind.1 = Input 'Inkrementalgeber Kanal B
      24. Config Pind.4 = Input 'Inkrementalgeber Kanal A (Trigger)
      25. '---------------------------------------
      26. 'Definition der Variablen
      27. '---------------------------------------
      28. Dim N_ist As Single
      29. Dim Striche As Long
      30. Dim Strich_alt As Long
      31. Dim Strich_neu As Long
      32. Dim Strich_diff As Long
      33. Dim U_sec As Single
      34. Dim U_sec_alt As Single
      35. Dim Flag As Byte
      36. Striche = 0
      37. Strich_neu = 0
      38. Strich_alt = 0
      39. Strich_diff = 0
      40. U_sec_alt = 0
      41. Flag = 1
      42. '
      43. '---------------------------------------
      44. 'Definition Interrupt's
      45. '---------------------------------------
      46. Enable Pcint2
      47. Pcmsk2 = &B00010000 'Pind.4
      48. On Pcint2 Pcint20_isr
      49. '--------------------------------------------------
      50. 'Configuration Timer1 (16bit)
      51. '---------------------------------------------------
      52. Config Timer1 = Timer , Prescale = 64
      53. On Timer1 Isr_timer1
      54. Dim Preload As Word
      55. Preload = 53036 '50ms
      56. Timer1 = Preload
      57. '---------------------------------------
      58. 'Configuration der ALIAS
      59. '---------------------------------------
      60. Kanal_a Alias Pind.4 'Pcint Inkrementalgeber Kanal A
      61. Kanal_b Alias Pind.1 'Inkrementalgeber Kanal B
      62. Enable Interrupts
      63. Cls
      64. Locate 1 , 1
      65. Lcd "N Ist = "
      66. Locate 2 , 1
      67. Lcd "Striche = "
      68. Locate 1 , 14
      69. Do
      70. N_ist = Striche / 500 'Long/500
      71. Loop Until N_ist > 1000
      72. Disable Timer1
      73. Lcd Fusing(n_ist , "#.##")
      74. Locate 2 , 14
      75. Lcd Striche
      76. End
      77. '---------------------------------------
      78. 'Interruptbearbeitung
      79. '---------------------------------------
      80. '---------------------------------------
      81. 'Takterzeugung für den Schrittmotor (Wickelspindel)
      82. '---------------------------------------
      83. Isr_timer1:
      84. If Striche > 1 Then
      85. Strich_alt = Strich_neu 'Long=Long
      86. Strich_neu = Striche 'Long=Long
      87. Strich_diff = Strich_neu - Strich_alt 'Long=Long-Long
      88. U_sec_alt = U_sec 'single=Single
      89. U_sec = Strich_diff / 25 'Long/25
      90. Timer1 = Preload
      91. End If
      92. Return
      93. '------------------------------------
      94. 'Strichzähler ROD
      95. '------------------------------------
      96. Pcint20_isr:
      97. If Kanal_a = 1 Then 'steigende Flanke Kanal A => isr wird bearbeitet
      98. If Kanal_b = 1 Then 'Linkslauf = Vorwärts
      99. Incr Striche
      100. If Flag = 1 Then
      101. Enable Timer1
      102. Flag = 0
      103. End If
      104. Else 'Rechtslauf = Rückwärts
      105. 'Decr Striche 'Zähler läuft rückwärts
      106. End If
      107. End If
      108. Return
      Alles anzeigen
      Display_5.jpg
      Zeile 124 auskommentiert, funktioniert immer, kein Zufallstreffer


      Display_6.jpg
      Zeile 124 aktiv, Ergebnis kommt bereits nach wenigen Umdrehungen, Ergebnis nicht reproduzierbar, Fehler kommt zuverlässig
      Gruß
      Hans

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Hans_L ()

    • Zeile 96-99
      im Originalprogramm steht da natürlich mehr drin, aber ich habe Zeile für Zeile gelöscht und probiert, wo es hakt.
      In der Form macht das Programm nichts anderes mehr, als Die Striche des Drehgebers zu zählen und durch 500 zu teilen (=Umdrehungen)
      Die fragliche Zeile 124 soll die Drehzahl pro Zeit ermitteln, und an der hängt es offensichtlich, bzw. wenn ich deise Zeile deaktiviere, läuft das Programm ohne Fehler
      Gruß
      Hans
    • Ohne es genau zu wissen: Wie lange läuft denn die Berechnung mit den Single Variablen? Wenn ich mich nicht verrechnet habe dann ist die Timer ISR alle 50ms fällig. Wenn Du innerhalb der Laufzeit zur Berechnung der Variablen ein Interrupt Auftritt, dann könnte das ein Thema sein - schließlich wetteifern der Timer und der Pin Change um die Ausführung.
      Zudem könnte es knapp werden mit dem Stack, wenn 2 ISR die Register sichern (jeweils 32 Register, SREG und die Rücksprungadresse).
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • monkye schrieb:

      Ohne es genau zu wissen: Wie lange läuft denn die Berechnung mit den Single Variablen? Wenn ich mich nicht verrechnet habe dann ist die Timer ISR alle 50ms fällig.
      das ist richtig (50ms) wie lange die läuft? weiß ich nicht, sollte aber doch bei 50ms kein Problem sein, oder?
      wie kann ich das denn messen?
      Gibt es eine einfache Möglichkeit den Registerbedarf zu ermitteln?
      Gruß
      Hans
    • Ja @Hans_L, die 50ms reichen bestimmt. Wenn Du den Knopf schnell drehst schaffst Du bestimmt 300-500 Pulse, das wären dann 2-3 ms pro Puls.
      Aber bei der zeitlichen Überschneidung von Timer- und Pin Change Interrupt könnte es zeitlich knapp werden. Obwohl... Du gibst zwar den Timer frei, aber nicht die Interrupts - das ist dann doch seriell in der Abarbeitung.

      Hast Du mal versucht die Stackwerte größer zu machen?
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Hans_L schrieb:

      monkye schrieb:

      Du gibst zwar den Timer frei, aber nicht die Interrupts
      Zeile 85 ? reicht das nicht?
      Ja, sobald die ISR vom Pin Change Interrupt durch ist kann der Timer wieder den Interrupt zünden.

      Im ersten (leider oberflächlichen) Augenblick dachte ich erst das Du auch die (globalen) Interrupts freigegeben hast - mein Fehler.
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.