Datum:
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.
uint8_t servo_init(void) { TIMSK|=(1<<OCIE2); TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode OCR2 = F_CPU/100000; //alle 10µS ein IRQ DDRSERVO|=(1<<SERVOPIN); return SUCCESS; } ISR(USART_RXC_vect) { g_UART_DATA_IN_BUFF[g_UART_BUFF_COUNT++] = UDR; if(g_UART_BUFF_COUNT == UART_IN_BUFF) { g_UART_BUFF_COUNT = 0; } sei(); } ISR(TIMER2_COMP_vect) { static int count; if(count>servopos)SERVOPORT&=~(1<<SERVOPIN); else SERVOPORT|=(1<<SERVOPIN); if(count<1500)count++; else count=0; sei(); } |
Wie kann ich das Problem lösen? Gruß Bean
Datum:
Tu mal das sei() aus den ISRs raus, das hat da nichts verloren!
Datum:
Jap, danke, war nur als Versuch ob es daran liegen kann. Verhalten ist auch ohne sei() in den ISR gleich. Gruß Bean
Datum:
mach deine Servo-Ansteuerung ein wenig intelligenter. Da alle 10µs einen Interrupt dafür herzugeben, ist nicht wirklich notwendig. Man kann den Timer auch so einstellen, dass er selbst fast von alleine die Servopulse abhandelt und sich nur meldet, wenn tatsächlich die Pulsflanken zu bearbeiten sind, Modellbauservo Ansteuerung