www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR32UC3A - Wie löscht man einen Interrupt (Bsp. USART)?


Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade die Beispiele aus dem Framework mal etwas 
aufzuplustern. Nun hab ich meine USART konfiguriert (timeout, rx ready, 
den Interrupthandler registriert.
void init()
{
  static const gpio_map_t GPIO_MAP =
  {
    {RX_PIN, RX_FUNCTION},
    {TX_PIN, TX_FUNCTION}
  };
  
  // Options for debug USART.
  usart_options_t options =
  {
    .baudrate = BAUDRATE,
    .charlength = 8,
    .paritytype = USART_NO_PARITY,
    .stopbits = USART_1_STOPBIT,
    .channelmode = USART_NORMAL_CHMODE
  };

  // Setup GPIO, ISR 
  gpio_enable_module(GPIO_MAP, sizeof(GPIO_MAP) / sizeof(GPIO_MAP[0]));
  
  
  // Initialize it in RS232 mode.
  usart_init_rs232(USART1, &options, FOSC0);
  
  // Init interrupt and timeout
  INTC_register_interrupt(&isr, AVR32_USART1_IRQ, AVR32_INTC_INT1);
  USART1->ier = AVR32_USART_IER_RXRDY_MASK|AVR32_USART_IER_TIMEOUT_MASK;
  USART1->rtor = 100;
}

Dann die Service Routine:
__attribute__((__interrupt__)) void isr( void )
{
  unsigned char cs = 0;
  int rx_char = 0, i;
  
  if (USART1->csr & AVR32_USART_CSR_TIMEOUT_MASK)
  {
    USART1->cr|=AVR32_USART_CR_STTTO_MASK;
    
    // wenn empfang zu ende
                usart1.rx_ready = TRUE;
  }
  else if (USART1->csr & AVR32_USART_CSR_TXRDY_MASK)
  {
===>    if (usart1.tx_ptr < mdb.tx_payload) // wenn noch was zum senden
    {
      USART1->thr = (usart1.tx_buffer[usart1.tx_ptr++] << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK;
    }
    else // senden fertig, interrupt aus
    {
      USART1->idr = AVR32_USART_IDR_TXRDY_MASK;
    }
  }
  else if (USART1->csr & AVR32_USART_CSR_RXRDY_MASK)
  {
    //TODO daten in buffer schaufeln
  }
  else
  {
    // unknown interrupt
  }
}

Mein Problem ist nun folgendes: da wo der Pfeil ===> steht, dorthin 
springt der Controller ununterbrochen. Die Frage ist warum? Gesendet 
habe ich noch nichts, nur uart initialisiert. Die nächste Frage ist: wie 
setze ich den Interrupt zurück (der AVR machte das automatisch, nachdem 
der Vector ausgeführt wurde)? Das Datenblatt ist dazu recht dürftig 
(oder ich blind/blöd). Ich hoffe jemand kann mir da helfen 
durchzusteigen.

Gruß Willi

Autor: Billy __ (slowflyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh!!!

Ok hat sich erledigt. Sobald man die init_rs_232 in der init aufruft, 
wird txen in cr gesetzt. Ab da ist natürlich der Sender bereit was neues 
zu senden und er führt immer wieder den interrupt aus.

Gruß Willi

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.