www.mikrocontroller.net

Forum: GCC Problem mit UART und Timer Interrupt


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Mr Bean (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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.
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

Autor: troll (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Tu mal das sei() aus den ISRs raus, das hat da nichts verloren!

Autor: Mr Bean (Gast)
Datum:

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

Gruß

Bean

Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net