Problem mit AVR32 GPIO

Gast #1866033
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
#1866765
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren