Author Topic: Servo attach/detach  (Read 14259 times)

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Servo attach/detach
« on: October 22, 2013, 04:58:17 PM »
Salut,

an einem LCD kontrolliere ich die Brightness über Pin D10. Wenn ich einen Servo an Pin D11 hänge, kann ich mit analogWrite(10,wert) die Helligkeit des LCD über wert steueren. Sobald ich den Servo mit myservo.attach(11) ansteuere, kann ich die Helligkeit nicht mehr regeln. ein Wert von 255 schaltet das LCD auf Hell, alles kleiner 255 auf dunkel.
In der Arduino Referenz wird beschrieben, dass man nach einem myservo.detach() wieder normal auf D10 mit analogWrite zugreifen kann.
Leider funktioniert das so nicht. Hat jemand damit Erfahrung oder einen Tipp?

Ciao, Mathias

Nukular

  • Newbie
  • *
  • Posts: 45
  • Karma: +1/-0
Re: Servo attach/detach
« Reply #1 on: October 23, 2013, 01:47:44 AM »
Welcher Arduino ?
Ev. wird der Anschluss doppelt belegt z.B. vom Timer ?

microtherion

  • freakyfriday
  • Full Member
  • *
  • Posts: 163
  • Karma: +13/-0
Re: Servo attach/detach
« Reply #2 on: October 23, 2013, 04:17:10 AM »
In der Arduino Referenz wird beschrieben, dass man nach einem myservo.detach() wieder normal auf D10 mit analogWrite zugreifen kann.

Habs noch nicht probiert, aber vom Source Code her sieht es danach aus, als ob servo.detach zwar den Timer 1 freigibt, aber ihn nicht wieder in einen Zustand bringt, dass er dann wieder für PWM zu brauchen ist. Die Lösung ist grundsätzlich, den geeigneten Initialisierungscode aus init() in https://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/wiring.c zu kopieren.

MathiasW

  • Global Moderator
  • Hero Member
  • *****
  • Posts: 614
  • Karma: +13/-0
    • my Arduino page
Re: Servo attach/detach
« Reply #3 on: October 23, 2013, 09:20:55 AM »
Salut,

Genial!
Ich habe folgenden code in den sketch eingefügt:
Code: [Select]
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

void reinit(){
  TCCR1B = 0;

  // set timer 1 prescale factor to 64
  sbi(TCCR1B, CS11);
  sbi(TCCR1B, CS10);

  // put timer 1 in 8-bit phase correct pwm mode
  sbi(TCCR1A, WGM10);
}
Nach dem myservo.detach() rufe ich reinit() auf und alles funktioniert
Herzlichen Dank für den Tipp!
Ich habe dabei noch eine schöne Seite zu den Arduino codedetails gefunden: http://garretlab.web.fc2.com/en/arduino/inside/index.html

Ciao, Mathias

 

anything