Forum: Mikrocontroller und Digitale Elektronik xmega256A3BU USB-HID und Timer Problem


von Hans89 (Gast)


Lesenswert?

Hallo,

ich versuche gerade auf einem xmega256A3BU USB-HID und Timer-Interrupt 
gleichzeit zu benutzen. Jeweils einzeln für sich entweder 
USB-HID-Interface oder Timer Interrupt funktioniert aber sobald ich 
beides gleich zeit nutze geht es nicht.

Für das HID-Interface nutze ich die Bibliothek aus dem ASF und hier ist 
vermute ich das Problem, da im sysclk_init alle Peripherie abgeschatet 
wird diese muss man expliziet dann jeweils einschalten, welches ich mit 
sysclk_enable_peripheral_clock(&TCC1) mache aber dann wird USB-HID nicht 
mehr erkannt.

Hat einer eine Idee was ich vllt noch setzen muss damit USB-HID 
funktioniert und die Timer ebenfalls laufen.
Im conf_clock.h ist folgendes gesetzt
1
#define CONFIG_SYSCLK_SOURCE        SYSCLK_SRC_PLL
2
#define CONFIG_SYSCLK_PSADIV        SYSCLK_PSADIV_1
3
#define CONFIG_SYSCLK_PSBCDIV       SYSCLK_PSBCDIV_1_1
4
#define CONFIG_PLL0_SOURCE          PLL_SRC_RC2MHZ
5
#define CONFIG_PLL0_MUL             16
6
#define CONFIG_PLL0_DIV             1
7
8
#define CONFIG_USBCLK_SOURCE                USBCLK_SRC_RCOSC
9
#define CONFIG_OSC_RC32_CAL                 48000000UL
10
#define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC  OSC_ID_USBSOF

somit läuft der USB clock auf 48MHz und der CPU/Peripherie clock auf 
32MHz.


1
#include <asf.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
void clock_init (void)
6
{
7
  OSC.CTRL = OSC_RC2MEN_bm; //oscillator at 32 MHz
8
  while(!(OSC.STATUS & OSC_RC2MRDY_bm)); //wait for oscillator ready
9
  CCP = CCP_IOREG_gc; //protect I/O register, interrupts are ignored
10
  CLK.CTRL = CLK_SCLKSEL_RC2M_gc; //activate internal oscillator
11
}
12
13
void PLL_init (void)
14
{
15
  OSC.PLLCTRL = OSC_PLLSRC_RC2M_gc | 0x10; //0x10 32Mhz //0x06 12MHz
16
  OSC.CTRL |= OSC_PLLEN_bm;
17
  while (!(OSC.STATUS & OSC_PLLRDY_bm));
18
  CCP = CCP_IOREG_gc;
19
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
20
}
21
22
void interrupt_init (void)
23
{
24
  PMIC.CTRL |= PMIC_LOLVLEN_bm; //Interrupt on
25
  sei(); //Interrupt enable
26
}
27
28
void init_timer2 (void)
29
{
30
  TCC1.PER = 2; //Timer top value (overflow at 4ms)
31
  TCC1.CTRLB = TC_TC1_WGMODE_NORMAL_gc; // Mode: Normal mode
32
  TCC1.CTRLA = TC_TC0_CLKSEL_DIV1_gc; // Prescaler 1
33
  TCC1.INTCTRLA = TC_TC1_OVFINTLVL_LO_gc; //Interrupt modus active priority low
34
}
35
36
int main (void)
37
{
38
  sysclk_init();
39
  sysclk_enable_peripheral_clock(&TCC1);
40
  irq_initialize_vectors();
41
  cpu_irq_enable();
42
  udc_start();
43
  
44
  //clock_init();
45
  //PLL_init();
46
  init_timer2();
47
  //interrupt_init();  
48
  
49
  PORTC.DIRSET = PIN7_bm;
50
  PORTCFG.CLKEVOUT = 0x01; // Ausgabe der CPU frequenz auf PC7
51
  
52
  ulLaufzeit = 30000;//600000;
53
  
54
  PORTB.DIRSET = PIN2_bm;
55
  PORTB.DIRSET = PIN3_bm;  
56
  
57
  while (1)
58
  {
59
    if(ulLaufzeit == 0)
60
    {
61
      PORTB.OUTSET = PIN2_bm;
62
      PORTB.OUTCLR = PIN3_bm;
63
    }
64
    else
65
    {
66
      PORTB.OUTCLR = PIN2_bm;
67
      PORTB.OUTSET = PIN3_bm;
68
    }
69
  }  
70
}
71
72
ISR(TCC1_OVF_vect)
73
{
74
  
75
  
76
  static unsigned char ucMsTimer;
77
  
78
  if ( ucMsTimer >= 51)   //51 32MHz 3 2MHz 38 12MHz
79
  {
80
    ucMsTimer = 0;
81
  }
82
  else
83
  {
84
    ucMsTimer++;
85
  }
86
  
87
  if ( ucMsTimer==0 )
88
  {
89
    // Laufzeitüberachung
90
    if (ulLaufzeit > 0)
91
    {
92
      ulLaufzeit--;
93
    }
94
  }
95
}

von Hans89 (Gast)


Lesenswert?

Kennt sich keiner mit den Xmegas aus ?

Ein paar Rückmeldungen wären hilfreich.

von Alex (Gast)


Lesenswert?

Dein Timer Interrupt braucht sehr viele Ressourcen.

...
TCC1.PER = 2; //Timer top value (overflow at 4ms)
TCC1.CTRLA = TC_TC0_CLKSEL_DIV1_gc; // Prescaler 1
...

sieht so aus, dass alle zwei Takte der Timer-Interrupt angetriggert 
wird, da kommen natürlich die vom USB nicht mehr dran.

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.