Relais soll bei fehlendem NF-Signal ausschalten

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Relais soll bei fehlendem NF-Signal ausschalten

      Hallo und noch ein leicht verspätetes "PROSIT NEUJAHR" an alle!

      Mein altes Makita Baustellenradio hatte noch kein Bluetooth. Also schnell ein BT-Modul eingebaut (Ausgang auf AUX2) welches mit einem Schalter ein- und ausgeschaltet wird.
      Wenn ich das Ausschalten vergesse ist der Akku igendwann leer bzw. sogar tiefentladen.
      Um das zu verhindern habe ich das kleine Programm geschrieben.
      Meine Überlegung war folgende. Mit einem Taster das Relais für die Stromversorgung des BT-Moduls einschalten. Wenn an den ADC-Eingängen das gleichgerichtete NF-Signal anliegt
      soll das Relais eingeschaltet bleiben. Sobald das NF-Signal ausbleibt (die Schaltschwelle muss dann in der Praxis ermittelt werden) soll das Relais abfallen und der Attiny schlafen gehen.
      Habe das ganze erst im Simulator getestet - mit Einzelschritten fuktioniert es. Im "normalen" RUN-Modus nicht???
      Ist das was ich vorhabe in der Art überhaupt machbar?

      BASCOM Source Code: BT-Modul Abschaltung

      1. ' Automatische Abschaltung des nachgerüsteten Bluetooth-Moduls beim DMR102 Makita Baustellenradio.
      2. ' Durch einen Tastendruck wird das Relais für die Stomversorgung des BT-Moduls eingeschaltet.
      3. ' Wenn ein gleichgerichtetes NF-Signal in entspraechender Staerke an PB3 oder PB4 anliegt
      4. ' bleibt das Relais eingeschaltet.
      5. ' Sobald das NF-Signal unter etwa 0,1V faellt wird das Relais abgeschaltet und der Attiny
      6. ' wird schlafen gelegt.
      7. '
      8. ' Version: Rev.01
      9. ' Datum: 02.01.2020
      10. ' Compiler: BASCOM-AVR
      11. ' Version: 2.0.8.2
      12. ' Controller: ATtiny85
      13. ' Autor: Alfred Schneider
      14. ' letzte Änderung: 04.01.2020
      15. '
      16. '===============================================================================
      17. '*******************************************************************************
      18. '===============================================================================
      19. $regfile = "Attiny85.dat"
      20. $crystal = 1000000
      21. $hwstack = 10
      22. $framesize = 40
      23. $swstack = 10
      24. '===============================================================================
      25. '***| Variablen deklarieren |***************************************************
      26. '===============================================================================
      27. Dim W As Word
      28. Dim X As Word
      29. Dim Signal As Word
      30. '===============================================================================
      31. '***| Aus- und Eingänge konfigurieren |*****************************************
      32. '===============================================================================
      33. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      34. Start Adc
      35. Config Portb.2 = Input 'Taster-Eingang
      36. Pinb.2 = 1 'internen Pullup-Widerstand für Taster aktivieren
      37. 'Ausgang für Relais
      38. Config Portb.0 = Output
      39. Relais Alias Portb.0
      40. 'freie Pin's als Eingang definieren und interne Pullups einschalten
      41. Config Portb.1 = Input
      42. Pinb.1 = 1
      43. Config Portb.5 = Input
      44. Pinb.5 = 1
      45. '===============================================================================
      46. '***| Einstellungen zum Aufwecken des Attiny mit PIN-CHANGE |*******************
      47. '===============================================================================
      48. Gimsk.5 = 1 ' Pin Change Interrupt Enable
      49. Sreg.7 = 1 ' Globale Interrupts einschalten
      50. Pcmsk.0 = 1 ' Pin Change Inerrupt PB2 aktivieren
      51. On Pcint0 Isr ' Bei einem Interrupt springe zur ISR
      52. 'Relais Einschalten
      53. Relais = 1
      54. '===============================================================================
      55. '***| Hauptprogramm |***********************************************************
      56. '===============================================================================
      57. Do
      58. W = Getadc(2) 'Linker Kanal A/D Wandler ADC2 (PB4) verwenden
      59. X = Getadc(3) 'Rechter Kanal A/D Wandler ADC3 (PB3) verwenden
      60. Signal = W + X 'Beide Kanaele addieren
      61. Signal = Signal / 2 'und durch 2 Teilen
      62. If Signal >= 22 Then 'wenn gleichgerichtetes NF-Signal >0,1V
      63. Relais = 1 'Relais einschalten
      64. Else 'wenn kleiner
      65. Relais = 0 'Relais ausschalten und
      66. Config Powermode = Powerdown 'Microkontroller schlafen legen
      67. End If
      68. Loop
      69. End
      70. '===============================================================================
      71. '***| Pin change interrupt - ISR |**********************************************
      72. '===============================================================================
      73. Isr:
      74. 'Bei Tastendruck (Pin change interrupt)
      75. Relais = 1
      76. Return
      77. '===============================================================================
      Display All
    • B.5 ist doch der Reset-Pin. Den sollest Du nicht (per Software) anfassen.

      Was läuft nicht?

      Ich würde das einmal als Hardware aufbauen und
      1. mir ansehen, ob die Signalerkennung funktioniert. Ohne Powerdown. Möglicherweise muss man den ADCs etwas Zeit geben.
      2. das mit dem Powerdown testen. Vielleicht muss an den Stackwerten noch feingetuned werden.
      Schöne Idee übrigens. Und schön strukturiertes Programm.
    • stefanhamburg wrote:

      Die Pullups besser mit PORTx.y=1 setzen
      OK - mach ich üblicherweise auch....


      stefanhamburg wrote:

      B.5 ist doch der Reset-Pin. Den sollest Du nicht (per Software) anfassen.
      a_45_132ca9f5 Danke für den Hinweis - habe ich komplett übersehen, hätte sicher Probleme gemacht!


      stefanhamburg wrote:

      Was läuft nicht?
      Das Relais wird wenn ich den ADC Eingang auf unter 22 stelle nicht ausgeschaltet und auch nicht eingeschaltet wenn ein höherer Wert als 22 eingestellt ist.
      Wenn ich das ganze in Einzelschritten Simuliere dann funktioniert alles wie es soll. Natürlich mit $sim compiliert!

      Ja - werde das ganze mal auf dem Steckbrett aufbauen, testen und dann wieder berichten.
      Danke für die Blumen - das Studieren deines Buches trägt offenbar Früchte!
    • Pluto25 wrote:

      da reichen schon ein paar Störungen es zu überschreiten . Läßt sich das Signal nicht verstärken. Wie wird es gleichgerichtet? Ohne Gleichrichtung auf den Analog Comperator könnte gehen.
      Die 22 sind nur ein theoretischer Der passende Wert wird erst im Praxistest ermittelt werden können.
      Geplant ist das Stereosignal mittels eines TL062 gleichzurichten. Hab ich in dieser Art schon mal vor vielen Jahren gemacht und hat gut funktioniert.
    • Dieses Projekt hat leider zugunsten eines dringend benötigten Punktschweißgerätes warten müssen.
      Nun ist mir auch bei diesem "alten" Projekt der Durchbruch gelungen! Das Programm mutet stellenweise etwas eigenartig an.... aber es funktioniert einwandfrei.
      Durch einen Tstendruck wird das Relais für die Spannungsversorgung des BT-Moduls und der Signalaufbereitung (TLC272) eingeschaltet.
      Wenn das NF-Signal aus dem BT-Modul an den ADC Eingängen des Attiny85 dedektiert wird bleibt das Relais zuverlässig eingeschaltet.
      Nachdem das Signal wegfällt wird das Relais nach etwa 30 Sekunden ausgeschaltet und die Stromversorgung des BT-Moduls sowie des TLC272 unterbrochen.
      Der Attiny geht schlafen und verbraucht bei 5V Versorgungsspannung nur noch 300uA Strom.
      Leider habe ich (noch) keinen Schaltplan.
      Hier mal das Programm:

      Source Code

      1. ' Version: Rev.02
      2. ' Datum: 02.01.2020
      3. ' Compiler: BASCOM-AVR
      4. ' Version: 2.0.8.2
      5. ' Controller: ATtiny85 / 1040 Bytes / 12%
      6. ' letzte Änderung: 04.04.2020
      7. '
      8. '===============================================================================
      9. '*******************************************************************************
      10. '===============================================================================
      11. $regfile = "Attiny85.dat"
      12. $crystal = 8000000
      13. $hwstack = 32
      14. $framesize = 64
      15. $swstack = 32
      16. '===============================================================================
      17. '***| Variablen deklarieren |***************************************************
      18. '===============================================================================
      19. Dim X As Word
      20. Dim Y As Word
      21. Dim Z As Word
      22. Dim N As Word
      23. Dim Mean As Dword
      24. Dim Signal As Dword
      25. Dim Var1 As Byte
      26. Const Messzahl = 50000 'Anzahl der Messzyklen fuer Mittelwertbildung
      27. '===============================================================================
      28. '***| Aus- und Eingänge konfigurieren |*****************************************
      29. '===============================================================================
      30. Config Adc = Single , Prescaler = 64 , Reference = Avcc
      31. Start Adc
      32. Config Portb.2 = Input 'Taster - INT0 --> external 47K pull-up
      33. Taster Alias Pinb.2
      34. 'Pinb.2 = 1
      35. 'Ausgang fuer Relais
      36. Config Portb.1 = Output
      37. Relais Alias Portb.1
      38. 'Ausgang Fuer LED
      39. Config Portb.0 = Output
      40. Led Alias Portb.0
      41. 'ADC2 und ADC3 Eingaenge
      42. Config Portb.3 = Input
      43. Config Portb.4 = Input
      44. Enable Interrupts
      45. '===============================================================================
      46. '***| Einstellungen zum Aufwecken des Attiny mit PIN-CHANGE |*******************
      47. '===============================================================================
      48. Gimsk.5 = 1 ' Pin Change Interrupt Enable
      49. Pcmsk.0 = 1 ' Pin Change Inerrupt PB2 aktivieren
      50. On Int0 Int0_isr 'INT0 will be the wake-up source for Powerdown Mode
      51. Config Int0 = Low Level
      52. Enable Int0
      53. '===============================================================================
      54. '***| Hauptprogramm |***********************************************************
      55. '===============================================================================
      56. Do
      57. Debounce Taster , 0 , Einschalten , Sub
      58. Gosub Messen
      59. For Var1 = 1 To 250
      60. If Signal > 2 Then
      61. Signal = 1023
      62. Waitms 10
      63. If Signal > 1 Then
      64. Relais = 1
      65. Led = 1
      66. End If
      67. Next Var1
      68. End If
      69. If Signal < 1 Then
      70. Gosub Ausschalten
      71. End If
      72. Loop
      73. End
      74. '===============================================================================
      75. '***| Ende Hauptprogramm |***********************************************************
      76. '===============================================================================
      77. Int0_isr:
      78. ' wake_up
      79. Relais = 1
      80. Led = 1
      81. Return
      82. '===============================================================================
      83. Messen:
      84. Mean = 0
      85. For N = 1 To Messzahl 'Mittelwert von 100 Messungen bilden
      86. X = Getadc(2) 'Linker Kanal A/D Wandler ADC2 (PB4) verwenden
      87. Y = Getadc(3) 'Rechter Kanal A/D Wandler ADC3 (PB3) verwenden
      88. Z = X + Y 'Beide Kanaele addieren
      89. Mean = Mean + Z
      90. Next N
      91. Mean = Mean / Messzahl 'Ergebnis geteilt durch Messzahl
      92. Signal = Mean * 10000
      93. Return
      94. '===============================================================================
      95. Einschalten:
      96. Relais = 1
      97. Led = 1
      98. Return
      99. '===============================================================================
      100. Ausschalten:
      101. Relais = 0
      102. Led = 0
      103. Config Powermode = Powerdown
      104. Return
      Display All
    • 300uA Powerdown Stromverbrauch war ja viel zu viel!!!
      Mit dieser Version sind es nur mehr 2,2uA - damit kann ich leben.

      Source Code

      1. ' Automatische Abschaltung des nachgerüsteten Bluetooth-Moduls beim DMR102 Makita Baustellenradio.
      2. ' Durch einen Tastendruck wird das Relais für die Stomversorgung des BT-Moduls sowie
      3. ' fuer die Signalgleichrichtung mittels eines TLC272CP eingeschaltet.
      4. ' Wenn das gleichgerichtete NF-Signal in entspraechender Staerke an ADC3 (PB3) und/oder ADC2 (PB4) anliegt
      5. ' bleibt das Relais eingeschaltet.
      6. ' Nachdem das NF-Signal fehlt wird das Relais nach etwa einer Minute abgeschaltet und der Attiny
      7. ' wird schlafen gelegt. Danach nur mehr 2,2 uA Stromverbrauch!
      8. '
      9. ' Version: Rev.02
      10. ' Datum: 02.01.2020
      11. ' Compiler: BASCOM-AVR
      12. ' Version: 2.0.8.2
      13. ' Controller: ATtiny85 / 1038 Bytes / 12%
      14. ' Autor: Alfred
      15. ' letzte Änderung: 11.04.2020 Powerdown Stromverbrauch optimiert
      16. '
      17. '===============================================================================
      18. '*******************************************************************************
      19. '===============================================================================
      20. $regfile = "Attiny85.dat"
      21. $crystal = 1000000
      22. $hwstack = 32
      23. $framesize = 64
      24. $swstack = 32
      25. '===============================================================================
      26. '***| Konstanten festlegen |***************************************************
      27. '===============================================================================
      28. Const Ein = 1
      29. Const Aus = 0
      30. Const Verstaerkung = 100
      31. Const Messzahl = 50000 'Anzahl der Messzyklen fuer Mittelwertbildung
      32. '===============================================================================
      33. '***| Variablen deklarieren |***************************************************
      34. '===============================================================================
      35. Dim X As Word
      36. Dim Y As Word
      37. Dim Z As Word
      38. Dim N As Word
      39. Dim Mean As Dword
      40. Dim Signal As Dword
      41. Dim Var1 As Byte
      42. Declare Sub Messen
      43. '===============================================================================
      44. '***| Aus- und Eingänge konfigurieren |*****************************************
      45. '===============================================================================
      46. Config Adc = Single , Prescaler = Auto , Reference = Avcc
      47. Start Adc
      48. Config Portb.2 = Input 'Taster - INT0 --> daher externer 47K pull-up-Widerstand
      49. Taster Alias Pinb.2
      50. 'Pinb.2 = 1
      51. 'Ausgang fuer Relais
      52. Config Portb.1 = Output
      53. Relais Alias Portb.1
      54. 'Ausgang Fuer LED
      55. Config Portb.0 = Output
      56. Led Alias Portb.0
      57. 'ADC2 und ADC3 Eingaenge
      58. Config Portb.3 = Input
      59. Config Portb.4 = Input
      60. Enable Interrupts
      61. '===============================================================================
      62. '***| Einstellungen zum Aufwecken des Attiny mit PIN-CHANGE |*******************
      63. '===============================================================================
      64. Stop Ac 'Analog-Komparator abschalten, um Strom zu sparen
      65. Gimsk.5 = Ein ' Pin Change Interrupt Enable
      66. Pcmsk.0 = Ein ' Pin Change Inerrupt PB2 aktivieren
      67. On Int0 Int0_isr 'INT0 will be the wake-up source for Powerdown Mode
      68. Config Int0 = Low Level
      69. Enable Int0
      70. '===============================================================================
      71. '***| Hauptprogramm |***********************************************************
      72. '===============================================================================
      73. Do
      74. Debounce Taster , 0 , Einschalten , Sub
      75. Call Messen
      76. For Var1 = 1 To 200
      77. If Signal > 100 Then
      78. Signal = 1023
      79. Waitms 10
      80. If Signal >= 1023 Then
      81. Relais = Ein
      82. Led = Ein
      83. End If
      84. Next Var1
      85. End If
      86. If Signal < 1023 Then
      87. Relais = Aus
      88. Led = Aus
      89. Stop Adc 'A/D-Wandler abschalten, um Strom zu sparen
      90. Config Powermode = Powerdown
      91. End If
      92. Loop
      93. End
      94. '===============================================================================
      95. '***| Ende Hauptprogramm |***********************************************************
      96. '===============================================================================
      97. Int0_isr:
      98. ' wake_up
      99. Start Adc
      100. Relais = Ein
      101. Led = Ein
      102. Return
      103. '===============================================================================
      104. Sub Messen
      105. Mean = 0
      106. For N = 1 To Messzahl 'Mittelwert von 50000 Messungen bilden
      107. X = Getadc(2) 'Linker Kanal A/D Wandler ADC2 (PB4) verwenden
      108. Y = Getadc(3) 'Rechter Kanal A/D Wandler ADC3 (PB3) verwenden
      109. Z = X + Y 'Beide Kanaele addieren
      110. Mean = Mean + Z
      111. Next N
      112. Mean = Mean / Messzahl 'Ergebnis geteilt durch Messzahl
      113. Signal = Mean * Verstaerkung
      114. End Sub
      115. '===============================================================================
      116. Einschalten:
      117. Relais = Ein
      118. Led = Ein
      119. Return
      Display All
    • Michael wrote:

      Wenn du Portb.2 = 1 geschrieben hättest, würde der interne Widerstand reichen.
      Habe aus irgendeinem Grund gedacht dass sich INT und interner Pull-up nicht vertragen - ist nach etwas Nachdenken natürlich Quatsch!
      Diesen Widerstand habe ich bei der Layouterstellung ohnehin vergessen. Nun kann den derzeit unschön plazierten SMD-Bauteil entfernen.