Tim schrieb:> paar zeilen drüber ist doch der ServoId=0 eingestellt
Aber da steht ServoValue[ServoId]. Was ein Array ist und was dort ein
Index ist, ist dir bekannt? Falls nicht, lerne bitte erstmal die
C-Grundlagen bevor du an Servos gehst.
gruß cyblord
kannst du mir das bitte erklären? ich weiß schon was ein Array ist. ich
stehe auf'm schlauch. je länger ich mir das angucke, desto mehr bin ich
durcheinander.
gruß
Tim
Tim schrieb:> Ist das so schwer zu erklären was "ServoValue[ServoId]" bedeutet?>>> gruß> Tim
Ich habs dir bereits erklärt. Es enthält den Wert auf den das Servo (mit
der ID=ServoId) drehen soll. Es ist ein Array, für jedes Servo gibts
einen Wert. Auf diesen Wert wird mithilfe des Index (ServoId)
zugegriffen.
Sorry aber wenn du wüsstest was ein Array ist dann würdest du beim
ersten hingucken wissen was das bedeutet.
Ich glaube nicht dass du mit dem Prinzip eines Array vertraut bist. Wie
würdest DU denn z.B. die Werte von 10 Servos in deinem Programm
speichern? Überleg dir das mal.
gruß cyblord
Tim schrieb:> Also verläuft der Index [ServoId] von 0 bis 8.>>> gruß> Tim
Ja, wenn NR_SERVOS = 8 definiert wurde dann schon. Das hochzählen und
rücksetzen des Index übernimmt diese Zeile
Stefan Frings schrieb:> Bei 8 Servos reicht die ID von 0-7. Da die Zählung beim 0 beginnt, ist> der höchste Wert immer eins kleiner als die Größe des Array.
Das weiß er doch, er kennt sich doch mit Arrays aus.....
Tim schrieb:> Verstanden. danke. Also es fängt bei index 0 an und endet bei index 7> und fängt dann wieder bei 0 an.>> das hat mich bisschen verwirrt, weil da
1
staticunit8_tServoId=0
2
>
> steht und das bedeutet doch, ServoId wird eine Null zugewiesen.>>> gruß> Tim
Ja, es wird mit 0 INITIALISIERT. Heißt aber ja nicht dass die Variable
für immer auf diesem Wert bleiben muss. Daher auch VARIABLE. Sonst wärs
ja ne Konstante. Grundlagen und so gelle...
gruß cyblord
nein, kann man nicht - ich kann beliebige arrays verwenden, die absolut
nichts mit NR_SERVO zu zun haben.
in diesem konkreten fall läuft der index im bereich von 0 bis
NR_SERVO-1. das funktioniert aber auch nur weil das array "zufällig" mir
einer größe von NR_SERVO initialisiert wurde...
Tim schrieb:> man kann sage alle Indexwerte von Arrays sind auf NR_SERVO bezogen.>>
Soll das eine Frage sein? Macht absolut keinen Sinn, weder als Frage
noch als Aussage.
gruß cyblord
Tim schrieb:> Verstanden. danke. Also es fängt bei index 0 an und endet bei index 7> und fängt dann wieder bei 0 an.
Neeein, der fängt dann "nicht wieder" bei 0 an. Wenn NR_SERVOS mit 8
belegt ist, sind die erlaubte Werte für den Index 0..7 - und fertig.
Tim schrieb:> weshalb wird bei der while-schleife ServoValue [0] +=1;> bzw. bei den anderen genauso, um eins addiert?
Damit sich beim Servo was tut, wenn das Programm läuft?
C-Versteher schrieb:> Tim schrieb:>> weshalb wird bei der while-schleife ServoValue [0] +=1;>> bzw. bei den anderen genauso, um eins addiert?>> Damit sich beim Servo was tut, wenn das Programm läuft?
wie was tut?
da wird doch nur addiert
Mike J. schrieb:> @ cyblord> Erkläre nichts was andere schon erklärt und mit Bildern ausgeschmückt> haben, es ist doch schade um die Zeit die man opfert.>> @ Tim (Gast)> Setz dich mal hin und lies ein Buch.>> http://openbook.galileocomputing.de/c_von_a_bis_z/...
noch so einen tollen Ratschlag?
Tim schrieb:> wie was tut?> da wird doch nur addiert
Stimmt, aus Programmsicht schon. Hast du den Sinn des Programms schon
verstanden? Es geht darum, Steuerimpulse für mehrere Servos zu erzeugen.
C-Versteher schrieb:> Tim schrieb:>> wie was tut?>> da wird doch nur addiert> Stimmt, aus Programmsicht schon. Hast du den Sinn des Programms schon> verstanden? Es geht darum, Steuerimpulse für mehrere Servos zu erzeugen.
das habe ich verstanden. mich irritiert es bisschen, dass manchmal die
1, 2 oder 3 durcheinander kommt.
Tim schrieb:> das habe ich verstanden. mich irritiert es bisschen, dass manchmal die> 1, 2 oder 3 durcheinander kommt.
Da kommt nichts durcheinander. Die Servos werden verschieden
gesteuert. Sonst wäre es ja langweilig und man könnte sie einfacher
parallel schalten.
Frage an Tim:
Was willst Du eigentlich wissen?
Wie man ein Programm schreibt?
Wie dieses Programm aufgebaut ist?
Wie einzelne Befehle in C aussehen und was sie bewirken?
Der Tip ein Buch zu lesen war nicht so weit entfernt, wenn man Deine
Beiträge liest. Sie trotzen von grundlegendem Unverständnis der Materie.
Da ist lernen der Grundlagen der einzige Lösungsansatz.
spontan schrieb:> Frage an Tim:> Was willst Du eigentlich wissen?>> Wie man ein Programm schreibt?> Wie dieses Programm aufgebaut ist?> Wie einzelne Befehle in C aussehen und was sie bewirken?
Die ersten 2 Fragen interessieren mich . Wie geht man vor, wenn ich ein
Programm schreiben möchte? Entwirft ihr eine Zeichnung oder tippt ihr
einfach drauf los.
> Der Tip ein Buch zu lesen war nicht so weit entfernt, wenn man Deine> Beiträge liest. Sie trotzen von grundlegendem Unverständnis der Materie.> Da ist lernen der Grundlagen der einzige Lösungsansatz.
Ich bin fleißig dabei zu lernen, aber manchmal verstehe ich den
Zusammenhang nicht.
Gruß
Tim
ServoValue ist ein Array
Beispiel:
uint8_t myArray[3]; // deklariere ein Array mit 3 Feldern
myArray[0] = 128; // den ersten Feld eine Variable / Wert geben
myArray[1]=64; // das zweite Feld besitzt jetzt einen Wert
myArray[2]=32; // jetzt auch das dritte Feld
myArray[3]=255; // Fehler: es existiert kein drittes Feld im Array
Bild:
myArray zeigt auf das erste Feld ... zeiger weiter schieben um auf das
nächst höhere Feld zu kommen
||
\/
| 128 | 64 | 32 |
|_____|_____|_____|
1.Feld,2.Feld,3.Feld
Mike J. schrieb:> Beispiel:
...
hättest du mal lieber deinen eigenen ratschlag befolgt, anstatt jetzt
auch noch mit zeigern anzufangen...
Mike J. schrieb:> @ cyblord> Erkläre nichts was andere schon erklärt und mit Bildern ausgeschmückt> haben, es ist doch schade um die Zeit die man opfert.>> @ Tim (Gast)> Setz dich mal hin und lies ein Buch.>> http://openbook.galileocomputing.de/c_von_a_bis_z/...
Lerne erstmal die Grundlagen von C. Dann lerne, einen Mikrocontroller in
C zu programmieren. Du könntest diverse Dinge mit einem Taster und einer
LED anstellen. Fang mit etwas einfachem an.
Und wenn Du Dich da dann sicher fühlst, erst dann ist der Zeitpunkt
gekommen, mit komplexerer Hardware zu experimentieren und Programme mit
mehr als 20 Zeilen zu bearbeiten.
Viele Anfänger wollen mit ganz coolen Sachen anfangen, die sie aber
nichtmal ansatzweise verstehe. Man lernt in kleinen Schritten, und man
beginnt da, wo man sich auskennt.
Bäcker fangen mit Brot und Brötchen (Hefeteig) an, nicht mit
Schwarzwälder Kirschtorten.
Hi
>Bäcker fangen mit Brot und Brötchen (Hefeteig) an, nicht mit>Schwarzwälder Kirschtorten.
Das ist ja auch etwas für Konditoren nicht für Bäcker.
MfG Spess
spess53 schrieb:>> Das ist ja auch etwas für Konditoren nicht für Bäcker.
Damals in der DDR ... als das Brot und die Brötchen noch geschmeckt
haben, da hat der Bächer sowohl Brot als auch Kuchen gebacken.
Die haben für das Brot damals eine Art Holzgefeuerten Wasserdampf-Ofen
verwendet, für den Kuchen einen anderen speziellen Herd. (besser gedämmt
und größer als das was man im Markt bekommt)
Das war noch ein alter Familienbetrieb, den gibt es zwar immer noch,
aber jetzt verkaufen die den gleichen Sche*ß wie alle ... das Gelumpe
schmeckt nicht und ist teuer wie sau.
(sorry, aber ich verstehe nicht weshalb dieses Handwerk so vor die Hunde
gehen konnte)
Ein frische Brötchen hat man damals für 5 Pfannige bekommen, das sind
2.5 Westpfennige und 1.25 cent.
Ein "gesundes" (eigentlich viel dunkler Farbstoff, wenig Roggen)
Brötchen kostet 50 cent, ein ganz billiges Brötchen kostet heutzutage 25
cent.
Ich glaube es gibt nich billigeres eingeschweißtes Zeug, aber das kann
man nicht mehr genießen ... das ist nur noch ein Energielieferant.
Mike J. schrieb:> Ein "gesundes" (eigentlich viel dunkler Farbstoff, wenig Roggen)> Brötchen kostet 50 cent, ein ganz billiges Brötchen kostet heutzutage 25> cent.
Das täuscht. Kosten tut es immer noch ein paar Cent.
Für 25..50 ct wird es verkauft und offensichtlich gibt es genug Leute,
die das dafür bezahlen.
Mike J. schrieb:> Ein frische Brötchen hat man damals für 5 Pfannige bekommen, das sind> 2.5 Westpfennige und 1.25 cent.
Das ist das Problem, denn bei Servos ist das umgekehrt. Früher (TM)
waren sie fast unbezahlbar, heute sind sie fast billiger als ein Brot.
Für den letzten Zehnerpack Mini-Servos aus Hongkong habe ich 16 Euro
bezahlt.
Servos sind so billig erhältlich, dass sich viele Möchtegern-Bastler
draufstürzen, obwohl ihnen das nötige Wissen fehlt und sie auch nicht
bereit sind, sich dieses (selbst) anzueignen. Leute, kauft lieber Brot
als Servos, der Umgang damit ist einfacher...
...
Wer Ironie findet, darf sie behalten...
Mike J. schrieb:> Ein frische Brötchen hat man damals für 5 Pfannige bekommen, das sind> 2.5 Westpfennige und 1.25 cent.
Ohrr neee, ich kanns nichmehr hoeren.
Die Verkaeuferin hat damals auch nur 700 Mark verdient. Und jetzt komm
nicht mit ner neuen Verhaeltnissrechnung, oder willst du die Broetchen
wieder Subventionieren?
bye uwe
Uwe R. schrieb:> Die Verkaeuferin hat damals auch nur 700 Mark verdient.
Wenn man die Sachkompetenz von manchem "Fach"-Verkäufer oder
Servicemitarbeiter an der Hotline kennt, scheint das auch heute noch
eine angemessene Bezahlung für die Leistung zu sein.
Uwe R. schrieb:>> Ohrr neee, ich kanns nichmehr hoeren.
Sorry, war etwas weit Offtopic.
> Die Verkaeuferin hat damals auch nur 700 Mark verdient.
Und ein Ingenieur hat nur 650 Mark verdient ...
Die Miete für eine 2.5 Zimmer Wohnung lag bei 25 Mark (= 12.50 Westmark
= 6.25 Euro)
Wasser und Strom gabe es fast umsonst.
Es ist nur doof dass ich selbst Brot/Brötchen backen muss um mal an ein
frisches und noch duftendes zu gelangen.
Es gibt schon seit einiger Zeit Duftstoffe die wie frische Brötchen
richten, das Zeug wird 100% auch schon seit einiger Zeit an diese
Aufbackläden verteilt damit sie mit dem Geruch Kunden anlocken können.
Ach Gottchen, Ostalgie, wie widerlich. Muss man sich jetzt schon an den
vermeintlich besseren Brötchen in der Zone hochziehen? Wie armselig. Da
hätte man die ganzen Flüchtlinge doch einfach mal mit einem Hinweis auf
die geilen Brötchen wieder heimgeschickt. Manche ewig gestrigen
kapierens es wohl nie.
gruß cyblord
Und ja, wir leben in einem hochentwickelten Industrieland. Das bedeutet
dass auch Nahrumgsmittel zu einem großen Teil industriell hergestellt
werden. Das ist der Preis. Der Preis dafür dass niemand verhungert, dass
die Nahrungsmittel trotzdem von hoher Qualität und weitgehend unbelastet
sind. Dass die Preise so niedrig sind dass auch ärmere Menschen neben
Nahrungsmitteln noch andere Dinge kaufen können. Ihr wollt
Naturbelassenheit? Geht in Sahel-Zone. Oder in anderen Drittweltländer.
Dort findet ihr sowas. Naturbelassen verhungern. Oder ganz natürlich an
Krankheiten krepieren über man hier nur müde lächelt. Alles ganz
natürlich. Entscheidet euch.
Nirgendwo lebt man anscheinend derart ungesund, wie hier (westliche
Welt): Industrielle (jaja Schimpfwort gelle, nur ich finde das nicht.)
Nahrungsmittel, Chemie, Umweltbelastung, zu wenig Bewegung, zu fettes
Essen, zu viel Essen, das falsche Essen, Feinstaub, Lärm und und und.
Und komischerweise werden die Leute nirgendwo älter. Und nirgendwo so
gesund älter. Lebenserwartung jenseits der 70, bald>80 im Durchschnitt,
werdet ihr in euren Bilderbuch Naturbelassenen Paradiesen nicht finden.
gruß cyblord
cyblord, Du verkennst den angeborenen(?) Egoismus dahinter: Der Mensch
will immer mehr als er hat. Was schlechter ist als das, was er hat,
interessiert ihn nicht.
Hätte man.
Will man aber nicht.
Denn an dieser Stelle interessieren mich Millisekunden nicht mehr.
Die Servoposition wird festgelegt durch
0 ganz links
CENTER in der Mitte
2 * CENTER ganz rechts
egal, wie sich das in Millisekunden ausdrückt.
>> aber wie kann das sein?>> MILLISEC_BASE + CENTER wären doch eigentlich die Mittelstellung.
MILLISEC_BASE wird in der ISR addiert. Soviel Zeit muss dort schon sein.
Für denjenigen, der die Ansteuerung benutzt sind ausschliesslich Zahlen
von 0 bis 2*CENTER interessant. Mit Zeiten und Millisekunden will ich
mich in main oder sonstigen Routinen nicht mehr rumschlagen müssen.
Ich habe es mir hunderte male noch mal angeguckt, aber verstehen tut ich
es wirklich noch nicht, warum CENTER die Mittelstellung ist.
Nach meiner Berechnung wäre CENTER 0,5ms. Aber ein Servo braucht doch
ein Puls zwischen 1ms und 2ms, damit er sich bewegt.
Kann sein, dass der OCR0-Register, der Höchstwert ist, also 86 und sich
alles zwischen 0 und 86 abspielt? dann wäre es für mich logisch warum
CENTER CENTER ist.
gruß
Tim
Tim schrieb:> Nach meiner Berechnung wäre CENTER 0,5ms. Aber ein Servo braucht doch> ein Puls zwischen 1ms und 2ms, damit er sich bewegt.
Richtig! Aber da addiert die ISR noch die Basisimpulslänge von 1,0 ms
dazu.
Dies hat den Vorteil, dass man sich nicht mehr um den festen Anteil der
Impulsdauer kümmern muss, sondern nur noch um den variablen Anteil:
Karl Heinz Buchegger schrieb:> Hätte man.>> Will man aber nicht.> Denn an dieser Stelle interessieren mich Millisekunden nicht mehr.> Die Servoposition wird festgelegt durch>> 0 ganz links> CENTER in der Mitte> 2 * CENTER ganz rechts>> egal, wie sich das in Millisekunden ausdrückt.
...
Tim, der beste aller Tipps die du hier bekommen hast war der, erst mal
ein C Buch durchzuarbeiten.
Und damit meine ich wirklich "arbeiten" also auch die Aufgaben und
Beispeiele selbst! programmieren.
Man lernt C programmieren nicht mal nebenbei in 5 Tagen a 3 Stunden.
>> d.h doch 86 + 43.
Ja, und?
Jetzt gehst du her, rechnest das aus und rechnest das mit der bekannten
taktfrequenz und dem Vorteiler in eine Zeit um. Und du wirst sehen, dass
mit diesem Ergebnis (86+43) 1.5ms rauskommen. Und wenn ServoValue[0] den
Wert 0 hat, dann steht da 86 + 0 und wenn man das in eine Zeit umrechnet
dann kommen da ca. 1ms raus. Und wenn ServoValue[0] den Wert 86 hat,
dann ergibt 86+86 welchen Wert in Zeit ausgedrückt? Ungefähr 2ms
Also genügt es einen Wert von 0 bis (in diesem Fall 86) nach ServoValue
zuzuweisen und das Servo fährt alle Positionen von links nach rechts an.
Und der in der Mitte, der heißt eben CENTER.
Was'n da jetzt so schlimm daran?
0 Äpfel kosten 0 Euro
43 Äpfel kosten 0.5 Euro
86 Äpfel kosten 1 Euro
Und für die Kiste will der Bauer auf jeden Fall auch 1 Euro haben.
Und anstelle von 0, 43 und 86, nennen wir das ganze einfach 0, CENTER
und 2*CENTER.
Das ist einfach nur eine konstante Zahl, die auf jeden Fall zum
Gesamtpreis mit draufgeschlagen wird. Und hier ist es eben eine
konstante Zeit (eben die 1ms oder eben der Zahlenwert 86), der zur
Pulszeit auf jeden Fall draufgeschlagen wird, weil ich ihn sowieso immer
brauche.
Dann kann ich mir zb den Wert vom ADC holen und so umrechnen
1
ServoValue[0]=adc_read(0)*2*CENTER/1024;
und mit einem Poti ein Servo von ganz links nach ganz rechts verfahren.
Und zwar ohne dass ich auch nur 1 Gedanken an irgendwelche Millisekunden
verschwenden muss. Ich muss nur Wissen, dass 2*CENTER die Position ganz
rechts ist. Wenn mich der 2-er stört, dann definiere ich eben
#define RIGHT 2*CENTER
und schreibe
ServoValue[0] = adc_read(0) * RIGHT / 1024;
und wenn ich eben mit meinen Sevowerten anders hochkomme und die anders
berechne, dann berechne ich die eben anders. Alles was ich wissen muss:
0 ist ganz links
CENTER ist in der Mitte
2*CENTER ist ganz rechts
und es ist mir völlig egal
a) welches da die genauen Zahlen sind
b) ob ich da noch irgendwelche Werte dazu addieren muss.
vielen dank für die Antworten und an den Leuten, die gedult mit mir
hatten. Für die anderen, die blöde Kommentare abgeben haben... Dies war
auch, denk ich mal, die letzte Frage.
gruß Tim