xmega256A3BU USB-HID und Timer Problem

Gast #4881555
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
}
Gast #4883273
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.

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