+ Antworten
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: Servo-Befehl stört 1wire Kommunikation

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72

    Servo-Befehl stört 1wire Kommunikation

    Hallo,

    der Servo-Befehl stört anscheinend die 1wire-Kommunikation in meinem Programm. Den Timer1 verwende ich für PWM eines L293D:


    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8


    Ich verwende einen Atmega8.

    Mit dem Timern tue ich mich schwer... was wäre der weitere Ansatz um ein Servo ohne Servo-Befehl zu nutzen?

    Danke.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    32
    Beiträge
    311
    Hi,

    schau Dir den Befehl Pulseout an. Den benutze ich um ein einfaches servo anzusteuern. Nach dem Befehl die Pause nicht vergessen.

    Gruß BlaueLed
    ...::: AVRFreak :::...

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo,

    danke für den Tipp.

    Pausen kann ich leider nicht gebrauchen... Wenn ich richtig verstanden habe, dass du mit Pause wait meinst.

    Ich habe woanders gelesen, dass während des 1wire-Befehls der Timer0 gestoppt und dann wieder gestartet werden soll.

    Allerdings passiert bei mir folgendes bei stop und start timer0:

    1wire läuft problemlos, allerdings ist dann nichtsmehr mit servo(1)... Da passiert dann gar nichts mehr...

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    32
    Beiträge
    311
    Hi,

    also ich mache folgendes:

    Ich verwende den Timer1 und konfiguriere den auf 20ms. Also alle 20ms ein Überlauf des Timers. In dessen ISR setze ich ein Flag ( z.B. 20ms_flag ). Dann in der Hauptschleife polle ich das Flag -> if 20ms_flag = 1 then pulseout ..... Danach setze ich das flag auf 0. Somit hast Du keine Wartezeit und alle 20ms wird das servo angesteuert.

    Gruß BlaueLed
    ...::: AVRFreak :::...

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Danke für die ausführliche Erklärung! - Ich werde das heute Abed bzw. morgen testen!

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo, aus dem -morgen testen- sind 6 Wochen vergangen... Ich bin Vater geworden und da waren einige Dinge wichtiger...

    Bei 4 MHz gibt pulsout alle 1us einen Wert aus.
    Bei 7,3728 MHz wären das 1,843us...

    möchte ich also meinen 7,4 Volt Servo "Jamara HVD10MG" auf eine 1ms (= 1000us) oder 2ms (= 2000us) ansteueren,

    rechne ich für links, 1000us, -> 1000us / 1,843us = 542,6

    rechne ich für rechts, 2000us -> 2000us / 1,843 us = 1085,2

    mittig wäre dann 1500us / 1,843us = 813,9


    Allerdings höre ich immer nur ein "pulsen"... am Servo passiert nichts.

    Was mache ich falsch?

    Anbei der grds. Syntax für das Pulseout und der gesamte Code.

    Danke, Christoph


    Code:
    Dim 20ms_flag As Bit
    Dim Servo As Word
    
    
    Const Timer2vorgabe = 112
    
    Config Portb.2 = Output
    
    Config Timer2 = Timer , Prescale = 1024
    
    
    On Timer2 Timer2_irq
    
    Enable Interrupts
    Enable Timer2
    
    Servo = 814
    
    Do
    
       If 20ms_flag = 1 Then
    
          Pulseout Portb , 2 , Servo
          20ms_flag = 0
    
       End If
    
    
    Loop
    End
    
    
    
    
    
    Timer2_irq:
    
      20ms_flag = 1
    
      Timer2 = Timer2vorgabe
    
    
    Return

    Hier nochmal der vollständige Code:

    Code:
    '--------------------------------------------------------------------------
    ' Compilerinstruktionen und Compilerdirektiven
    '--------------------------------------------------------------------------
    
    $regfile = "m8def.dat"
    $crystal = 7372800                                          ' 7,3728 Mhz Quarzoszillator an PB6 / XTAL 1
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    
    $baud = 9600
    
    
    '--------------------------------------------------------------------------
    ' Definition von Ressourcen
    '--------------------------------------------------------------------------
    
    Pwr_all Alias Portc.4                                       'Abschaltung der Servos und LM2675 (5V für GPS, Video 5,8 GHz Tx)
    Pwr_gps Alias Portc.1
    Pwr_video Alias Portd.4
    Pwr_atmega Alias Portd.3
    
    Bit0 Alias Portc.2
    Bit1 Alias Portd.5
    Bit2 Alias Portb.5
    
    Cam_gnd Alias Portd.6
    
    Led_rot Alias Portc.5
    
    Pan1 Alias Portb.0                                          ' für L293 D
    Pan2 Alias Portd.7
    
    
    
    '--------------------------------------------------------------------------
    ' Definition von Konstanten
    '--------------------------------------------------------------------------
    
    Const Adc_multi = 0.0048828125                              ' = 5.0 / 1024.0 -> ADC auflösen
    
    Const Timer2vorgabe = 112
    
    Const S1_links = 100                                        'je nach Servo!
    Const S1_rechts = 50                                        'je nach Servo!
    
    '--------------------------------------------------------------------------
    ' Definition von Variablen und Datentypen
    '--------------------------------------------------------------------------
    
    '---- Betriebsspannung messen ----
    Dim Spannung As Word
    Dim Zellspannung_orig As Single
    Dim Zellspannung As String * 5
    
    '---- Commands ----
    Dim Quittierung As String * 14
    Dim Gpshoehe As String * 13
    
    
    '---- Command empfangen xxx----
    
    Dim Cmd As Byte
    
    
    
    'Dim für GPS einlesen
    Dim Gelesen As Byte                                         'eingelesenes Zeichen
    
    Dim Teilstring(14) As String * 12
    Dim Anzahl2 As Byte
    Dim Gpsdaten As String * 98
    Dim Header As String * 6
    'Dim Stunde As Byte
    Dim Tempstring As String * 2
    
    
    
    '---- Temperaturmessung ----
    Dim Temp(9) As Byte
    Dim X As Byte
    Dim Celsius As Integer
    Dim T As Single
    Dim Temperatur As String * 5
    
    
    '--- Servo ---
    Dim 20ms_flag As Bit
    Dim Servo As Word
    
    
    '---- PWM für A293D ----
    Dim A As Byte
    
    Dim Swert As Byte
    
    '--------------------------------------------------------------------------
    ' Konfiguration und Basiseinstellungen
    '--------------------------------------------------------------------------
    
    '---- CONFIG ----
    
    ' RS232 Hardware
    Config Serialin = Buffered , Size = 1                       ' konfig serial in
    Open "COMB.7:9600,8,N,1" For Input As #1                    'PB.7 = RxD SoftUART / GPS
    
    
    ' ADC
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'ADC Wandler definieren
    
    ' Servo
    'Config Servos = 1 , Servo1 = Portb.2 , Reload = 10
    
    ' Timer für PWM
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 8
    
    ' Timer für Servosteuerung
    Config Timer2 = Timer , Prescale = 1024
    
    ' schaltbare Ausgänge
    Config Pwr_all = Output                                     ' GPS- und Video-Modul sowie 5 Volt Versorgung hierfür abschalten
    Config Pwr_gps = Output
    Config Pwr_video = Output
    Config Pwr_atmega = Output
    
    Config Bit0 = Output
    Config Bit1 = Output
    Config Bit2 = Output
    
    Config Cam_gnd = Output
    
    ' Status-LED rot
    Config Led_rot = Output
    
    ' L293D für Servo als Motor
    Config Portb.1 = Output
    Config Pan1 = Output                                        'LD293
    Config Pan2 = Output
    
    ' Servo PIN
    Config Portb.2 = Output
    
    '1wire für Temp.-Messung
    Config 1wire = Portc.0                                      ' Pin für 1wire Schnittstelle festlegen, Schnittstelle wird von BASCOM durch Software realisiert
    
    'Interrupts
    On Timer2 Timer2_irq
    
    Enable Interrupts
    Enable Timer1
    Enable Timer2
    
    ' sonstige
    Start Adc
    Declare Sub Xbee                                            ' Senderoutine, um $GROUND#... permanent zu senden
    
    '--------------------------------------------------------------------------
    ' Init
    '--------------------------------------------------------------------------
    
    Pwr_atmega = 1                                              ' FET für Atmega auf ON
    
    Pwr_all = 0                                                 ' bei Systemstart Peripherie auf OFF
    Pwr_video = 0
    Pwr_gps = 0
    
    Led_rot = 1                                                 ' Led_rot OFF
    
    Pan1 = 0                                                    'L293D OFF
    Pan2 = 0
    
    Bit0 = 1
    Bit1 = 1
    Bit2 = 1
    
    Cam_gnd = 1
    
    
    Servo = 814
    
    'Swert = 100
    'Servo(1) = Swert                                            'Servo
    
    'LED blinken lassen
    Led_rot = 1
    Waitms 100
    Led_rot = 0
    Waitms 100
    Led_rot = 1
    Waitms 100
    Led_rot = 0
    Led_rot = 1
    Waitms 100
    Led_rot = 0
    Waitms 100
    Led_rot = 1
    Waitms 100
    Led_rot = 0
    
    
    'nach einer Sek. Pwr_all ON
    Wait 1
    Pwr_all = 1
    
    'nach einer weiteren Sek. Pwr_gps ON
    Wait 1
    Pwr_gps = 1
    
    
    
    
    
    ' Begrüßung
    
       Quittierung = "Hallo"
    
    
    Wait 2
    Cam_gnd = 0
    Waitms 150
    Cam_gnd = 1
    Cam_gnd = 0
    Waitms 150
    Cam_gnd = 1
    
    
    '--------------------------------------------------------------------------
    ' Hauptprogramm
    '--------------------------------------------------------------------------
    
    Do
    
    
    
    
       '========== hier laufen Tests ab ==========================================
    
       If 20ms_flag = 1 Then
    
          Pulseout Portb , 2 , Servo
          20ms_flag = 0
    
       End If
    
    
    
       '==========Temperaturmessung mit DS18B20Z 1Wire============================
    
    
       1wreset
    
       1wwrite &HCC
       1wwrite &H44
       Waitms 600
    
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
    
       For X = 1 To 9
          Temp(x) = 1wread()
       Next
    
       Celsius = Makeint(temp(1) , Temp(2))
    
    
       T = Celsius / 16
    
       Temperatur = Fusing(t , "##.#")
    
    
    
       '==========Spannung LiPo 2S messen========================================
    
       Spannung = Getadc(3)                                     ' Zelle messen und berechnen
       Zellspannung_orig = Spannung * Adc_multi
       Zellspannung_orig = Zellspannung_orig * 2
       Zellspannung = Fusing(zellspannung_orig , "#.#")
    
       If Zellspannung_orig <= 6.4 Then                         ' Zellspannung unter/gleich 6,4 Volt (2x 3,2 Volt) dann...
          Gosub Lipo_saver_off
       End If
    
    
    
       '==========Rx Prüfen auf GPS Eingang GPGGA=================================
    
    
    
    
      Gelesen = Inkey(#1)
    
       If Gelesen = 36 Then Input #1 , Gpsdaten Noecho          '36 = $
          Header = Mid(gpsdaten , 1 , 5)
    
          If Header = "GPGGA" Then
             Anzahl2 = Split(gpsdaten , Teilstring(1) , ",")
             Gpsdaten = ""
             Gpshoehe = Teilstring(10)
    
       End If
    
    
    
    
       '==========Rx Prüfen auf Befehlseingänge==================================
    
      ' Inputbin Cmd
    
    
        If Ischarwaiting() = 1 Then
          Cmd = Inkey()
        End If
    
    
        Select Case Cmd
    
        Case "r"
           Clear Serialin
           Cmd = ""
           Quittierung = "rechts"
           Call Xbee
           A = 160
           Compare1a = A
           Pan1 = 0
           Pan2 = 1
           Waitms 70
           Pan1 = 0
           Pan2 = 0
    
    
        Case "R"
           Clear Serialin
           Cmd = ""
           Quittierung = "REchts"
           Call Xbee
           A = 160
           Compare1a = A
           Pan1 = 0
           Pan2 = 1
           Waitms 700
           Pan1 = 0
           Pan2 = 0
    
    
         Case "l"
           Clear Serialin
           Cmd = ""
           Quittierung = "links"
           Call Xbee
           A = 160
           Compare1a = A
           Pan1 = 1
           Pan2 = 0
           Waitms 70
           Pan1 = 0
           Pan2 = 0
    
    
        Case "L"
           Clear Serialin
           Cmd = ""
           Quittierung = "LInks "
           Call Xbee
           A = 160
           Compare1a = A
           Pan1 = 1
           Pan2 = 0
           Waitms 700
           Pan1 = 0
           Pan2 = 0
    
    
        Case "+"
           Clear Serialin
           Cmd = ""
           Quittierung = "S1 hoch  "
    
           Servo = Servo + 50
    
    
        '(
    
         Case "U"
           Clear Serialin
           Cmd = ""
           Quittierung = "S1 Hoch  "
    
           Servo(1) = S1_links
    ')
    
        Case "-"
           Clear Serialin
           Cmd = ""
           Quittierung = "S1 runter  "
    
           Servo = Servo - 50
    
    '(
        Case "D"
           Clear Serialin
           Cmd = ""
           Quittierung = "S1 Runter  "
    
           Servo(1) = S1_rechts
    ')
        Case "1"
           Clear Serialin
           Cmd = ""
           Quittierung = "LED     "
    
           Cam_gnd = 0
           Waitms 150
           Cam_gnd = 1
    
    
        End Select
    
    
         Call Xbee                                              ' kontinuierliches Senden der Parameter
    
    
    Loop
    
    
    
    End
    
    
    '----------------Timer2 "20ms" für Servosteuerung-------------------------------
    
    Timer2_irq:
    
      20ms_flag = 1
    
      Timer2 = Timer2vorgabe
    
    
    Return
    
    
    '----------------LiPo-Saver/Abschaltung "Lipo_saver"----------------------------
    
    Lipo_saver_off:
       Quittierung = "LiPo-Saver!"                              ' Quittierung an Bodenstation
       Quittierung = ""                                         'Quittierung löschen
       Waitms 500
    
       Pwr_video = 0
       Pwr_gps = 0
       Pwr_all = 0                                              ' pwr_all off
       Led_rot = 1                                              ' led_rot off
    
       Pwr_atmega = 0                                           ' atmega8 off
    
       Powerdown
    
    Return
    
    
    '----------------Sonstiges------------------------------------------------------
    
    
    
    Link:
    
    Led_rot = 1
    
    Return
    
    
    
    No_link:
    
    Led_rot = 0
    
    Return
    
    
    
    Sub Xbee
    
        Print "$GROUND" ; "#" ; Quittierung ; "#" ; Zellspannung ; "#" ; Temperatur ; "#" ; Gpshoehe
    
    
    End Sub

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    32
    Beiträge
    311
    Hi,

    probier mal ein Pulseout von ca. 3000 nur zum Test.

    Gruß Kay
    ...::: AVRFreak :::...

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.100
    Hallo Christoph,
    Wenn du alle 20ms die Pulseout Ausgabe haben willst, dann darf deine Hauptschleife auf keinen Fall länger laufen.
    Waitms 600 geht dann gar nicht. Die Wartezeit für den Sensor musst du dann auch über den Timer machen.
    Z.B. in dem du eine zweite Variable hochzählen lässt. Hat sie dann den Wert 30 (20ms * 30 = 600ms) rufst du die Befehle zum Auslesen des Sensors auf.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo,

    3000 wirft was aus und die von dir, for_ro, beschriebene Vorgehensweise habe ich umgesetzt.

    Allerdings stimmt was nicht mit meinen errechneten Werten!

    Ich setze den pulseout-Wert beim Start bspw. auf 2000. Dann erhöhe ich bzw. verringere ich diesen Wert.

    Ich konnte so herausfinden, dass ich von ca. 1300 bis 4700 gehen konnte - ab den jeweiligen Werten blockiert dann der Servo bzw. ist er am Anschlag.

    In meinem oben geposteten Code schaltet sich die Schaltung (Relais) unter 6,3 Volt anliegender Spannung ab (-> Gosub Lipo_saver_off). Nun konnte ich feststelllen, dass wenn ich Pulseout verwende, sich die Schaltung nach Reset abschaltet. Ich hatte erst eine zu hohe Stromaufnahme des Servos vermutet, aber da verändert sich nichts dran.

    Kann Pulseout meine ADC(3) Messung beeinflussen?

    Das ganze funktioniert jetzt nur, wenn ich mein "Gosub Lipo_saver_off" auskommentiere...

    Gruß
    Spelli

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    03.09.2011
    Beiträge
    72
    Hallo,

    vielen Dank für die Antworten. Es funktioniert jetzt alles!

    Komisch nur, dass es diese "tausender" Werte sind?

    Noch eine weitere Frage:
    In der Timer Routine lasse ich jetzt 3 Zaehler hoch laufen, da ich die noch anderweitig verwende. Wann wirds mit vielen "Zählern" problematisch? Weil das werden dann ja irgendwann keine 20ms mehr sein...

+ Antworten
Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. SD21 servo programm befehl speicherung problem
    Von michel999 im Forum Controller- und Roboterboards von RobotikHardware.de
    Antworten: 0
    Letzter Beitrag: 17.01.2011, 16:13
  2. Servo stört Microcontroller
    Von Krampfda im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 19
    Letzter Beitrag: 08.10.2009, 20:22
  3. servo-befehl in interrupt-routine funzt nicht
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 28.02.2009, 18:49
  4. cmucam 2 frage zu befehl Servo Mask
    Von Projector im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 19.01.2007, 17:07
  5. Servo mit Bascom Befehl mach nur "scheiße"
    Von AVRboy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 22.10.2006, 22:58

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •