RC Empfänger 2-3 Kanäle auslesen

    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!

    • BASCOM-Quellcode

      1. ' BASCOM-Programm
      2. '
      3. ' Servo-Ansteuerung mit einem Timer
      4. ' Status 27.04.2019 Eingang und Ausgang ok.(Print ausgeschaltet)
      5. ' linkeranschlag wert abgesenkt
      6. ' S1 (messwert des Empfängers verdoppelt)
      7. '
      8. '
      9. $regfile = "m8def.dat"
      10. $crystal = 1000000
      11. $hwstack = 32 ' default use 32 for the hardware stack
      12. $swstack = 10 ' default use 10 for the SW stack
      13. $framesize = 40 ' default use 40 for the frame space
      14. $baud = 9600
      15. ' Bei Timer1 (65536) mit 1 MHz und Prescaler=8
      16. ' 1 Tick: 1/1000000 *8 =8us
      17. ' 65536 - 63036 = 2500 * 8us = 20ms
      18. ' 65536 - 65411 = 125 * 8us = 1ms
      19. ' 65536 - 65286 = 250 * 8us = 2ms
      20. Ddrb = &B00001110 'B0 ist Eingang B1 Servo Ausgang'
      21. Servo1 Alias Portb.1
      22. Dim S1 As Word
      23. Const 20ms = 63036
      24. Const Rechteranschlag = 65411 '1ms
      25. Const Linkeranschlag = 65166 '-120 '2ms Differenz=125
      26. Config Timer1 = Timer , Prescale = 8
      27. Timer1 = 20ms
      28. On Timer1 Timer1_isr
      29. Enable Timer1
      30. Enable Interrupts
      31. Dim Servo As Word
      32. Dim Analogwandler As Integer 'Variable zur Aufnahme des Wertes vom Analogwandler
      33. Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analogwandler definieren
      34. Start Adc 'AD-Wandler starten (nach Config automatisch)
      35. Do
      36. Pulsein S1 , Pinb , 0 , 1 'Pulsbreite wird gemessen
      37. 'Print S1 'nur zum Auslesen nutzen !!!
      38. ' Analogwandler = Getadc(0) für Poti steurung '0..1023
      39. Servo = S1 * 2 'Analogwandler / 8
      40. Loop
      41. End
      42. Timer1_isr:
      43. If Pinb.1 = 1 Then 'wenn 1 war
      44. Portb.1 = 0 'dann aus und
      45. Timer1 = 20ms ' Pause ca. 20 ms
      46. Else 'sonst
      47. Portb.1 = 1 'Impuls
      48. Timer1 = Linkeranschlag + Servo ' für 1ms bis 2ms
      49. End If
      50. Return
      Alles anzeigen
      Anbei das Programm was ok ist, Empfänger und Servo über BEC an Akku.
      Danke für die Hilfe !!
    • Ich finde es noch nicht ok. Zumindest die isr. Portb.1 ist als Ausgang eingestellt. Dann frägst du aber mit if pinb.0.. ein anderes Register ab. Dass das zu einem richtigen Programmablauf führt, ist für mich grad' nicht nachvollziehbar. Wenn du den Pegel vom Ausgang wissen willst, dann eher mit if portb.1=1. Dann wird zumindest das Register verwendet, was für die Ausgabe auch verwendet wird.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • BASCOM-Quellcode

      1. 28.04.2019
      2. ' Analogwandler (Poti wird nicht benutzt)
      3. '
      4. '
      5. $regfile = "m8def.dat"
      6. $crystal = 16000000
      7. $hwstack = 32 ' default use 32 for the hardware stack
      8. $swstack = 10 ' default use 10 for the SW stack
      9. $framesize = 40 ' default use 40 for the frame space
      10. '-----------------------------------------------------------------------
      11. ' Servo-Ansteuerung
      12. ' Max. 16 Servos!
      13. ' Benutzt Timer0 Alternativ auch Timer1 benutzbar:
      14. ' 'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1
      15. '-----------------------------------------------------------------------
      16. Config Servos = 1 , Servo1 = Portb.1 , Reload = 10 ' Timer = Timer0 'Ein Servo an PortB.0 Max 16 Servos!
      17. 'neu ####################################
      18. Ddrb = &B00000010 'B0 ist Eingang B1 ist ausgang
      19. '########################################
      20. 'Config Portb = Output 'Port muss als Output definiert werden:
      21. Enable Interrupts 'Alle Interrupts ein
      22. Const Linkeranschlag = 180 'je nach Servo!
      23. Const Rechteranschlag = 30 'je nach Servo!
      24. Dim Wiederholung As Byte
      25. Dim I As Byte
      26. 'Dim Analogwandler As Integer 'Variable zur Aufnahme des Wertes vom Analogwandler
      27. 'Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Analogwandler definieren
      28. 'Start Adc 'AD-Wandler starten (nach Config automatisch)
      29. 'neu ################################
      30. Dim S1 As Word
      31. Dim S2 As Word
      32. '#####################################
      33. 'Schnelles Hin- und Herschalten zwischen links und rechts:
      34. For Wiederholung = 1 To 3 '3 mal
      35. Servo(1) = Linkeranschlag 'ganz links
      36. Portb.2 = 1
      37. Wait 1
      38. Servo(1) = Rechteranschlag 'ganz rechts
      39. Portb.2 = 0
      40. Wait 1
      41. Next Wiederholung
      42. 'Langsames Hin- und Herschalten zwischen links und rechts:
      43. For Wiederholung = 1 To 3 '3 mal
      44. For I = Rechteranschlag To Linkeranschlag 'langsam nach links
      45. Servo(1) = I
      46. Waitms 10
      47. Next
      48. Waitms 100
      49. For I = Linkeranschlag To Rechteranschlag Step -1 'langsam nach rechts
      50. Servo(1) = I
      51. Waitms 10
      52. Next
      53. Waitms 100
      54. Next Wiederholung
      55. 'Servostellung je nach Poti-Stellung:
      56. Do
      57. 'neu ###################################
      58. Pulsein S1 , Pinb , 0 , 1 'Pulsbreite wird gemessen
      59. S2 = S1 * 1.5 'für größeren Stellweg
      60. '#######################################
      61. ' Analogwandler = Getadc(0) ' 0..1023
      62. ' Analogwandler = Analogwandler / 15 ' 0..70
      63. ' Analogwandler = Analogwandler + 30 ' 30..100
      64. Servo(1) = S1 'S2+150'S1 'bei S2 zittert das Servo etwas 'Analogwandler + 50
      65. Loop
      66. End
      Alles anzeigen
      Hallo Bascom Freunde !!
      Anbei mein Code mit dem Bascom Servo-befehl. als Frequenz nutze ich jetzt ein 16Mhz Quarz.
      Mit diesem Code und der hohen Frequenz ist das zittern des Servos verschwunden.
      Vielen Dank für die Infos und Unterstützung !!!!
      Gruß Werner