aber alle werte zwischen 5 und 30 hauen den servo gegen den linke anschag
Leute, ihr schafft mich ;)
@Virus: Wenn die Servomitte ca. 1,5ms ist (manche Dokus sagen auch 1ms), dann ist 0,5 oder gar 3ms weit außerhalb des Drehbereichs.
@schmiereck: Bei diesem Beispiel mit dem Deltabot verwende ich die LEDs (IO1-4 und BPL/BPR) am Userbus1 den ich bei meinem RP6 so belegt habe:
Dabei war mein Ziel möglichst viele Pins für externe Erweiterungen rauszuführen. An 2-4-6 bzw. 14-12-10 kann man direkt ein Servo einstecken. ADC7 ist übrigends der Batterie-ADC den ich auf der Platine unterbrochen und mit Jumper umgerüstet habe.SL1 1 - 2 GND
SL2 3 - 4 Vcc
SL3 5 - 6 ADC0
SL4 7 - 8 ADC7
SL5 9 - 10 ADC1
SL6 10- 12 Vcc
frei 13- 14 GND
Hier gibts die USRBUS-Belegung von Dirk die für den Anschluß einer Erweiterungsplatine viel sinnvoller ist:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=32549
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
aber alle werte zwischen 5 und 30 hauen den servo gegen den linke anschag
Mit hochohmigen Grüßen
Virus
Es lebe der Digitalkäse !
Hallo Virus,
dass dein Servo immer an der selben Seite anschlägt habe ich leider überlesen. Da sleep() auch beim M32 (es geht doch um ein M32, oder?) mit 10kHz getaktet wird und deshalb ein sleep(1) wohl auch 0,1ms dauert, erscheint mir ein Fehler im aufrufenden Programm von servo() als Ursache für deinen Effekt. Wird initRP6Control() aufgerufen? Wie sieht das restliche Programm (aufs wesentliche reduziert) aus.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
OK, verstanden, danke vielmals.
Das war das, was mir gefehlt hat.
In der vermaldeteiten (und wirklich nicht schlechten) Doku habe ich nur die Infos auf die zwei freie Analog/Digital Wandler (ADC) Kanäle für eigene Sensoren." auf Seite 10 gefunden. Das irgendwo, bei bei Motorstrom und Batterie (S.90), noch zwei freie Kanäle dokumentiert sind, da muss man erst einmal drauf stossen... (danke für die Hinweisse)
Mein Fazit, erst einmal, ich warte auf mein Erweiteruns-Board. Das "missbrauchen" von "Betriebssystem-Funktionen" ist mir zu krass, ich finde den Grundaufbau nicht schlecht und will ihn nicht unbedingt ändern (ADC7 vierbiegen) - nix gegen basten, ich liebe es - aber das ist mir dann doch alles zu komplex, ich will ja meine Software zum laufen bringen...
Ich weiss schon was radbruch sagen wird: da musst du nur in der baseLib die Zeilen xy rausnhemen, und dann...
@radbruch: Warum benutzt du nicht so ein Erweiterungs-Borad? Sind das praktische Erwägungen?
Gruß,
smk
Laut den ganzen Beschreibung müsste dieser Code doch eigentlich funktionieren (mit den versch. Werten).
Ich habe jetzt schon die verschiedenen Werte probiert (von 10 bis 20).Code://Beschreibung: imp ist die Impulslänge (0.1ms=1) void servo_io6 (int imp) //Kanal als Ausgang //Impuls für imp . ms //Pause bis zum nächsten Impuls { DDRC |= IO_PC6; PORTC |= IO_PC6; sleep(imp); PORTC &= ~IO_PC6; sleep(200-imp); }
Das Servo bewegt sich zwar, aber überhaupt nicht weit (ca. 10 Grad, wenn es überhaupt 10 sind).
Die Mittelstellung liegt im Vergleich mit einem Graupner Empfänger bei 13ms.
Soll ich mal andre Werte versuchen, wenn ja welche oder habe ich einen Fehler eingebaut, etc.?
PS: Das Servo soll nach Möglichkeit am Leben bleiben ... ist eigentlich das Höhenruderservo eines Modellfliegers und auch noch eingebaut
Hallo
Mal ehrlich, was soll man mit den Codebrocken anfangen die ihr uns hier vorwerft? Wenn die Servo()-Funktion von Virus nicht funktioniert und deine quasi identische Funktion (außer der Mitdenkeränderung sleep(200-imp);) auch nicht funktioniert, woran könnte das dann liegen? Funktionieren meine beiden sleep()-Beispiele von oben wenn ihr sie ans M32 anpasst? Wie sieht das angepasste Programm aus? Ich weiß immer noch nicht, ob ihr überhaupt ein M32 verwendet. Wie und wo ist IO_PCx definiert? Warum ist bei dir imp ein Integer?
@schmiereck: Für's M32 bin ich schlicht zu geizig ;)
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Ich kann mir nicht vorstellen wo sonst der Fehler liegen sollte ... hoffe ja doch dass ich ne übergabe eines Wertes in ein Nebenprogramm zusammenbringe.
Ich verwende die Erweiterungsplatine M32 und IO_PC6 (in diesem Fall) ist in der Library RP6ControlLib.h definiert.Code:#include "RP6ControlLib.h" //Beschreibung: imp ist die Impulslänge (0.1ms=1) //Servo an PC5 void servo_io5 (int imp) //Kanal als Ausgang //Impuls für imp . ms //Pause bis zum nächsten Impuls { DDRC |= IO_PC5; PORTC |= IO_PC5; mSleep(imp); PORTC &= ~IO_PC5; mSleep(200-imp); } int main(void) { initRP6Control(); initLCD(); showScreenLCD("RP6 Control", "RP6"); clearLCD(); sleep(500); showScreenLCD("Servobewegung", ""); sleep(1500); int i=0, x; while(i<100) //2000ms { servo_io5(13); //i=i+1; } i=0; x=10; while(true) { while(i<10) //200ms { servo_io5(x); } x=x+1; if (x>=20) { x=10; } } while(true) { showScreenLCD("Endlosschleife", ""); } return 0; }
Man kann mit den Befehlen dann die verschiedensten Sachen machen:
aus der Beschreibung des M32 ModulsWenn man einen I/O Pin als Ausgang verwenden will, um z.B. eine LED zu schalten,
muss man das entsprechende Bit im DDRx Register auf 1 setzen.
Beispiel:
DDRC |= IO_PC7; // PC7 ist nun Ausgang
DDRC = IO_PC7 | IO_PC6 | IO_PC5; // PC5, PC6, PC7 sind nun Ausgang,
// alle anderen Pins sind Eingänge!
Dann kann man über das PORTx Register den Ausgang auf high oder low pegel schalten.
Beispiel:
PORTC |= IO_PC7; // High
PORTC &= ~IO_PC7; // Low
Ist ein Bit im DDRx Register 0, so ist der zugehörige Pin als Eingang konfiguriert.
Beispiel:
DDRC &= ~IO_PC6; // PC6 ist nun Eingang
Dann kann man über das PINx Register den Zustand des Pins auslesen, also ob high
oder low Pegel am Pin anliegt.
if(PINC & IO_PC6)
writeString_P("PC6 is HIGH!\n");
else
writeString_P("PC6 is LOW!\n");
Ich habe den Code jetzt auf PC5 umgeschrieben. Ich bin mir allerding bei der Sache mit sleep(.ms) mittlerweile nicht mehr sicher.
Wie sollte ich die imp - Variable sonst deklarieren? Müsste doch eigentlich passen.
Hallo
Ich vermute, die IO-PCx werden in iom32.h der AVR-Includes definiert, bin aber grad zu faul zu suchen
Wie kommt man denn aus diesen Schleifen wieder raus:
i wird nirgends verändert.Code:while(i<100) //2000ms { servo_io5(13); } ... while(i<10) //200ms { servo_io5(x); }
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
ich glaub das war noch der code bevor ich es probiert habe ... werds umbessern
... wir sind ja alle nur Menschen![]()
@radbruch:
Wenn die IO Port in einer anderen Lib definiert sind, wieso funktioniert es dann z.B. einen Tranistor so (fast so) anzusteuern?
edit:
ich hab beim probiern das i++ weggenommen ...
dann bleibt das servo immer in der mittelstellung und ich muss nichts im Code ändern
Hallo
Die IO_PCx werden in RP6Control.h als (1<<PCx) definiert, das ist also ok. Sonst würde sich wohl auch gar nichts tun. iom32.h wird automatisch von avr/io.h eingebunden, dieses wiederum steht ebenfalls in RP6Control.h
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen