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?
:-? schrieb: > Bitte erschlage uns nicht mit Infos wie Programmiersprache, Target, etc! Arduino. Das sagt schon alles.
Karl Heinz schrieb: > :-? schrieb: >> Bitte erschlage uns nicht mit Infos wie Programmiersprache, Target, etc! > > Arduino. > > Das sagt schon alles. Und wo bitte steht das?
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'
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 ?
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!
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
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().
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...
> aaaaaber leider geht das nicht wegen der Servo.h
Dann schmeiß sie raus und schreib dir passende Funktionen.
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?
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 !!
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".
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.
...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);
:-| 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 ?"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.