Die USART Schnittstelle initialisiere ich wie folgt
1 | void USART_Init_intern(void)
|
2 | {
|
3 | // BSEL ausrechnen, Berechnung siehe Datenblatt Seite 238 (bscale = -5)
|
4 | // Berechnung für internen Oszillator f=32 MHz, RS232 Geschwindigkeit 256K0
|
5 | USARTF0.BAUDCTRLA = 218&0xff; // siehe Seite 254 Datenblatt
|
6 | USARTF0.BAUDCTRLB = (-5<<4)|(218>>8); // siehe Seite 254 Datenblatt
|
7 | USARTF0.CTRLA = 0x30; // USART_RXCINTLVL_HI_gc; //RX interrupt high level
|
8 | USARTF0.CTRLB = 0x18; // RX und TX enable, siehe Seite 251
|
9 | USARTF0.CTRLC = 0x03; // Datenformat einstellen, ansynchron, keine Parity, 1 Stop-Bit, 8 Daten-Bits siehe Seite 252 ff
|
10 | PORTF.DIR |= (1<<PIN3);
|
11 | PORTF.DIR &= ~(1<<PIN2);
|
12 | PMIC.CTRL |= 0x04; //set PMIC high level enable
|
13 | }
|
Den Timer wie folgt
1 | TCC0_INTCTRLA = TC_OVFINTLVL_HI_gc; // enable interrupt
|
Routine
1 | void move(uint16_t step)
|
2 | .
|
3 | .
|
4 | .
|
5 | // start counter
|
6 | TCC0_CTRLA = TIMER_PRESCALE_gc;
|
7 |
|
8 | // acceleration phase
|
9 | accel_function = accelerate;
|
10 | while ( steps > threshold_2 )
|
11 | {
|
12 | TCC0_PER = accel_function(); // set new timer value
|
13 | while ( !timer_ovf ); // wait for timer
|
14 | CHOPPER_STEP();
|
15 | }
|
Timer Interrupt
1 | ISR( TCC0_OVF_vect )
|
2 | {
|
3 | timer_ovf = TRUE;
|
4 | }
|
Meine main sieht wie folgt aus:
1 | Verschiedene Variablien Deklarationen
|
2 | .
|
3 | .
|
4 | clock_intern_32(); //Interner 32Mhz Oszillator
|
5 | USART_Init_intern();
|
6 | inputs_Init(); //Input Ports
|
7 | outputs_Init(); //Output Ports
|
8 | SPI_INIT_E(); //ADC Schnitstelle
|
9 | STEPPERMODE(); //Motor
|
10 | pullup(); //Pullup Widerstand
|
11 | init_move(); //Timer Initialisierung
|
12 | sei();
|
13 | while(1)
|
14 | {
|
15 | switch((int)usartgetc())
|
16 | {
|
17 | case '1':
|
18 |
|
19 | CW();
|
20 | move(15000);
|
21 | CCW();
|
22 | move(15000);
|
23 | }
|
24 | }
|
Rufe ich usartgetc vorher nicht auf, funktioniert alles wunderbar,
leider aber bin ich auf Benutzereingaben angewiesen.
Mit usart... hängt meine Routine move()... an
da es nicht mehr zum Timer Interrupt kommt.
Ich hoffe ich konnte euch das Problem damit näher bringen