www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91SAM7S64 MainClock lässt sich nicht verändern


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem:
Ich verwende den AT91SAM7S64 und hatte ein Beispiel, welches mit einem 
18,432 MHz Quarz gearbeitet hat. Dieses wollte ich auf meinen 16MHz 
Quarz anpassen, aber es funktioniert nicht. Egal was ich beim 
LowLevelInit als DIV und MUL eingebe, die Frequenz bleibt immer 
gleich...

Kennt jemand dieses Problem?

Servus,
Johannes

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste bitte die komplette Initialisierung des Controllers: z. B. für den 
ARM-Compiler von Keil - die Init-Datei.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Martin,

der Code ist folgender:
void LowLevelInit(void)
{
   int            i;
   AT91PS_PMC     pPMC = AT91C_BASE_PMC;

    //* Set Flash Wait sate
  //  Single Cycle Access at Up to 30 MHz, or 40
  //  if MCK = 48054841 I have 50 Cycle for 1 usecond ( flied MC_FMR->FMCN
  AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_1FWS;

    //* Watchdog Disable
  AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;

  //* Set MCK at 48 054 841
    // 1 Enabling the Main Oscillator:
  // SCK = 1/32768 = 30.51 uSecond
  // Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
  pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x09 <<8) | AT91C_CKGR_MOSCEN ));

  // Wait the startup time
  while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));

  // PMC Clock Generator PLL Register setup
  //
  // The following settings are used:  DIV = 14
  //                                   MUL = 72
  //                                   PLLCOUNT = 10
  //
  // Main Clock (MAINCK from crystal oscillator) = 18432000 hz (see AT91SAM7-EK schematic)
  // MAINCK / DIV = 18432000/14 = 1316571 hz
  // PLLCK = 1316571 * (MUL + 1) = 1316571 * (72 + 1) = 1316571 * 73 = 96109683 hz
  //
  // PLLCOUNT = number of slow clock cycles before the LOCK bit is set
  //            in PMC_SR after CKGR_PLLR is written.
  //
  // PLLCOUNT = 10
  //
  // OUT = 0 (not used)

        // 16 MHz * (5+1) / 1 = 96 MHz

  pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 1) |    // 14
                      (AT91C_CKGR_PLLCOUNT & (10<<8)) |    // 10
                      (AT91C_CKGR_MUL & (5<<16)));    // 72

  // Wait the startup time (until PMC Status register LOCK bit is set)
   while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));

  // PMC Master Clock (MCK) Register setup
  //
  // CSS  = 3  (PLLCK clock selected)
  //
  // PRES = 1  (MCK = PLLCK / 2) = 96109683/2 = 48054841 hz
  //
  // Note: Master Clock  MCK = 48054841 hz  (this is the CPU clock speed)
  pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2;

  // Set up the default interrupts handler vectors
  AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler;
  for (i=1;i < 31; i++)
  {
      AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler;
  }
  AT91C_BASE_AIC->AIC_SPU  = (int) AT91F_Spurious_handler;

}



Die Funktion wird am Anfang von main() aufgerufen. Durch die Kommentare 
nicht störren lassen. Ich habe die soweit noch nicht geändert.

Servus,
Johannes

Autor: Robert L. (manateemoo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine andere Quarzfrequenz wählst, musst du evtl. die zwei 
Widerstände und den Kondesator für die PLL anpassen.
Atmel hat ein Tool um diese zu berechen.

http://www.atmel.com/dyn/resources/prod_documents/...

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Robert,

mit diesem Tool kann man ja jede Menge rumspielen. Da muss ich wohl mal 
versuchen die Hardware auch dementsprechend ändern.
Aber auch wenn die Frequenz dann nicht mehr die richtige ist, sollte sie 
sich doch ändern, wenn ich andere Frequenzen einstelle, oder? 
Irgendetwas stimmt trotzdem nicht...

Servus,
Johannes

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Fehlerbild deutet nicht auf die Hardware hin. Mit dem Orginal 
PLL-Filter für 18 MHz verwende ich Quarze von 11 bis 18 MHz ohne 
Probleme.

Ist überhaupt sicher, dass das Programm durch die Low-Level Routine 
läuft? Kannst du das Programm Schritt für Schritt debuggen? Welche 
Entwicklungsumgebung verwendest du?

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, das mit dem Debuggen ist noch so eine Sache. Ich verwende den 
USB-Tiny von Olimex und da funktioniert das Debuggen noch nicht so 
richtig.

Ich habe jetzt eine andere Platine, zwar nicht die gleiche aber mit 
ähnlichem Aufbau geflasht und siehe da: Es funktioniert.
Dies deutet für mich dann doch auf Hardware hin. Ist aber irgendwie 
schon sehr seltsam.

Servus,
Johannes

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, es lag an dem Quarz. Irgendwie kommt der Mikrokontroller mit 
diesem Quarz nicht klar.
Ich habe den Quarz ausgetauscht: Wieder das selbe Problem.
Dann habe ich ein größeren Quarz, selbe Frequenz mit Drähten 
angeschlossen und siehe da, es funktioniert.
Jetzt muss ich nur noch herausfinden, warum der kleine Quarz nicht will.

Schönen Sonntag noch,
Johannes

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.