Hallo
Ich habe gerade auf meinem Mega8 ein Programm laufen, das mir auf
Anfrage über die UART Schnittstelle Daten zurück liefert (Temperatur,
ADC Wert etc.). Die Baudrate beträgt 38400. Der Controller läuft mit dem
internen Takt (8MHz).
Jetzt möchte ich zusätzlich zu der UART Kommunikation noch ein Servo
ansteuern. Allerdings streikt, sobald ich die Interrupt Routine für den
Timer freischalte, die UART Kommunikation. Für mich sieht es so aus, als
ob der Controller vor lauter Servo-Timer ISR nicht mehr dazu kommt, die
Zeichen (Anfragen) aus der UART Receive ISR abzuholen.
1 | uint8_t servo_init(void)
|
2 | {
|
3 | TIMSK|=(1<<OCIE2);
|
4 | TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode
|
5 | OCR2 = F_CPU/100000; //alle 10µS ein IRQ
|
6 | DDRSERVO|=(1<<SERVOPIN);
|
7 | return SUCCESS;
|
8 | }
|
9 |
|
10 | ISR(USART_RXC_vect)
|
11 | {
|
12 | g_UART_DATA_IN_BUFF[g_UART_BUFF_COUNT++] = UDR;
|
13 | if(g_UART_BUFF_COUNT == UART_IN_BUFF)
|
14 | {
|
15 | g_UART_BUFF_COUNT = 0;
|
16 | }
|
17 | sei();
|
18 | }
|
19 |
|
20 | ISR(TIMER2_COMP_vect)
|
21 | {
|
22 | static int count;
|
23 | if(count>servopos)SERVOPORT&=~(1<<SERVOPIN);
|
24 | else SERVOPORT|=(1<<SERVOPIN);
|
25 | if(count<1500)count++;
|
26 | else count=0;
|
27 | sei();
|
28 | }
|
Wie kann ich das Problem lösen?
Gruß
Bean