Forum: Mikrocontroller und Digitale Elektronik Library Servo.h


von Rene T. (hifi-freak)


Lesenswert?

Tach!

da die library Servo.h sämtliche 16-bit Timer okkupiert, wollte ich 
fragen, ob man da einfach was dran ändern kann in nur einem Sketch?

von :-? (Gast)


Lesenswert?

Bitte erschlage uns nicht mit Infos wie Programmiersprache, Target, etc!

von Karl H. (kbuchegg)


Lesenswert?

:-? schrieb:
> Bitte erschlage uns nicht mit Infos wie Programmiersprache, Target, etc!

Arduino.

Das sagt schon alles.

von Alex W. (a20q90)


Lesenswert?

Karl Heinz schrieb:
> :-? schrieb:
>> Bitte erschlage uns nicht mit Infos wie Programmiersprache, Target, etc!
>
> Arduino.
>
> Das sagt schon alles.

Und wo bitte steht das?

von Karl H. (kbuchegg)


Lesenswert?

Alex W. schrieb:
> Karl Heinz schrieb:
>> :-? schrieb:
>>> Bitte erschlage uns nicht mit Infos wie Programmiersprache, Target, etc!
>>
>> Arduino.
>>
>> Das sagt schon alles.
>
> Und wo bitte steht das?

Das erschliesst sich aus der Verwendung des Wortes 'Sketch'

von Rene T. (hifi-freak)


Lesenswert?

Entschuldigung erneut

ARDUINO als Sprache
Library, die in nem Sketch dabei ist heisst Servo.h
damit kann man zwar sämtliche Servos ansteuern, aber die 16-bit Timer 
sind dann alle reserviert dafür!

genügt das ?

von Alex W. (a20q90)


Lesenswert?

Rene Trattner schrieb:

>
> genügt das ?

Nö! Lad mal den Source hier hoch damit man sich das anschauen kann!
Arduino ist zwar C, aber nicht jeder hat die Servo.h auf seinem Rechner!

von Rene T. (hifi-freak)


Lesenswert?

1
#ifndef Servo_h
2
#define Servo_h
3
4
#include <inttypes.h>
5
6
/* 
7
 * Defines for 16 bit timers used with  Servo library 
8
 *
9
 * If _useTimerX is defined then TimerX is a 16 bit timer on the curent board
10
 * timer16_Sequence_t enumerates the sequence that the timers should be allocated
11
 * _Nbr_16timers indicates how many 16 bit timers are available.
12
 *
13
 */
14
15
// Say which 16 bit timers can be used and in what order
16
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
17
#define _useTimer5
18
#define _useTimer1 
19
#define _useTimer3
20
#define _useTimer4 
21
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ;
22
23
#elif defined(__AVR_ATmega32U4__)  
24
#define _useTimer3
25
#define _useTimer1 
26
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
27
28
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
29
#define _useTimer3
30
#define _useTimer1
31
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
32
33
#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
34
#define _useTimer3
35
#define _useTimer1
36
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
37
38
#else  // everything else
39
#define _useTimer1
40
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;                  
41
#endif
42
43
#define Servo_VERSION           2      // software version of this library
44
45
#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo  
46
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo 
47
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
48
#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds 
49
50
#define SERVOS_PER_TIMER       12     // the maximum number of servos controlled by one timer 
51
#define MAX_SERVOS   (_Nbr_16timers  * SERVOS_PER_TIMER)
52
53
#define INVALID_SERVO         255     // flag indicating an invalid servo index
54
55
typedef struct  {
56
  uint8_t nbr        :6 ;             // a pin number from 0 to 63
57
  uint8_t isActive   :1 ;             // true if this channel is enabled, pin not pulsed if false 
58
} ServoPin_t   ;  
59
60
typedef struct {
61
  ServoPin_t Pin;
62
  unsigned int ticks;
63
} servo_t;
64
65
class Servo
66
{
67
public:
68
  Servo();
69
  uint8_t attach(int pin);           // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure
70
  uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. 
71
  void detach();
72
  void write(int value);             // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds 
73
  void writeMicroseconds(int value); // Write pulse width in microseconds 
74
  int read();                        // returns current pulse width as an angle between 0 and 180 degrees
75
  int readMicroseconds();            // returns current pulse width in microseconds for this servo (was read_us() in first release)
76
  bool attached();                   // return true if this servo is attached, otherwise false 
77
private:
78
   uint8_t servoIndex;               // index into the channel data for this servo
79
   int8_t min;                       // minimum is this value times 4 added to MIN_PULSE_WIDTH    
80
   int8_t max;                       // maximum is this value times 4 added to MAX_PULSE_WIDTH   
81
};
82
83
#endif



das is die header-Datei im Ganzen....habe versucht sie abzuändern, 
Timer5 rausgenommen bei der define für den ATMega2560, dann gespeichert 
und sie als Header Datei benutzt...funktioniert so nicht!

: Bearbeitet durch Moderator
von Wolfgang (Gast)


Lesenswert?

Alex W. schrieb:
> Nö! Lad mal den Source hier hoch damit man sich das anschauen kann!
> Arduino ist zwar C, aber nicht jeder hat die Servo.h auf seinem Rechner!

Und vielleicht interessiert auch noch der dazugehörige Programmcode.

Bei der Servoansteuerung ist übrigens nur die Dauer des High-Pulses 
zeitkritisch und meist dürfte dafür eine Auflösung von 8 Bit ausreichend 
sein. Die Dauer des Low-Teils muss man dann anders erzeugen, z.B. über 
die Funktion millis().

