Hallo Leute, ich hab ein Problem mit Arrays und weiß nicht woran das liegt. Ich möchte einen Steppertreiber schreiben. Folgendes funktioniert bei mir nicht (alles mit avr-gcc, neuste Version ) /********************************************/ const char step_pattern[]={0xC,0x6,0x3,0x9) ; for (;;) { for unit8_t x=0; x<= 3; x++) { outp ( step_pattern[x], PORTC) ; /* Kurze Pause */ } } /********************************************/ /* mache ich das Ganze dann aber so, gehts */ /* einwandfrei */ /********************************************/ for (;;) { outp(0xC, PORTC) ; /* kurze Pause */ outp(0x6, PORTC) ; /* kurze Pause */ outp(0x3, PORTC) ; /* kurze Pause */ outp(0x9, PORTC) ; /* kurze Pause */ } Also keine Compilerfehler oder sowas, nur bei der Schleife mit dem Array, dreht sich nix am Motor. Hat jemand eine Erklärung dafür. Übrigens, das Ganze soll auf einem AT90S2333 laufen. Gruß Bernd. Und nochwas, gestern habe ich das schon mal gepostet, aber heute ist meine Frage nicht mehr im Forum enthalten - WARUM ? -
So, wie es dasteht, muß es aber Compilerfehler geben. ;-) Es fehlt mindestens eine Klammer. Mit der Deklaration einer Variablen innerhalb einer for-Anweisung würde ich mich persönlich auch schwer tun, das Feature gibt es zwar schon eine Weile bei C++, aber bei C ist es erst im C99 enthalten (zu dem der gcc derzeit noch nicht völlig kompatibel ist), außerdem hat sich selbst bei C++ der Scope der Variablen im Laufe der Jahre noch geändert... outp() ist übrigens deprecated, und es gibt keinen Grund, warum Du nicht gleich PORTC = 0xc; schreiben solltest. Ansonsten wüßte ich aber nicht, was an Deinem Array falsch sein sollte.
Habe Bernd's Code Fragmente zu einem kompleten Programm zusammengebaut und in der Tat Probleme mit der Init vom globalen Arrays festgestellt (siehe Anhang). Offenbar wird static const uint8_t step1[]={0xC,0x6,0x3,0x9} ; nicht bei der Programm Initialisierung gesetzt.
Hallo Leute Ich habe ähnliche Erfahrungen gemacht mit Strings, die ich im Flash ablegen wollte. Das hat nur geklappt, wenn ich die entsprechenden Variablendeklarationen innerhalb eines Funktionsbody gemacht habe, und wenn auc nur in main(). Somit scheint der GCC hier wirklich ein paar Probleme zu haben mit globalen Arrays. Aber bei dem Preis kann man ja nicht meckern ;-) Gruss Christian
Habe es mit avr-gcc -O -o foo -mmcu=at90s2333 foo.c compiliert und mit avr-objdump -d foo disassembliert. Ich sehe in __do_copy_data das Kopieren von Flash-Adresse 0xc0 nach RAM-Adresse 0x60 ... < 0x64. Die Initialisierung des Z-Registers mutet sehr umständlich an, wahrscheinlich liegt das daran, daß der Compiler ja verschieblichen Code erzeugt. Es passiert in main() in Adresse 0x72...0x7f. Dafür ist dann der für die Schleife erzeugte Code wieder recht kompakt.
Nee, man, bitte keine Polemik. Der GCC mag Bugs haben, aber die manifestieren sich nicht in kaputtem Code (wenn man einen Bug erwischt, bekommt man das in aller Regel laut und deutlich gesagt ;-). Gerade Variablen im Flash ablegen ist nicht ganz so trivial. Ein Array von Strings, die selbst auch wieder im Flash sind, muß man (leider) recht umständlich anlegen, siehe FAQ. Ein normales initialisiertes Array muß aber funktionieren, und das Compilat aus Peters Beispiels sieht auch ordentlich aus. In leicht anderer Form habe ich sowas auch selbst schon benutzt. Wenn das also irgendwo nicht geht, sollten wir das eigentliche Problem klären, statt hier die Behauptung im Raum stehen zu lassen, daß eine Initialisierung globaler Variablen nicht tun würde. Nur mal am Rande: das avr-objcopy, mit dem Ihr das File für den Programmer erzeugt, kopiert aber hoffentlich sowohl text als auch data Section, ja? Ansonsten braucht Ihr Euch nicht wundern...
Hallo Leute, erstmal Danke für die rege Beteiligung an meinem Problem. So den Code hab ich nicht via Copy&Past eingefügt sondern selbst schnell runter geklimpert. Ich benutzt zum download "sp12" der müsste eigentlich die DATA section korrekt downloaden - aber das prüf ich nochmals nach - danke für den Tip. Also mit dem disassemblieren habe ich auch alles gemacht und die gleichen Ergebnisse wie Jörg gehabt. Nun ja aus der Not eine Tugend gemacht, habe ich halt das Ganze nicht mit einem Array gemacht. Sollte von Euch doch noch jemand des Rätsels Lösung finden, würde ich mich über das Ergebnis freuen. Erstmals vielen Dank für Eure Hilfen Gruß Bernd
> Ich benutzt zum download "sp12" der müsste eigentlich die > DATA section korrekt downloaden [...] Nee du. Das hat mit der Programmiersoftware nun gar nichts zu tun, es sei denn, Du hättest einen programmer, dem Du das elf32-avr File direkt unterschieben kannst, aber davon gehe ich jetzt nicht aus. Du wirst wohl eher ein Intel Hex (oder Motorola Srecord oder binary) File benötigen -- und das ist das Ergebnis eines avr-objcopy aus dem ELF file. Ebendieses avr-objcopy muß nun .text und .data (und nur diese) kopieren. Wenn gar nichts angegeben ist, werden alle sections mit Inhalt kopiert, das würde zur Not auch gehen, belegt Dir aber zusätzlichen Flash (sinnloserweise), falls Du mal EEPROM-Variablen noch hast.
Oh, das ist ja gut zu wissen. Nunja bin halt noch ein AVR Neuling. Also nochmals Danke für die vielen guten Tips und nun weiß ich ja wenn ich mal ein Problem hab, dann frag ich .... Gruss Bernd
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.