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 | }
|