-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: RN-Beitrag Servoansteuerung und Atmega8 Probleme?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405

    RN-Beitrag Servoansteuerung und Atmega8 Probleme?

    Anzeige

    Hallo,
    habe folgendes Problem:
    ich habe mir erfolgreich eine Platine samt Programmer für einen Atmega 8 gefertigt und wollte darüber 4 Servos ansteuern. Dann bin ich prompt auf den RN Beitrag gestoßen und wollte das Script testen.
    Doch leider funktioniert das Ganze nicht so wie es soll - die Servos bewegen sich zwar, dies aber nur in kurzen ruckligen Schritten (wenn überhaupt). Habe schon mit dievrsen anderen wartezeiten für die Timer probiert doch alles erfolglos. Auch das Umschreiben des Scriptes für nur einen Servo hat mir nix gebracht...

    Verwenden tue ich:
    einen Atmega 8PU
    einen NimH-Akku mit 4,8V (Spannung konstant -> gemessen)
    C* Standard Servo (Billigteil)

    Kann das eventuell am Atmega8 liegen (die Werte im Kopf des scriptes habe ich angepasst)? Leider konnte ich laut Datenblatt keine relevanten Unterschiede feststellen...

    MFg Erik

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Es gibt im RN-Wissen mehrere Servoprogramme. Zeig uns doch einfach deine Version mit den geänderten Kopfdaten, dann müssen wir nicht lange suchen und raten.

    Tipp aus der Hüfte: Mit dem Kontrollertakt stimmt etwas nicht. Bei interener Taktquelle Vorteiler /8 aktiv, dann ist der Takt nur 1MHz anstatt 8MHz. Oder bei externer Taktquelle Fuses auf intern gesetzt.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405
    okok, hier der Code:

    Code:
    $regfile "m8def.dat"
    $crystal = 16000000
    $framesize = 24
    $swstack = 8
    $hwstack = 32
    Config Timer1 = Timer , Prescale = 8                        'timer für Servos
    Enable Timer1
    Timer1 = 62535
    
    Config Portc = Output
    Portc.5 = 0                                                 'hier hängt servo1
    Portc.4 = 0                                                 'hier hängt servo2
    Portc.3 = 0                                                 'hier hängt servo3
    Portc.2 = 0                                                 'hier hängt servo4
    
    Config Portb.1 = Output
    Config Portb.2 = Output
    Portb.1 = 1
    Portb.2 = 0
    
    
    On Timer1 Servoirq                                          'servo
    
    Enable Interrupts
    
    Dim Kanal As Byte
    Dim Servo(4) As Word                                        'min: 61535, mitte 62535, max 63535 = 2000 schritte
    
    
    Waitms 100
    Portb.2 = 1
    Portb.1 = 0
    
    Do
    Servo(1) = 63535
    
    Servo(2) = 61535                                            'Mitte
    Servo(3) = 62535                                            'Mitte
    Servo(4) = 62535                                            'Mitte
    Loop
    
    Servoirq:
    If Kanal = 0 Then
       If Portc.5 = 0 Then                                      'wenn port low
          Timer1 = Servo(1)                                     'dann timer auf entsprechende verzögerung
          Portc.5 = 1                                           'und port anschalten
       Else                                                     'das hier passiert erst bei dem darauf folgenden interrupt
          Portc.5 = 0                                           'dann port wieder ausschalten
          Incr Kanal                                            'und den nächsten kanal bearbeiten
       End If
    End If
    
    If Kanal = 1 Then
       If Portc.4 = 0 Then
          Timer1 = Servo(2)
          Portc.4 = 1
       Else
          Portc.4 = 0
          Incr Kanal
       End If
    End If
    
    If Kanal = 2 Then
       If Portc.3 = 0 Then
          Timer1 = Servo(3)
          Portc.3 = 1
       Else
          Portc.3 = 0
          Incr Kanal
       End If
    End If
    
    If Kanal = 3 Then
       If Portc.2 = 0 Then
          Timer1 = Servo(4)
          Portc.2 = 1
       Else
          Portc.2 = 0
          Incr Kanal
       End If
    End If
    
    If Kanal = 4 Then
       Timer1 = 40000
       Kanal = 0
    End If
    
    Return
    End

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Oje, "Bascom" hatte ich völlig überlesen. Und da bin ich eher Laie ;) Ich versuche es aber trotzdem mal:

    Config Portc = Output
    PC6 ist der Reset-Pin. Möglicherweise ein Problem.

    Dim Kanal As Byte
    Wird Kanal dann auch zu Null? Bei jedem Startwert der nicht 1, 2, 3 oder 4 ist würde die ISR nicht funktionieren.

    Timer1 = 40000
    Die Impulse sollten alle 20ms wiederholt werden. Das wären 25535+Servo(1)+Servo(2)+Servo(3) für Timer1 bei Servo(4).

    Aber ich glaube nicht wirklich, dass hier ein Treffer dabei ist.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    (die Werte im Kopf des scriptes habe ich angepasst)
    Das ist sehr löblich, aber wenn Dein Controller mit irgeneiner anderen Frequenz als 16 MHz läuft, ist es damit nicht getan!

    Die Werte 61535 für minimalen Ausschlag und 63535 für maximalen Ausschlag ergeben sich ja aus der Taktfrequenz des Timer1 (2 MHz, da Prescaler = 8 ) und der Zeit, die er bis zum Überlauf braucht (1 bzw. 2 ms).

    Wenn Du den Mega8 also mit einem anderen Takt fährst, müsstest Du diese Werte für Servo(x) entweder neu berechnen - oder uns den Takt verraten, dann können wir sicherlich helfen

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Moin moin.

    Warum so Kompliziert? Bascom hat dafür einen Befehl und
    der klappt super!

    Code:
    'Servo's need a pulse in order to operate
    'with the config statement CONFIG Servos we can specify how many servo's we
    'will use and which port pins are used
    'A maximum of 16 Servos might be used
    'The SERVO statements use one byte for an interrupt counter and the TIMER0
    'This means that you can not use TIMER0 anymore
    'The reload value specifies the interval of the timer in uS
    'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
    $regfile = "2313def.dat"
    
    Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
    'as an option you can use TIMER1
    'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1
    
    
    'we use 2 Servos with 10 uS resolution(steps)
    
    'we must configure the port pins used to act as output
    Config Portb = Output
    
    'finally we must turn on the global interrupt
    Enable Interrupts
    
    'the servo() array is created automatic. You can used it to set the
    'time the servo must be on
    Servo(1) = 10                                               '10 times 10 = 100 uS on
    'Servo(2) = 20                                               '20 times 10 = 200 uS on
    Do
    Loop
    
    Dim I As Byte
    Do
     For I = 0 To 100
       Servo(1) = I
       Waitms 1000
     Next
    
     For I = 100 To 0 Step -1
     '  Servo(1) = I
       Waitms 1000
     Next
    Loop
    End
    Gruß Richard

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.269
    Hi,
    ja der Bascom interne Befehl geht gut wenn die Servos sich nur "irgendwie" bewegen sollen (das reicht wohl für 95% der Anwendungen). Wenns präziser und mit höherer zeitlichen Auflösung laufen sol ist der oben genannt Code schon geeigneter.
    Mit welcher Frequenz läuft denn nun dein Mega8...?
    Viele Grüße, William
    -> http://william.thielicke.org/

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405
    sehe ich das falsch, dass mit
    "crystal = 16000000" die Interne Frequenz gesetzt wird?
    (Mit den Berechnungen ist mir mitlerweile alles klar)

    Von Extern hätte ich noch einen Quarz mit 16Mhz zur Verfügung, wollte jedoch für die ersten Test erstmal so probieren.

    Wollte den internen Befehl erstmal lassen und es selbst versuchen, aber vlt. kann ich es erstmal so probieren...


    [edit]
    Ich muss mich wohl bei euch entschuldigen, ich habe verpeilt, dass die interne Frequenz auf 1Mhz festgelegt ist! Habe das Script dementsprechend umgeschrieben und alles läuft flüssig!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.269
    "crystal = 16000000" sagt deinem Programm was du in den Fuses für eine Frequenz eingestellt hast. Wenn das nicht identisch ist kommt Murks raus. Standardmässig läuft ein Mega8 glaube ich auf 1MHz.
    Viele Grüße, William
    -> http://william.thielicke.org/

  10. #10
    Erfahrener Benutzer Roboter-Spezialist Avatar von erik_wolfram
    Registriert seit
    02.12.2009
    Ort
    Berlin
    Beiträge
    405
    Ja danke - also die interne Frequenz ist wirklich 1Mhz - damit läuft alles bestens - habe jetzt 4 Servos ohne Probleme zu laufen gehabt.
    Leider bin ich noch in totaler Anfänger und hab hier und da Wissenslücken!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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