Bin da auch gerade bei, AVR447 umzusetzen. Allerdings versuche ich, den
ganzen code in AVR-GCC zu portieren. Es scheint mir eine uferlose Story
zu werden. Prinzipiell funktioniert das ganze bei mir schon soweit,
Interrupts sind OK. Allerdings kommt aus den Phasen-Ausgängen nichts
raus. Ich vermute mal, dass da irgendwie der Wurm drin ist.
Bräuchte da jemanden, der mir mal die Unterschiede zwischen IAR und
AVR-GCC erklärt. Hier nur ein Beispiel aus dem AVR447, dass so nicht
funktionieren kann:
1 | // #pragma inline=forced
|
2 | inline static void MotorSynchronizedUpdate(void)
|
3 | {
|
4 | static uint8_t synchCount = 0;
|
5 |
|
6 | PMSMflags_t tempFlags;
|
7 |
|
8 | tempFlags = fastFlags;
|
9 |
|
10 | if ((tempFlags.desiredDirection == tempFlags.actualDirection) &&
|
11 | (tempFlags.motorStopped == FALSE) && (tempFlags.motorSynchronized == FALSE))
|
12 | {
|
13 | synchCount++;
|
14 | if (synchCount >= SYNCHRONIZATION_COUNT)
|
15 | {
|
16 | fastFlags.motorSynchronized = TRUE;
|
17 | }
|
18 | }
|
19 | else
|
20 | {
|
21 | fastFlags.motorSynchronized = FALSE;
|
22 | synchCount = 0;
|
23 | }
|
24 | }
|
In der ersten Zeile wird die Variable synchCount auf Null gesetzt. Wird
die erste IF-Anweisung erfüllt, wird sie um eins erhöht, hat dann den
Wert=1. Die Funktion wird danach verlassen.
SYNCHRONIZATION_COUNT wird durch PMSM.h auf 2 gesetzt. Dieser Wert wird
allerdings nie erreicht, da beim nächsten Aufruf der Funktion der Wert
von synchCount wieder auf Null gestzt wird?!?!
Wundert euch bitte nicht über das auskommentierte #pragma... Ich habe
nur versucht diese Zeile in AVR-GCC umzusetzen.
Wäre nett, wenn irgendwer darauf eine Antwort hat.
Gruß Andreas