von Alex W. (a20q90)


Angehängte Dateien:

Lesenswert?

Rene Trattner schrieb:
> #ifndef Servo_h

Mensch Ruppert!

von Rene T. (hifi-freak)


Lesenswert?

die Auflösung beträgt eh 8 bit, was ich so sehe!

ich leg dann ein Map an, was von 10 bit Analog auf 8 bit PWM ausgibt!

ich bräucht einfach nur einen freien 16-bit Timer für was 
anderes...aaaaaber leider geht das nicht wegen der Servo.h


und da ich ein Zeitfenster von 0,1sec benötige (CTC Timer), komme ich 
mit dem 8-bit Timer0 nicht aus...hab da rumgerechnet....aber dann müsste 
ich die Interrupts alle 0,01 sec auslösen...

von Hubert G. (hubertg)


Lesenswert?

Der M328 hat nur einen 16bit Timer, wie willst du den frei machen?

von :-| (Gast)


Lesenswert?

> aaaaaber leider geht das nicht wegen der Servo.h
Dann schmeiß sie raus und schreib dir passende Funktionen.

von Jürgen S. (jurs)


Lesenswert?

Rene Trattner schrieb:
> Tach!
>
> da die library Servo.h sämtliche 16-bit Timer okkupiert, wollte ich
> fragen, ob man da einfach was dran ändern kann in nur einem Sketch?

Tach auch.
1
#define SERVOS_PER_TIMER       12

Wie viele Servos steuerst Du denn tatsächlich an?

Mehr als 12 Servos?

von Rene T. (hifi-freak)


Lesenswert?

1 Servo wird angesteuert...da kommt auch nix mehr dazu!!!

wie gesagt, hab sie schon "abgeändert", aber das funktioniert so nicht!

2560er hat 4 Timer 16-bit....nicht einen !!

von Jürgen S. (jurs)


Lesenswert?

Rene Trattner schrieb:
> 1 Servo wird angesteuert...da kommt auch nix mehr dazu!!!

Wenn Du bis zu maximal 12 Servos ansteuert, verwendet die Library nur 
einen einzigen Timer. Also auch bei 1 Servo 1 Timer.

Die Library verbraucht "einen Timer pro ein Dutzend Servos".

von :-| (Gast)


Lesenswert?

Rene Trattner schrieb:
> 1 Servo wird angesteuert...
Wenn man nur ein bisschen Ahnung hätte wäre es kein Problem einen 
einzelnen Servo mit nur einem 16bit Timer abzusteuern.

von Rene T. (hifi-freak)


Lesenswert?

...interessant, weil ich bei Verwendung von der Servo.h und z.B. TIMER4 
beim Kompilieren folgende Fehler bekomme ->

Servo\Servo.cpp.o: In function `__vector_42':
C:\Program Files (x86)\Arduino\libraries\Servo/Servo.cpp:117: multiple 
definition of `__vector_42'

GoKart_ARDUINO_PROGRAMM_20102014_V2.cpp.o:C:\Program Files 
(x86)\Arduino/GoKart_ARDUINO_PROGRAMM_20102014_V2.ino:260: first defined 
here
c:/program files

(x86)/arduino/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../av 
r/bin/ld.exe:  Disabling relaxation: it will not work with multiple 
definitions

die Einstellung am TIMER 4 sieht so aus
    TCCR4A=0;
    TCCR4B=0;
    OCR4A=40500;
    TCCR4B|=(1<<WGM42);
    TCCR4B|=(1<<CS41)|(1<<CS40);
    TIMSK4|=(1<<OCIE4A);

von Rene T. (hifi-freak)


Lesenswert?

:-| schrieb:
> Rene Trattner schrieb:
>> 1 Servo wird angesteuert...
> Wenn man nur ein bisschen Ahnung hätte wäre es kein Problem einen
> einzelnen Servo mit nur einem 16bit Timer abzusteuern.

und wenn es so dumme "Antworten" nicht gäbe, wäre das Leben 
untereinander sicher freundlicher....is aber nicht, gell ?"

von Jürgen S. (jurs)


Lesenswert?

Rene T. schrieb:
> ...interessant, weil ich bei Verwendung von der Servo.h und z.B. TIMER4
> beim Kompilieren folgende Fehler bekomme ->

Keine Ahnung, was von Deinen Programmierkünsten, von denen Du mal wieder 
reichlich wenig vorzeigst, zu diesen Compiler-Fehlern führt.

Auf dem Atmega2560 ist die Definition und Reihenfolge der Timer so:
1
// Say which 16 bit timers can be used and in what order
2
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
3
#define _useTimer5
4
#define _useTimer1 
5
#define _useTimer3
6
#define _useTimer4 
7
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ;

Also für die ersten 12 Servos wird "Timer5" als Timer verwendet.

Zu beachten wäre dabei noch, dass standardmäßig Timer5 auch für die 
PWM-Pins mit den Pin-Nummern 44,45,46 verwendet werden, so dass Du bei 
Verwendung der Servo-Library nicht auch noch gleichzeitig PWM an den 
Pins 44,45,46 machen kannst.

Ein zweiter Timer auf Deinem Atmega2560 wird jedenfalls von der 
Servo-Library erst dann verwendet, wenn Du 13 oder mehr Servos über die 
Library steuern möchtest.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.