Pages: 1 [2]   Go Down
Author Topic: Servosteuerung über "Servo lib" macht keinen Muckser  (Read 1954 times)
0 Members and 1 Guest are viewing this topic.
Bavaria Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 121
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Arduino Duemilanove ist soweit ok, Spannungsversorgung und Taktfrequenz sind stabil.

Das von mir vorher Beschriebene mit "4x so schnell" vergesst bitte - das waren durch ungünstige Pinwahl Clocksignale vom gleichzeitig über ISP angesteckten Programmer, sorry. smiley-sad

Weiter auf der Fehlersuche mit dem Oszi, es läuft folgendes simple Programm:
Code:
void setup() {
  pinMode(7, OUTPUT);

  START:
   digitalWrite(7,HIGH);
   delayMicroseconds(1000);
   digitalWrite(7,LOW);
   delay(1);  // für Servotest soll es 19 sein, bitte aber erst weiterlesen
  goto START;
}

void loop {
}

/*
Bitte nicht schreiben, daß die Routine ohne "goto" genauso gut in die "loop" gepasst hätte.
Ich wollte nur absolut sicher sein, daß der Compiler auch wirklich
nur ein "jump" im Maschinencode generiert.
*/

Das Ergebnis:

9 Perioden laufen absolut korrekt, dann kommt kurioserweise eine ca. 80ms lange Pause, für einen Mikrocontroller recht lang. Dieses Muster wiederholt sich dann endlos.

Würde ich, passend für den Servo, die 2. Pause mit 19ms setzen, so gibt es nur eine korrekte Periode, anschliessend wieder die lange "Pause".

Eine Erklärung wäre, daß der Prozessor wohl etwas besseres zu tun hat - normalerweise wären es entsprechende Interruptroutinen - aber mit so langer Dauer und welche überhaupt? Oder sleep Modi bzw. watchdog - aber wer hätte die dann aktiviert? Sehr seltsam.

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sehr merkwürdig.

Der letzte Puls fällt deutlich langsamer ab, als hätte sich dein Pin in einen hochohmigen Zustand geschaltet. Bekommt dein Arduino vielleicht alle 100ms ein Reset durch einen Programmer oder unsaubere Spannungsversorgung?
Logged

Bavaria Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 121
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nein, läuft "standalone" - nichts externes mehr dran. Als Spannungsversorgung habe ich auch schon verschiedene probiert, oben hängt er an einem Labornetzteil mit max. 3A Leistung. Spannung sieht auf dem Oszi auch absolut sauber aus.
Deine Idee mit dem wiederkehrenden "reset" würde auf den ersten Blick aber gut zu dem Verhalten passen, mal sehen, wie ich das am besten feststellen kann.

Anmerken will ich noch, daß ich jetzt mit dem Oszi auch das Signal nach Aufruf über die Servolib angesehen habe, aber da kommt unverändert gar nichts - es bleibt immer LOW. Ich gehe davon aus, daß ein "attachInterrupt" und "Servo.write" im Setup für den Test genügt, der refresh also durch die lib automatisch erledigt wird.
« Last Edit: March 10, 2012, 02:12:59 am by mmi » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 269
Posts: 21834
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast Du den watchdog aktiviert?
Was siehst Du am Pin wenn du es nur HIGH setzst?

Code:
void setup() {
  pinMode(7, OUTPUT);
  digitalWrite(7,HIGH);
 }
void loop {
}
grüße Uwe
Logged

Bavaria Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 121
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Uwe,

nach etlichen Stunden habe ich gerade wieder eingeschaltet. Jetzt kommen die 9 Perioden nur noch einmal nach dem Einschalten, dann bleibt dauerhaft alles LOW. Nach Reset dasselbe.

Watchdog o.ä. habe ich nicht gesetzt, es ist alles sehr jungfräulich:
Neuen ATmega328 eingesetzt -> "Burn Bootloader" für DUEMILANOVE mit AVR ISP MKII -> "Upload using Programmer"
Vor jedem Test Programmer abgesteckt, nur Oszi hängt an Pin 7 und GND.
Alles so einfach wie möglich gehalten.

Setze ich nach Deinem Vorschlag Pin7 dauerhaft auf HIGH, dann ist alles bestens, das mag "er"  smiley  
... und dauerhaft LOW mag er auch.

EDIT:
Am Resetpin geht das Signal nur auf LOW, wenn die Resettaste gedrückt wird. Würde man einen internen Reset z.B. durch Watchdog hier auch sehen ?
 
« Last Edit: March 10, 2012, 10:54:56 am by mmi » Logged

Bavaria Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 121
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Problem endlich aufgeklärt:

Ich bin bisher davon ausgegangen, daß die Arduino-IDE auch mit ISP Programmer den Speicherbereich mit dem bootloader korrekt behandelt - zumal ich bisher schon öfter so problemlos gearbeitet hatte. Leider ist es so nicht. hfuse wird für einen nur 512 words grossen Bootbereich gesetzt - anstelle von 2048! Das führte zu diesen abenteuerlichen Effekten, seltsamerweise trotz typgleichem Prozessor immer ein anderes Verhalten. Wie auch immer - es ist nichts defekt.

Lösung:
Obwohl ich ein "Duemilanove" habe, darf dieses bei der Arbeit mit einem ISP-Programmer nicht als board gewählt werden - ich verwende "Arduino Mini w/ Atmega328", dann klappt's.

Danke auch nochmal für die Tipps,
Gruß, mmi.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 39
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die Aufklärung :-)

Da bekomme ich ein kleines Gefühl für die möglichen Schwierigkeiten, die auf mich zukommen, wenn ich doch mal unter die ISP-Besitzer gehe :-o
Logged

Bavaria Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 121
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Stimmt, da kommen schon einige Tücken dazu - da merkt man erst, wie angenehm das Arduino-Konzept ist, schließlich wurde es ja auch deswegen erfunden. smiley

Reizvoll ist auch, z.B. mit den kleinen attinys und der Arduino-IDE zu arbeiten - hierfür gibt es bereits plugins und es ist nicht so schwierig, sich auch für atmega168/328 eine bootloaderfreie Konfiguration zu erstellen. Das hätte ich zuerst machen sollen, aber nachher ist man immer schlauer.
Logged

Pages: 1 [2]   Go Up
Jump to: