Forum: Compiler & IDEs Problem mit UART und Timer Interrupt


von Mr Bean (Gast)


Lesenswert?

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

von troll (Gast)


Lesenswert?

Tu mal das sei() aus den ISRs raus, das hat da nichts verloren!

von Mr Bean (Gast)


Lesenswert?

Jap, danke, war nur als Versuch ob es daran liegen kann. Verhalten ist 
auch ohne sei() in den ISR gleich.

Gruß

Bean

von Karl H. (kbuchegg)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.