Forum: Mikrocontroller und Digitale Elektronik Problem mit AVR32 GPIO


von Stefan (Gast)


Lesenswert?

Hallo,

habe ein kleines Problem mit dem AVR32UC3B0256. Im langsamen Betrieb mit 
internen RC Oszilator funktioniert das Setzen und Löschen der Pins. Wenn 
ich jedoch versuche die PLL0 als Main Clock zu verwenden bleibt der Pin 
immer auf HIGH.
Habe ich vergessen ein Register zu setzen oder was mache ich falsch?
Hier mein code.
1
#include <avr32/io.h>
2
3
void UsePLL(unsigned int clock)
4
{
5
  int clockh = (clock/6) - 1;
6
7
  AVR32_PM.oscctrl0 = (AVR32_PM.oscctrl0 | 0x00000407);        // Startup time  /  Oscillator Mode
8
9
  AVR32_PM.mcctrl =       AVR32_PM_OSC0EN_MASK;          // Enable Oscillator 0
10
11
  while((AVR32_PM.poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)== 0);  // Oscillator 0 is ready
12
13
14
  AVR32_PM.pll[0] =       0 << AVR32_PM_PLLOSC_OFFSET  |    // Oscillator 0 is the source for the PLL
15
                    1 << AVR32_PM_PLLDIV_OFFSET  |    // div = 1
16
                    clockh << AVR32_PM_PLLMUL_OFFSET |  // multi clock z.b. if clockh = 10 (10+1)*12=132/2Fvc = 66Mhz
17
                    5 << AVR32_PM_PLLOPT_OFFSET;      // 80MHz<fvco<180MHz / fPLL = fvco / Wide Bandwidth Mode disabled
18
19
  AVR32_PM.cksel =       0x80808080;
20
21
  AVR32_PM.pll[0] |=       AVR32_PM_PLLEN_MASK;            // PLL enable
22
23
  while(!(AVR32_PM.poscsr & AVR32_PM_POSCSR_LOCK0_MASK));      // PLL 0 is locked, and ready to be selected as clock source
24
25
26
  AVR32_FLASHC.fcr |=      0 << AVR32_FLASHC_FWS_OFFSET;      // The flash is read with 0 wait state. (write 1 otherwise)
27
28
  AVR32_PM.mcctrl |=       2 << AVR32_PM_MCSEL_OFFSET;        // PLL0 as main oscillator
29
30
}
31
32
int main()
33
{
34
  char c=0;
35
36
  UsePLL(24);
37
38
39
  AVR32_GPIO.port[1].gper = 0x00000fff; //Set Enable
40
  AVR32_GPIO.port[1].oder = 0x00000fff; //As Output
41
42
  AVR32_GPIO.port[1].ovrs = 0x00000001;
43
44
  while(1)
45
  {
46
    AVR32_GPIO.port[1].gperc = 0x00000001;
47
    c++;
48
    c++;
49
    AVR32_GPIO.port[1].gpers = 0x00000001;
50
  }
51
  return 0;
52
}

Wäre echt toll wenn mir jemand helfen kann. Bin im moment mit lmeinem 
Latein am ende.
Gruß Stefan

von Stefan (Gast)


Lesenswert?

Habe noch mal was ausprobiert. Wenn ich den SPI verwende geht dieser mit 
sehr hoher Geschwindigkeit.

von Phil S. (zippi)


Lesenswert?

hi,

>while(1)
>{
    >AVR32_GPIO.port[1].gperc = 0x00000001;
    >c++;
    >c++;
    >AVR32_GPIO.port[1].gpers = 0x00000001;
>}

Sollte eigentlich gehen, dein Problem wird wohl sein, dass er sehr 
schnell toggelt. Achja gibt auch ne pin toggle funktion:
AVR32_GPIO.port[1].gpert = 0x00000001; //;)

Und dann mach mal die funktion dazwischen:
1
void wait_us(int time)
2
{
3
  int waittime;
4
  int delay;
5
  int time2;
6
7
  time2 = __builtin_mfsr(AVR32_COUNT);
8
  delay = time * clock;
9
  waittime = __builtin_mfsr(AVR32_COUNT) - time2;
10
11
  while(waittime<delay)
12
  {
13
    volatile unsigned int counter = __builtin_mfsr(AVR32_COUNT);
14
    waittime += counter - time2;
15
    time2 = counter;
16
  }
17
18
}

clock musst du hier natürlich auch noch definieren.

Gruß
Zippi

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.