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


von Billy _. (slowflyer)


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.
1
void init()
2
{
3
  static const gpio_map_t GPIO_MAP =
4
  {
5
    {RX_PIN, RX_FUNCTION},
6
    {TX_PIN, TX_FUNCTION}
7
  };
8
  
9
  // Options for debug USART.
10
  usart_options_t options =
11
  {
12
    .baudrate = BAUDRATE,
13
    .charlength = 8,
14
    .paritytype = USART_NO_PARITY,
15
    .stopbits = USART_1_STOPBIT,
16
    .channelmode = USART_NORMAL_CHMODE
17
  };
18
19
  // Setup GPIO, ISR 
20
  gpio_enable_module(GPIO_MAP, sizeof(GPIO_MAP) / sizeof(GPIO_MAP[0]));
21
  
22
  
23
  // Initialize it in RS232 mode.
24
  usart_init_rs232(USART1, &options, FOSC0);
25
  
26
  // Init interrupt and timeout
27
  INTC_register_interrupt(&isr, AVR32_USART1_IRQ, AVR32_INTC_INT1);
28
  USART1->ier = AVR32_USART_IER_RXRDY_MASK|AVR32_USART_IER_TIMEOUT_MASK;
29
  USART1->rtor = 100;
30
}

Dann die Service Routine:
1
__attribute__((__interrupt__)) void isr( void )
2
{
3
  unsigned char cs = 0;
4
  int rx_char = 0, i;
5
  
6
  if (USART1->csr & AVR32_USART_CSR_TIMEOUT_MASK)
7
  {
8
    USART1->cr|=AVR32_USART_CR_STTTO_MASK;
9
    
10
    // wenn empfang zu ende
11
                usart1.rx_ready = TRUE;
12
  }
13
  else if (USART1->csr & AVR32_USART_CSR_TXRDY_MASK)
14
  {
15
===>    if (usart1.tx_ptr < mdb.tx_payload) // wenn noch was zum senden
16
    {
17
      USART1->thr = (usart1.tx_buffer[usart1.tx_ptr++] << AVR32_USART_THR_TXCHR_OFFSET) & AVR32_USART_THR_TXCHR_MASK;
18
    }
19
    else // senden fertig, interrupt aus
20
    {
21
      USART1->idr = AVR32_USART_IDR_TXRDY_MASK;
22
    }
23
  }
24
  else if (USART1->csr & AVR32_USART_CSR_RXRDY_MASK)
25
  {
26
    //TODO daten in buffer schaufeln
27
  }
28
  else
29
  {
30
    // unknown interrupt
31
  }
32
}

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

von Billy _. (slowflyer)


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

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.