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


von Johannes (Gast)


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

von Martin (Gast)


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

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

von Robert L. (manateemoo)


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/ATMEL_PLL_Filter_CALCULATOR_AT91_2v91.zip

von Johannes (Gast)


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

von Martin (Gast)


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?

von Johannes (Gast)


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

von Johannes (Gast)


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

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.