Forum: Mikrocontroller und Digitale Elektronik AVR HEX-BOT Programmierung


von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

ich hab mir ein Hex-bot gebaut. ein Roboter mit 6 Beinen und je 3 
servos.
die servos werden über ein Servo-Bord(slave) angesteuert, welches über
I2C(TWI) mit einem ATMega32(Master) verbunden ist.

die sollwinkel der servos stehen in ein array von
1
struct movement_struckt{ float pos[21];uint8_t step;};  // move.h
wobei pos die winkel aller ansteuerbaren servos enthält und sep die 
Wartezeit ist bis die servos die Position erreichen.  siehe main.c 
Anfang

die Funktion
1
int movement(const struct movement_struckt *move_x);
führt alle Bewegungen eines solchen array nacheinander aus. siehe move.c

mein Problem:  die arrays
1
const struct movement_struckt move_up[6];
2
const struct movement_struckt move_down[6];
lassen sich beide richtig ausführen, wenn ich jeweils das andere array 
auskommentiere. wenn ich jedoch beide in meinem Programm habe und sie 
hintereinander ausführen möchte, spielen alle servos verrückt und fahren 
sogar an Positionen außerhalb meiner programmierten Begrenzung

ich habe zuerst vermutet das der Speicher voll ist. habe es mir daher 
mit avr-size angeschaut:
1
...:~/projekte/hexbot$ avr-size --mcu=atmega32 -C bin/Release/hexbot.elf
2
AVR Memory Usage
3
----------------
4
Device: atmega32
5
6
Program:    7152 bytes (21.8% Full)
7
(.text + .data + .bootloader)
8
9
Data:       1450 bytes (70.8% Full)
10
(.data + .bss + .noinit)

daraus entnehme ich das noch platz ist.

Hat jemand eine Idee wo mein Fehler liegt? ich komme echt nicht weiter.

von Peter II (Gast)


Lesenswert?

joachim j. schrieb:
> daraus entnehme ich das noch platz ist.

ja, aber nur beim Start. Nach dem Prozeduren aufgerufen werden braucht 
man auch noch Platz für den Stack.

Ich würde zur Optimierung auf float verzichten, so genau kann eh kein 
Servo sein. Vermutlich reicht sogar ein Byte aus.

von Peter II (Gast)


Lesenswert?

Nachtrag:

const struct movement_struckt move_home[2]=
const struct movement_struckt move_down[6]=
const struct movement_struckt move_up[6]=


mache die variablen mal noch static, und schau dann mal die 
Speicherausgabe an.

von Joachim J. (felidae)


Lesenswert?

ich benutze float weil die dir werte als Winkel in Bogenmaß gespeichert 
sind

von Oliver (Gast)


Lesenswert?

Die beiden Arrays sind zusammen 170 Byte groß, dazu kommen dann noch ein 
paar weitere lokale Variablen. Das kann noch passen, muß aber nicht.

Wenn die Arrays sowieso konstant sind, kannst du die auch im Flash 
unterbringen, das spart Sram.

Oliver

von Peter II (Gast)


Lesenswert?

joachim j. schrieb:
> ich benutze float weil die dir werte als Winkel in Bogenmaß gespeichert
> sind

das ist doch aber kein Grund. Man kann auch 1/10 Grad in ints speichern.

42 ^= 4.2 Grad

von Joachim J. (felidae)


Lesenswert?

statt static hab ich die Arrays jetzt außerhalb der int main() 
deklariert.

hat geholfen.
aber mehr als die beiden Bewegungen ,up/down, bekomme ich aus 
Speichermangel nicht unter. ich werde mein Konzept überdenken müßen

von Karl H. (kbuchegg)


Lesenswert?

Du musst vor allen Dingen überdenken, wie sinnvoll die unkritische 
Verwendung von float ist.

von Joachim J. (felidae)


Lesenswert?

ich habe mächtig umher gebastelt und jetzt eine Version bei der die 
Daten für die Bewegungen in int8_t gespeichert werden. die Berechnung 
finden aber immer noch in float statt.

wehre es sinnvoll auch die Berechnung zu ändern.

von Peter II (Gast)


Lesenswert?

joachim j. schrieb:
> wehre es sinnvoll auch die Berechnung zu ändern.

kommt darauf an, ob dein Programm noch mehr machen soll. float braucht 
recht viel Platz im Flash.
Wenn du aber fertig bist und alles funktioniert wie es soll, brauchst du 
es nicht ändern.

von Joachim J. (felidae)


Lesenswert?

es sollen ja noch so einige Bewegungen dazukommen. wenn ich also wieder 
an die Speichergrenze komme muß ich wohl doch noch mal ran.

vorerst ist mein Problem gelöst.

 danke für die Hilfe. :)

von chris_ (Gast)


Lesenswert?

Hey, da fehlt noch ein hübsches Bildchen von Deinem HEX-BOT.

von Joachim J. (felidae)


Angehängte Dateien:

Lesenswert?

Bilder könnt ihr haben!

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.