AT91SAM7S64 MainClock lässt sich nicht verändern

Gast #1867673
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
Gast
Hallo Martin,

der Code ist folgender:
1
void LowLevelInit(void)
2
{
3
   int            i;
4
   AT91PS_PMC     pPMC = AT91C_BASE_PMC;
5

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

11
    //* Watchdog Disable
12
  AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
13

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

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

23
  // PMC Clock Generator PLL Register setup
24
  //
25
  // The following settings are used:  DIV = 14
26
  //                                   MUL = 72
27
  //                                   PLLCOUNT = 10
28
  //
29
  // Main Clock (MAINCK from crystal oscillator) = 18432000 hz (see AT91SAM7-EK schematic)
30
  // MAINCK / DIV = 18432000/14 = 1316571 hz
31
  // PLLCK = 1316571 * (MUL + 1) = 1316571 * (72 + 1) = 1316571 * 73 = 96109683 hz
32
  //
33
  // PLLCOUNT = number of slow clock cycles before the LOCK bit is set
34
  //            in PMC_SR after CKGR_PLLR is written.
35
  //
36
  // PLLCOUNT = 10
37
  //
38
  // OUT = 0 (not used)
39

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

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

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

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

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

66
}

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
Gast
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
Gast
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?
Gast
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.