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

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.

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.