www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik freertos + ATMEGA644 - Portierung


Autor: Christian F. (Firma: ---) (chriz)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits,

vorweg muss ich sagen, dass ich absolut kein crack in µc-Programmierung 
bin und versuche mich da lediglich durchzubeissen.
Momentan haben wir ein kleines Roboter Projekt, dessen Programmierung 
wir in Modulen erledigen. Diese Module sollen dann mittels eines rtos 
miteinander kommunizieren.
Wir haben uns dann für das freertos entschieden. Problem bei der Sache 
ist, dass die demo für AVR's für den AVR323 geschrieben wurde und somit 
nicht komplett Registerkompatibel zum ATMega644 ist.
Da macht sich vorallen bei den TIMERn und den benötigten INTERUPTS 
bemerkbar. So haben wir das Problem, dass zum Beispiel zuerst vtask1 
abläuft (schaltet z bsp. alle LEDs an) dann sorgt nen vtaskdelay dafür, 
dass vtask2 aufgerufen wird (schaltet z bsp. alle LEDs aus). Da wir nur 
2 tasks zum probieren verwenden, müssten die LEDs immer im wechsel alle 
on-off-on-off-.. gehen. Resultat ist jedoch, die LEDs gehen kurz an 
(task1) , dann gehen sie aus und bleiben aus. Also läuft der task1 und 
task2 nur genau 1 mal ab und es wird niewieder in einen derbeiden tasks 
gesprungen und das os hängt in einer idle-schleife(mit dem debugger 
nachvollzogen). Also scheint es so, dass die Register/Timer die wir 
verändert haben (Portierung vom avr323 zum ATmega644) nicht wirkluch 
funzen. Die Frequenzen und prescaler müssen wohl auch noch alle 
irgendwie angepasst werden. Aber das scheinen wir bis dato wohl 
irgendwie falsch gemacht zu haben.

Ich weiss, dass so etwas nicht gern gesehen ist, aber falls uns jemand 
kurzfristig sagen könnte, was wir wie zu ändern haben, wäre ich äußerst 
dankbar, da ich mir seit Tagen immer und immer wieder die 
ApplicationsNotes und Datasheets und den quellcode angucke und absolut 
nicht weiterkomme bei der Umportierung.

Anscheinend müssen wohl die folgen Parameter angepasst werden. Das sind 
jetzt hier die Original Settings für den avr323 bzw auch den ATMEGA32.
aus der PORT.C
/*-----------------------------------------------------------
 * Implementation of functions defined in portable.h for the AVR port.
 *----------------------------------------------------------*/

/* Start tasks with interrupts enables. */
#define portFLAGS_INT_ENABLED                ( ( portSTACK_TYPE ) 0x80 )

/* Hardware constants for timer 1. */
#define portCLEAR_COUNTER_ON_MATCH           ( ( unsigned portCHAR ) 0x08 )
#define portPRESCALE_64                      ( ( unsigned portCHAR ) 0x03 )
#define portCLOCK_PRESCALER                  ( ( unsigned portLONG ) 64 )
#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( unsigned portCHAR ) 0x10 )

/*-----------------------------------------------------------*/
aus der PORT.C
/*-----------------------------------------------------------*/
 * Setup timer 1 compare match A to generate a tick interrupt.
 */
static void prvSetupTimerInterrupt( void )
{
unsigned portLONG ulCompareMatch;
unsigned portCHAR ucHighByte, ucLowByte;

  /* Using 16bit timer 1 to generate the tick.  Correct fuses must be
  selected for the configCPU_CLOCK_HZ clock. */

  ulCompareMatch = configCPU_CLOCK_HZ / configTICK_RATE_HZ;

  /* We only have 16 bits so have to scale to get our required tick rate. */
  ulCompareMatch /= portCLOCK_PRESCALER;

  /* Adjust for correct value. */
  ulCompareMatch -= ( unsigned portLONG ) 1;

  /* Setup compare match value for compare match A.  Interrupts are disabled 
  before this is called so we need not worry here. */
  ucLowByte = ( unsigned portCHAR ) ( ulCompareMatch & ( unsigned portLONG ) 0xff );
  ulCompareMatch >>= 8;
  ucHighByte = ( unsigned portCHAR ) ( ulCompareMatch & ( unsigned portLONG ) 0xff );
  OCR1AH = ucHighByte;
  OCR1AL = ucLowByte;

  /* Setup clock source and compare match behaviour. */
  ucLowByte = portCLEAR_COUNTER_ON_MATCH | portPRESCALE_64;
  TCCR1B = ucLowByte;

  /* Enable the interrupt - this is okay as interrupt are currently globally
  disabled. */
  ucLowByte = TIMSK;
  ucLowByte |= portCOMPARE_MATCH_A_INTERRUPT_ENABLE;
  TIMSK = ucLowByte;
}
/*-----------------------------------------------------------*/

