- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: servoansteuerung mit ATTINY13

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2004
    Ort
    Berlin
    Alter
    70
    Beiträge
    436

    servoansteuerung mit ATTINY13

    Anzeige

    E-Bike
    ich hab einen servotester gebaut, der mit dem ATTINY13 arbeiten soll.
    Über 2 potis sollen die Servos eingestellt werden. Dazu gehört dieses Programm. In den Fuse-Einstellungen ist der Teiler des Oszillators OFF.
    Die LED blinkt mit ca 5 Hz, die Servos rühren sich aber nicht.

    Vielleicht ist jemand so nett und schaut mal über das Programm, ob ein grober fehler drinne ist.

    Besten Dank, Stupsi


    Code:
    'micro                    : ATTINY13
    'Analogeingänge sind ADC2 und ADC3
    'LED ist PB2
    'Servo-anschlüsse sind PB0 und PB1
    '-----------------------------------------------------------------------------------------
    $regfile = "ATtiny13.dat"
    $crystal = 9600000
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
    
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Led Alias Portb.2
    
    Config Adc = Single , Prescaler = Auto
    Dim A As Word
    Dim B As Word
    
    Start Adc
    Do
       A = Getadc(2)
       B = Getadc(3)
       Servo(1) = A / 4
       Servo(2) = B / 4
       Toggle Led
      Waitms 100
    Loop
    
    
    End

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2004
    Ort
    Berlin
    Alter
    70
    Beiträge
    436
    ich hab die Werte für Servo(x) mal mit festen Werten geprüft... und das servo wird richtig angesteuert. daher liegt der Fehler im Auslesen des AD-Wandlers.
    er soll ja Werte 0... 1024 auslesen. Die teile ich durch 4, um auf 0...255 zu kommen. Im Simulator geht beim Teilen etwas schief... aber was?

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.04.2005
    Beiträge
    146
    Versuche, die Teilung in mehrere Schritte zu zerlegen:
    So etwa:
    A=Getadc
    A=A/4
    Servo=A
    Bascom will oft keine Zuweisungen, die erst noch in der selben Zeile berechnet werden müssen.
    Gruß, Rene

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,
    Du kannst dir mal die Ausgabe des Compilers ansehen, welche Adresse die Variablen usw. haben, (Ctrl+W)
    denn der T13 hat nur 64Byte SRAM, und Deine Werte für hw-/swstack, und frame sind zusammen schon grösser.
    Weiss allerdings auch nicht immer wann frame angelegt wird.
    steht aber alles im Wiki.

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2004
    Ort
    Berlin
    Alter
    70
    Beiträge
    436
    ja, besten Dank für die antworten. Die Berechnungen müssen einzeln durchgeführt werden. Die stack-definitionen werd ich mir noch mal reinziehen.

    jetzt funktioniert das Programm. Das Ergebnis:
    Code:
    '-----------------------------------------------------------------------------------------
    'name                     : tiny13_servo_joystick-1.bas
    'copyright                : (c) 2007,helvo
    'purpose                  : Joystick-STEUERUNG einer Kamera mit 2 Servos
    'micro                    : ATTINY13
    'Analogeingänge sind ADC2 und ADC3
    'LED ist PB2
    'Servo-anschlüsse sind PB0 und PB1
    '-----------------------------------------------------------------------------------------
    $regfile = "ATtiny13.dat"
    $crystal = 9600000
    $hwstack = 32                                               ' default use 32 for the hardware stack
    $swstack = 10                                               ' default use 10 for the SW stack
    $framesize = 40                                             ' default use 40 for the frame space
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 5
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Led Alias Portb.2
    
    Dim A As Word
    Dim B As Word
    Dim I As Byte
    
    Enable Interrupts
    Start Adc
    
    Do
    
    A = Getadc(2) / 4                                           
    B = Getadc(3) / 4                                           
       Servo(1) = A
       Servo(2) = B
    
       Toggle Led                                               
       Waitms 20                                                
                                                                 
    Loop
    
    End
    Gruss Helmut

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    wieso wird der adc wert durch 6 geteilt durch 4 müsste doch den byte wert ergeben

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2004
    Ort
    Berlin
    Alter
    70
    Beiträge
    436
    mit dem Teilerfaktor (hier 6) hab ich gleich die Mittelstellung des Servos durch Probieren eingestellt. Ein Wert von 5,8 wäre für die Mini-Servos von Conrad noch genauer.
    Wieso das so ist, weiss ich nicht, aber es funktioniert so. Mittelstellung und Endausschlag stimmen.

    Gruss Helmut

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    und wieviele zwischenwerte bekommst du dann wenn du die 10bit durch 6 teilst doch max 127

    nicht die vollen 255

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2004
    Ort
    Berlin
    Alter
    70
    Beiträge
    436
    mit dem Teiler 6 kommt man auf ca. 180.

    magic, Besten Dank für deinen Einwand. Da hab ich doch mal ins manual geschaut und lieber doch mit den Reload-zeiten als mit dem Teiler gespielt.

    Der Teiler 4 muss genommen werden und die Reload-Zeit auf 5 oder 6 runtergesetzt werden. dann passt es.

    helmut

Berechtigungen

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

LiFePO4 Speicher Test