Forum: Mikrocontroller und Digitale Elektronik ATMega88 Umwandlung IAR -> GCC


von Jan (Gast)


Lesenswert?

Hallo zusammen

Ich würde gerne das Programm zur Brushless-DC Motoransteuerung von der 
Atmel-Seite auf meinen Mega88 laden. (Datei AVR447 
http://www.atmel.com/products/AVR/mc/)

Allerdings hänge ich gerade bei der Umwandlung der IAR-Befehle in 
gcc-Befehle.

Wie müsste die folgende Zeile für den GCC aussehen?
1
__flash const uint8_t sineTable[SINE_TABLE_LENGTH * 3] = {
2
.
3
.(hier stehen die Tabellendaten)
4
.
5
.

Wenn ich die zu
1
uint8_t sineTable[SINE_TABLE_LENGTH * 3] PROGMEM = {

umforme, erscheint die Fehlermeldung

error: expected '=', ',', ';', 'asm' or '__attribute__' before 'PROGMEM'

Wie müsste der Code richtig aussehen?

Ich arbeite mit AVR Studio 4.13 und der aktuellsten WinAVR (müsste 
Januar07 sein)


von Jan P. (fire)


Lesenswert?

Der Beitrag ist von mir, hatte vergessen mich einzuloggen.

von Karl H. (kbuchegg)


Lesenswert?

Du hast den

#include <avr/pgmspace.h>

vergessen

von Jan P. (fire)


Lesenswert?

Danke, das hat soweit geklappt

Nun hab ich noch eine Stelle gefunden, für die ich einfach keinen 
entsprechenden gcc-Befehl finde
1
__io volatile PMSMflags_t fastFlags @0x1e;

Wie müss ich das "umbauen"?

von Karl H. (kbuchegg)


Lesenswert?

was das __io da vorne macht, weiss ich nicht.
Das @ könnte man so erreichen:

volatile PMSMflags_t* const fastFlags = (volatile PMSMflags_t*)0x1e;

und dann die Zugriffe anstatt

   fastFlags = 5;

ändern in

   *fastFlags = 5;

Auf Deutsch: anstatt den Compiler zu veranlassen, dass er
eine Variable auf eine bestimmte Speicheradresse legt, einen
Pointer vereinbaren, der die Adresse enthält und alle
Zugriffe über diesen Pointer führen.

Wird der Pointer selbst const gemacht, stehen die Chancen
gut, dass der Compiler die Pointervariable bei der
Optimierung los wird und der Code auch nicht schlechter
als beim Original ist.

Allerdings würde ich mir mal ganz genau ansehen, was da
eigentlich mit diesem ominösen 'fastFlags' gemacht wird,
bzw. welchem AVR Register das 0x1E entspricht und entweder
* nach einem Workaround mit 'offiziellen' gcc Register-Bezeichnungen
  suchen
* den Code umschreiben, so dass das fastFlags nicht mehr gebraucht
  wird. Dazu muesste man allerdings zunächst mal ergründen
  was denn fastFlags macht, erst dann kann man entscheiden
  ob man das umschreiben kann.

von Jan P. (fire)


Lesenswert?

PSMflags ist ein selbst erstellter Datentyp
1
00253 typedef struct PMSMflags
2
00254 {
3
00255   uint8_t motorStopped : 1;     
4
00256   uint8_t motorSynchronized: 1; 
5
00257   uint8_t actualDirection : 2;  
6
00258   uint8_t desiredDirection : 1; 
7
00259   uint8_t driveWaveform : 2;    
8
00260 } PMSMflags_t;

fastflags ist nur eine Variable vom Typ PSMflags.

PSMflags beinhaltet den aktuellen Zustand des Motors.

(Motor gestoppt ja/nein, welche Drehrichtung usw.)

Hier ist die Beschreibung zur __io- Zeile
1
/*! \brief Motor control flags placed in I/O space for fast access.
2
 *
3
 *  This variable contains all the flags used for motor control.
4
 *  It is placed in GPIOR0 register, which allows usage of several
5
 *  fast bit manipulation/branch instructions.

von Joerg X. (Gast)


Lesenswert?

an der Adresse 0x1e befindet sich bei den Atmegax8 das GPIO0, also 
eine,als I/O-Register "getarnte" Speicherzelle. Um nicht zuviel zu 
verändern müßte man den Zugriff darauf nach "PMSMFlags" casten, oder?
hth. -Jörg

von Karl H. (kbuchegg)


Lesenswert?

Joerg X. wrote:
> an der Adresse 0x1e befindet sich bei den Atmegax8 das GPIO0, also
> eine,als I/O-Register "getarnte" Speicherzelle. Um nicht zuviel zu
> verändern müßte man den Zugriff darauf nach "PMSMFlags" casten, oder?
> hth. -Jörg

Ah. Das wusste ich nicht.

Na dann würde ich das doch glatt so machen:

#define  fastFlags  (*((volatile PMSMflags_t*)(&GPIO0)))

das müsste auf dasselbe hinauslaufen.


von Joerg X. (Gast)


Lesenswert?

Ich hab 0x1e auch bloß im Datasheet nachgeschaut (hab den mega48 hier)
hmm, Ich seh gerade, dass das eine I/O Adresse ist (deshalb vermutlich 
das _IO im code oben), keine RAM-Adresse (das wäre ZL bzw. R30 :( ), 
also vermutlich besser 0x1e + 0x20 = 0x3e beim GCC benutzen, sorry falls 
ich verwirrung gestiftet haben sollte

-hth, Jörg

von Jan P. (fire)


Lesenswert?

Das 0x1e Register wurde ja extra gewählt, da dort wohl ein schnellerer 
Zugriff drauf möglich ist. (Siehe verlinktes Atmel-Dokument im ersten 
Post)

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.