RC-Steuerung: Instabiler Betrieb

    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!

    • RC-Steuerung: Instabiler Betrieb

      Hallo,

      ich versuche gerade, mit einem der µC von Atmel ein paar Funktionen für meine RC-Modelle (Schiff) zu realisieren. Für meine ersten (Geh-)Versuche habe ich mir die Beleuchtung eines kleinen Kutters vorgenommen. Da geht es erst einmal nur um 4 Schaltzustände:
      • Ankerlicht (wenn Boot vor Anker liegt)
      • Decksbeleuchtung (zusätzlich zum Anker-Licht, aber nicht während der Fahrt)
      • Positionslichter bei Fahrt
      • Suchscheinwerfer (zusätzlich zu Positionslichtern)
      Auf dem Experimentierbrett klappte das nach einiger Zeit, so dass ich eine passende Platine fürs Modell gemacht habe. Auch da läuft alles bestens in der Werkstatt. Im realen Betrieb tritt nun das Problem auf, dass der Controller ab und an ganz verrückte Signalbilder schaltet, die ich so gar nicht vorgesehen habe. Das Verhalten ist insofern recht gut (aber nicht immer) reproduzierbar, wenn ich den Drehzahlsteller dazu bringe, seine Überlastsicherung zu aktivieren (der Drehzahlsteller erzeugt auch die 5V-Versorgungsspannung für Empänger und µC). Ich stelle dann den Motor auf Null, der Steller startet neu und die Fahrt kann weitergehen (aber eben mit merkwürdigen Beleuchtungseffekten).
      Da ich vermutet habe, dass diese Spannungseinbrüche den Controller aus dem Tritt bringen, habe ich noch einen 220 µF-Kondensator in die 5V-Versorgung eingebaut (ist im Schaltplan noch nicht eingezeichnet). Aber auch das brachte nicht die gewünschte Lösung.

      Deshalb nun meine Frage an euch: Wie kann ich dem Controller beibringen, ordnungsgemäß wieder am Anfang des Programms zu starten? Meine erste Idee war, den brown-out Detektor zu aktivieren. Wenn ich das richtig verstanden habe, wird dieser mit regelmäßigen Befehlen zurückgesetzt, d.h. das würde mich auch nicht weiterbringen, da das Programm ja noch läuft, allerdings eben fehlerhaft.

      Damit ihr wisst, um was es genau geht, füge ich den Schaltplan sowie mein Programm bei und hoffe, dass ihr mir einen Tipp geben könnt, wie ich zu einem stabilen Betrieb kommen kann.

      Beste Grüße
      Jürgen

      Beleuchtung.JPG

      Quellcode

      1. '----- Titel -------------------------------------------------------------------
      2. ' Module.......: LightControl
      3. ' Purpose......: Reads RC signal using interrupt 0 on PB2
      4. ' Switches LED's
      5. ' 1: Anchor light (Ankerlicht)
      6. ' 2: Anchor light + deck light (Ankerlicht + Decklicht)
      7. ' 3: Head light (Fahrlicht)
      8. ' 4: Head light + search light (Fahrlicht + Suchscheinwerfer)
      9. ' Measures RC signal in main loop
      10. ' Needed.......: Either adjust minimum and width of pulse in transmitter settings
      11. ' or adjust values in constant definitions below
      12. ' MCU..........: ATTiny 45-20SU
      13. ' Bascom.......: V2.0.7.9
      14. '-------------------------------------------------------------------------------
      15. '----- Settings ----------------------------------------------------------------
      16. $regfile = "ATtiny45.DAT"
      17. 'Frequency 1 MHz
      18. $crystal = 1000000
      19. $hwstack = 48
      20. $swstack = 48
      21. $framesize = 40
      22. ' 76543210
      23. DdrB = &B00011011 'PinB0,1,3,4 output, PinB2,5-7 input
      24. ' 76543210
      25. Portb = &B11100100 'PullUp PinB2,5-7 active
      26. '----- Variables ---------------------------------------------------------------
      27. dim wPulse as word 'stores current reading of RC signal
      28. dim wPulseLow as word : dim wPulseHigh as word
      29. dim wActionBias as word 'stores pulse length difference
      30. dim wSearch as word : dim wSearchLow as word : dim wSearchHigh as word
      31. dim wHead as word : dim wHeadLow as word : dim wHeadHigh as word
      32. dim wDeck as word : dim wDeckLow as word : dim wDeckHigh as word
      33. dim wAnchor as word : dim wAnchorLow as word : dim wAnchorHigh as word
      34. dim iCount as byte 'used as loop counter
      35. dim RC_Read as bit 'used to identify rising or falling pulse edge
      36. Anchor alias portb.0
      37. Deck alias portb.1
      38. Head alias portb.3
      39. Search alias portb.4
      40. const PulseMin = 125 'minimum pulse length
      41. const PulseWidth = 113 'pulse width
      42. const PulseTolerance = 5 'range to define valid switch bias
      43. const ReadRepeat = 5 'necessary pulse readings before switches change
      44. wActionBias = PulseWidth / 3 'ActionBias = PulseWidth devided by number of functions to switch
      45. wSearch = wActionBias * 3
      46. wSearch = wSearch + PulseMin
      47. wSearchLow = wSearch - PulseTolerance : wSearchHigh = wSearch + PulseTolerance
      48. wHead = wActionBias * 2
      49. wHead = wHead + PulseMin
      50. wHeadLow = wHead - PulseTolerance : wHeadHigh = wHead + PulseTolerance
      51. wDeck = wActionBias
      52. wDeck = wDeck + PulseMin '
      53. wDeckLow = wDeck - PulseTolerance : wDeckHigh = wDeck + PulseTolerance
      54. wAnchor = PulseMin
      55. wAnchorLow = wAnchor - PulseTolerance : wAnchorHigh = wAnchor + PulseTolerance
      56. '----- Initialization ----------------------------------------------------------
      57. config timer0 = timer , prescale = 8
      58. config int0 = change
      59. on int0 GetPulse
      60. waitms 2000 'allows pulse reading
      61. config watchdog = 1024
      62. wPulse = 0
      63. RC_Read = 1
      64. timer0 = 0
      65. '===== Program =================================================================
      66. enable timer0
      67. enable int0
      68. enable interrupts
      69. start watchdog
      70. do
      71. iCount = 0
      72. wPulseLow = wPulse - PulseTolerance
      73. wPulseHigh = wPulse + PulseTolerance
      74. do 'repeat pulse readings
      75. if wPulse > wPulseLow and wPulse < wPulseHigh then
      76. incr iCount
      77. waitms 25
      78. wPulseLow = wPulse - PulseTolerance
      79. wPulseHigh = wPulse + PulseTolerance
      80. end if
      81. Loop until iCount = ReadRepeat
      82. select case wPulse
      83. case wSearchLow to wSearchHigh
      84. Search = 1
      85. Head = 1
      86. Deck = 0
      87. Anchor = 0
      88. case wHeadLow to wHeadHigh
      89. Search = 0
      90. Head = 1
      91. Deck = 0
      92. Anchor = 0
      93. case wDeckLow to wDeckHigh
      94. Search = 0
      95. Head = 0
      96. Deck = 1
      97. Anchor = 1
      98. case wAnchorLow to wAnchorHigh
      99. Search = 0
      100. Head = 0
      101. Deck = 0
      102. Anchor = 1
      103. case else
      104. Search = 0
      105. Head = 0
      106. Deck = 0
      107. Anchor = 0
      108. end select
      109. loop
      110. end 'end program
      111. '===== End of program ==========================================================
      112. '----- Interrupts --------------------------------------------------------------
      113. GetPulse:
      114. if RC_Read = 1 then 'start Timer1 if positive signal on input
      115. start timer0
      116. RC_Read = 0
      117. Else 'stop Timer1 if no positive signal
      118. stop timer0
      119. wPulse = timer0
      120. RC_Read = 1
      121. timer0 = 0
      122. end if
      123. reset watchdog
      124. return
      Alles anzeigen
      Beste Grüße
      Jürgen
    • Hi, der Fehlerbeschreibung nach und nach Einsicht in den Schaltplan: es fehlen die Abblockkondensatoren und ein kleiner Stützelko. Die Mindest-/Grundbeschaltung ist an jedem VCC-pin 100nF gegen Gnd, und das möglichst nah am Kontroller.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Michael schrieb:

      JuWi schrieb:

      wPulseLow = wPulse - PulseTolerance
      das fällt mir gleich ins Auge.WPulseLow ist ein Word...Statt - 5 steht da also 65531 drin
      Danke für den Hinweis, das hatte ich nicht so auf dem Schirm.
      Also wäre es am Anfang des Programms besser, wPulseLow auf 0 zu setzen. Nach dem ersten gemessenen Impuls der Fernsteuerung (der in jedem Fall positiv und größer 5 ist) habe ich dann ja einen gültigen Wert.
      Beste Grüße
      Jürgen
    • if wPulse > wPulseLow
      wird also erstmal auch nicht wahr werden, das gibt sich aber möglicherweise mit dem Eintreffen erster Pulse.

      Hier gibt es aber einen Stolperstein:
      if RC_Read = 1 then
      Sollte der AVR während des Pulses neu starten, so misst er hier den Low-Puls, RC_Read ist ja Anfangs auf 1 gesetzt.
      die Low Pulse sind aber um einiges länger als der High Puls und so gibt es Überläufe und das Ergebnis ist unbestimmt.
      Frage im Int0 besser den Zustand des Pins ab
    • Michael schrieb:

      Frage im Int0 besser den Zustand des Pins ab
      O.k. ich denke da gerade an

      Quellcode

      1. RC_In alias portb.2
      2. ....
      3. GetPulse:
      4. if RC_In = 1 then 'start Timer1 if positive signal on input
      5. start timer0
      6. Else 'stop Timer1 if no positive signal
      7. stop timer0
      8. wPulse = timer0
      9. timer0 = 0
      10. end if
      11. reset watchdog
      12. return
      Alles anzeigen
      Ich habe mir auch noch einmal die Details zur brown-out Detektion durchgelesen. Da habe ich wohl etwas verwechselt. Wenn ich das fuse bit auf z.B. 4V stelle, sollte der µC doch den Betrieb unterhalb dieser Spannung einstellen und oberhalb davon wieder am Programmanfang starten. Das würde dann ja helfen. Ist das so richtig?
      Beste Grüße
      Jürgen
    • Hallo Michael,
      nach der Beschreibung dieser brown-out Detektion stoppt der µC den Betrieb unterhalb der eingestellten Schwelle und startet neu, wenn die Schwelle überschritten ist. Falls ich mit meiner Vermutung weiter oben Recht habe (was ich aber nicht messen kann) und der Controller wegen kurzzeitiger Spannungseinbrüche aus dem Tritt kommt, dann bekäme ich in diesem Fall wieder einen sauberen Start hin.
      Aber erst einmal werde ich mich jetzt ans Testen mit den anderen Vorschlägen machen...
      Beste Grüße
      Jürgen
    • JuWi schrieb:

      kurzzeitiger Spannungseinbrüche
      Wenn du so starke Spannungsschwankungen hast, dann kannst du in der 5V-Leitung zum attiny eine Diode zwischen schalten und nach der Diode den 200µF + 100nF. Dann bist du auf der sicheren Seite.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • JuWi schrieb:

      Aber erst einmal werde ich mich jetzt ans Testen mit den anderen Vorschlägen machen...
      Das wird zumindest das Problem der merkwürdigen Beleuchtungseffekte lösen.

      JuWi schrieb:

      der Controller wegen kurzzeitiger Spannungseinbrüche aus dem Tritt kommt, dann bekäme ich in diesem Fall wieder einen sauberen Start hin.
      Der Start eines AVRs ist für gewöhnlich sauber durch interne Mechanismen wie Reset-Pullup und SUT.
      Der Grund für den Spannungseinbruch muss beseitigt werden, das Problem kann nicht mit dem AVR gelöst werden.
      Es wurden schon Kondensatoren genannt.
      Ich trage noch ein paar Erfahrungen über Störgründe bei: Sternförmige Versorgung, ausreichender Querschnitt, Abstand zwischen Signal- und Versorgungsleitungen, Motorentstörung, ausreichende Leistung der Spannungsversorgung.
    • Hallo,
      Eine saubere und stabile Spannungsversorgung ist ein MUSS.
      In deinem fall würde ich es auch so machen.

      tschoeatsch schrieb:

      Wenn du so starke Spannungsschwankungen hast, dann kannst du in der 5V-Leitung zum attiny eine Diode zwischen schalten und nach der Diode den 200µF + 100nF. Dann bist du auf der sicheren Seite.
      Sollte aber eine Schottkydiode sein.

      Ist mir schon langsam peinlich aber da muss ich wiedersprechen.

      Michael schrieb:

      Der Start eines AVRs ist für gewöhnlich sauber durch interne Mechanismen wie Reset-Pullup und SUT.
      Der Grund für den Spannungseinbruch muss beseitigt werden, das Problem kann nicht mit dem AVR gelöst werden.
      Mit sauberen Start okay. JuWi schreibt aber

      JuWi schrieb:

      dass diese Spannungseinbrüche den Controller aus dem Tritt bringen
      Also hat der Spannungseinbruch kein Reset gemacht. Somit war die Vermutung

      Michael schrieb:

      if wPulse > wPulseLow
      wird also erstmal auch nicht wahr werden, das gibt sich aber möglicherweise mit dem Eintreffen erster Pulse.

      Hier gibt es aber einen Stolperstein:
      if RC_Read = 1 then
      Sollte der AVR während des Pulses neu starten, so misst er hier den Low-Puls, RC_Read ist ja Anfangs auf 1 gesetzt.
      die Low Pulse sind aber um einiges länger als der High Puls und so gibt es Überläufe und das Ergebnis ist unbestimmt.
      Frage im Int0 besser den Zustand des Pins ab
      schon plausibler und da würde ich auch ansetzen. Es reicht ja in deinem Fall das eine Sprungadresse zerstört wird.
      Versuch erst mal die Fehlerquelle einzukreisen. Schreib einfach mal ein minimalen Testcode(LED- blinken oder so) und vor Do auch eine LED um zu erkennen ob es ein Reset gab. Kommt dieser Code nicht aus dem „Tritt“ dann solltest du deine Code überarbeiten.
      Da möchte ich mich aber raushalten.
      Gruß
    • Hallo,
      für mein geschildertes Problem sind einige Lösungsvorschläge gemacht worden, erst einmal vielen Dank dafür. Ich habe das Programm wie weiter oben geschrieben modifiziert (wPulseLow ist jetzt minimal 0 und läuft nicht mehr in den hohen Word-Zahlenbereich, die Signalflanke wird jetzt mit Pin.B2 gemessen, der µC hat noch einen 100 nF Kondensator an seine Versorgnugnsspannunganschlüsse bekommen). Damit war auf jeden Fall schon einmal das fallweise "wilde" Blinken weg, ab und an (beim Test zumindest) ist aber noch das Programm "hängen " geblieben, soll heißen Schalten der verschiedenen Lichter ging nicht mehr. Ich habe dann doch noch die brown-out Detektion aktiviert (bei 4,3 V), danach lief in der Testphase alles so wie es sollte. Am Wochende werde ich das bei einem Modell-Treffen noch über einen längeren Zeitraum testen können, aber ich bin mal verhalten optimistisch, dass das jetzt laufen wird.

      Bascom hat diese Zeile in das Programm eingefügt:

      Quellcode

      1. $PROG &HFF,&H62,&HDF,&HFF ' generated. Take care that the chip supports all fuse bytes.
      Bisher bin ich immer davon ausgegangen, dass die fuse bits nur einmal gesetzt werden müssen und bis zur nächsten Änderung der eingestelle Zustand beibehalten wird. Muss diese Zeile bei einer Änderung im Programm an anderer Stelle noch im stehen bleiben?
      Beste Grüße
      Jürgen
    • JuWi schrieb:

      Bisher bin ich immer davon ausgegangen, dass die fuse bits nur einmal gesetzt werden müssen und bis zur nächsten Änderung der eingestelle Zustand beibehalten wird.
      Das ist ja auch so und die Zeile im Code kannst du entweder auskommentieren oder löschen nach dem du dein Programm geflasht hast.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Die Zeile könnte beispielsweise interessant sei, wenn Du Dein Programm an jemand anders gibst, der es auf einen (ggf. leeren)Mikrocontroller brennen/flashen möchte.
      Oder wenn Du das Programm in drei Jahren wieder von Deiner Festplatte holst und auf einen (anderen) Mikrocontroller brennen möchtest. In beiden Situationen ist es ergänzend zum eigentlichen BASCOM-Programm gut, die Fuse-Einstellungen zu haben.
      Vielleicht arbeitest Du auch einmal gleichzeitig an verschiedenen Projekten, die unterschiedliche Mikrocontroller/Fusebits erfordern.
    • @djmsc, stefanhamburg: Danke für die Erklärung. Ich lasse die Zeile im Programm, kommentiere sie aber aus.

      @all: Der Test am Wochenende war insofern erfolgreihc, dass trotz ca. 1,5 h Betrieb die Lichtsteuerung keine Mucken zeigte. Insofern stimmt der Titel dieses Themas jetzt nicht mehr - nun läuft's stabil. Danke noch einmal für die Ratschläge.
      Beste Grüße
      Jürgen