Und das sind hier noch die Standardeinstellungen für den AVR323 in der 
FREETROSCONFIG
/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. 
 *----------------------------------------------------------*/

#define configUSE_PREEMPTION    1
#define configUSE_IDLE_HOOK    1
#define configUSE_TICK_HOOK    0
#define configCPU_CLOCK_HZ    ( ( unsigned portLONG ) 16000000 )
#define configTICK_RATE_HZ    ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES    ( ( unsigned portBASE_TYPE ) 4 )
#define configMINIMAL_STACK_SIZE  ( ( unsigned portSHORT ) 85 )
#define configTOTAL_HEAP_SIZE    ( (size_t ) ( 4000 ) )
#define configMAX_TASK_NAME_LEN    ( 8 )
#define configUSE_TRACE_FACILITY  0
#define configUSE_16_BIT_TICKS    1
#define configIDLE_SHOULD_YIELD    1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES       0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet    0
#define INCLUDE_uxTaskPriorityGet    0
#define INCLUDE_vTaskDelete      0
#define INCLUDE_vTaskCleanUpResources          0
#define INCLUDE_vTaskSuspend      0
#define INCLUDE_vTaskDelayUntil      0
#define INCLUDE_vTaskDelay      1


#endif /* FREERTOS_CONFIG_H */

Ok ich hoffe man darf hier soviel code reinknallen, ohne das es 
unhöflich erscheint. =) Aufjedenfall haben wir an diesen Settings und 
Registerbezeichnungen Veränderungen vorgenommen, jedoch ohne Erfolg. Im 
Anhang hab ich das fehlerfrei compilierbare OS mit den simplen LED 
an-aus, und den von uns vorgenommen Änderungen (die jedoch nicht 
greifen), angehangen.

Ansonsten erstma danke fürs Durchkämpfen des Textes.

Chris

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da beide Tasks so wie ich es verstanden haben einmal gelaufen sind 
funktioiert der Task wechsel schonmal was darauf schließen lässt dass 
der Timer richtig funktioniert.

Ich vermute euer Problem eher bei dem Aufruf von vTaskDelay(5);
Probierts mal mit vTaskDelayUntil

Markus

Autor: Christian F. (Firma: ---) (chriz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ich eben gerade mal ausprobiert, dasselbe in grün. Alle LEDs gehen 
einmal an und dann wieder aus und bleiben aus. Ich denke es liegt 
definitiv an den TIMERN  INTERRUPTS  TICKS ect. pp. Ich meine das 
springen vom Task1 zum Task2 hat ja nix mit den Timern zu tun. Aber das 
wieder "aufwecken" der tasks, nachdem beide einmal durchgelaufen sind, 
dass hat dann wohl etwas mit den TIMERN zu tun. Und das scheint beim 
Code noch komplett schief zu laufen.

Ich habe mal nen bissl gegooglet. In dem link hier meint einer der 
freertos Entwickler genau das, was ich vermute.

"Also - are you sure the tick interrupt is running. If not, then your 
task
will never unblock."

http://www.embeddedrelated.com/usenet/embedded/sho...

Genau dort scheint der Fehler zu stecken, sprich wir haben die Timer 
nicht richtig portiert vom ATmega32 zum ATmega644. Und ich krieg das 
irgendwie auch nit hin.

Wäre für weitere Hilfe dankbar.

Chris

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nutzt du den Code den du hier im Forum gepostet hast oder den den du 
angehängt hast?
Im Post ist der Wert für das portFLAGS_INT_ENABLED richtig auf 0x80 
gesetzt im Angehängten Code aber auf 0x20.

Markus

Autor: Christian F. (Firma: ---) (chriz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boah ;) exakt da lag der Fehler. Die Register der Timer die wir geändert 
haben, haben gestimmt, aber aus irgend einem Grund haben wir auch des 
InteruptEnable geändert.
Dickes Dankeschön Markus ... 4 Augen sehen doch mehr als 2.

schönes Wochenende noch

Chris

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.