mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART_TXC_vect mit software auslösen ?


Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab da mal ne frage, gibt es die Möglichkeit USART_TXC_vect software 
seitig auszulösen?

Laut Datenblatt meines Atmega8 kann man nämlich das TXC flag, welches 
einen Transmit Complete Interrupt auslöst, im Register UCSRA setzen, 
dass allerdings setzt den Interrupt aber zurück...
Hab Lösungen für int0 oder so gesehen, aber USART_TXC_vect per software 
auslösen nicht.

Hat jemand ne Idee?

Vielen Dank schonmal

Grüße Zerrome

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du statt dem TXComplete den UDRE-Irq verwendest (macht meistens eh 
mehr Sinn) kannst du den Interrupt einfach in software auslösen, in dem 
du (bei leerem UDR-Register) das UDRIE-Bit setzt.

Codebeispiel (Tiny2313, Receive-sachen rausgeschnitten):
#define SEND_BUF_BITS 4
#define SEND_BUF_SIZE (1<<SEND_BUF_BITS)
#define SEND_BUF_MASK (SEND_BUF_SIZE-1)

static volatile uint8_t send_buf_start;
static uint8_t send_buf_end;
static char send_buf[SEND_BUF_SIZE];

void uart_putc(char c)
{
  uint8_t next_pos=(send_buf_end+1)&SEND_BUF_MASK;

  // wait till we got space in buffer
  while ((SREG & _BV(SREG_I)) && (next_pos == send_buf_start));

  if (next_pos == send_buf_start) {
    // Interrupts are disabled and buffer is full. we loose this char.
    return;
  }

  send_buf[send_buf_end]=c;

  send_buf_end=next_pos;

  // Enable UDR interrupt. will immediatly call ISR if UDRE is set.
  UCSRB = _BV(TXEN) | _BV(RXEN) | _BV(UDRIE) | _BV(RXCIE);
}

ISR(USART_UDRE_vect) {
  if (send_buf_end == send_buf_start) {
    // No data to send, disable ISR.
    UCSRB = _BV(TXEN) | _BV(RXEN) | _BV(RXCIE);
  } else {
    UDR=send_buf[send_buf_start++];
    send_buf_start &=SEND_BUF_MASK;
  }
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Daniel Rau (zerrome)

>ich hab da mal ne frage, gibt es die Möglichkeit USART_TXC_vect software
>seitig auszulösen?

Nein. Das ist auch praktisch nicht notwendig. Für eine 
Interruptgesteuerte UART Übertragung nutzt man UDRE.

Interrupt.

MfG
Falk

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah,

die Idee mit dem USART_UDRE_vect zu arbeiten hatte ich auch schon, 
allerdings war dann die Überlegung dass wenn keine Daten in meinem 
Ring-Puffer sind trozdem die ISR rattert. Was mir nicht gekommen war ist 
in dem Beispiel von  Ernst drin. Einfach abschlaten des Interrupt 
vectors...

Super, hat geholfen, Danke.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.