Forum: Mikrocontroller und Digitale Elektronik AT32UC3B - IrDa


von Jan E. (bonzai2177)


Lesenswert?

Hallo zusammen,

ich möchte über den AT32UC3B IrDa Daten aussenden. Dazu habe ich die 
USART0 auf IrDa Mode eingestellt. Die Baudrate stimmt auch. Der 
Empfänger ist für das Senden ebenfalls abgeschalten. Leider gibt der 
Chip die Daten nicht als IrDa Pulse aus. Worauf muss ich noch achten?

Das Sind meine Einstellungen:

#define F_CPU    3686400UL
#define BAUD            115200UL
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL  (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR  ((BAUD_REAL*1000)/BAUD)

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate groesser 1% und damit zu 
hoch!
#endif

const gpio_map_t USART0_GPIO_MAP = {
  {USART0_RX_PIN, USART0_RX_FUNCTION},
  {USART0_TX_PIN, USART0_TX_FUNCTION}
};
static const usart_options_t USART0_OPTIONS = {
  .baudrate    = BAUD,
  .charlength    = 8,
  .paritytype    = USART_NO_PARITY,
  .stopbits    = USART_1_STOPBIT,
  .channelmode  = USART_NORMAL_CHMODE
};
gpio_enable_module(USART0_GPIO_MAP, sizeof(USART0_GPIO_MAP) / 
sizeof(USART0_GPIO_MAP[0]));   // Assign GPIO to USART.

usart_init_IrDA(USART0, &USART0_OPTIONS, F_CPU,1); // Initialize USART 
in IrDa mode.

USART0->mr = (USART0->mr & ~AVR32_USART_MR_MODE_MASK) | 
AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET | 
AVR32_USART_MR_FILTER_MASK;

USART0->CR.txen = 1;
USART0->CR.rxdis = 1;


Habe ich irgendetwas übersehen?

Gruß

von Sebastian (Gast)


Lesenswert?

Hallo Jan,

hab' zwar noch nie die irda von Atmel benutzt, aber die sollte doch zum 
Laufen zu  bringen sein. Bitte poste doch auch mal folgende Funktion:
1
usart_init_IrDA(USART0, &USART0_OPTIONS, F_CPU,1);

Dann schauen wir mal weiter...

VG,
Sebastian

von Jan E. (bonzai2177)


Lesenswert?

Hallo Sebastian,

danke fürs drüber schauen. Das die Sache funktionieren sollte habe ich 
mir auch gedacht. Die IrDa-Setup-Funktion ist von Atmel.

Hier der Ausschnitt der Atmel usart.c


int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t 
*opt,
                    long pba_hz, unsigned char irda_filter)
{
  // First: Setup standard RS232.
  if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT)
    return USART_INVALID_INPUT;

  // Set IrDA filter.
  usart->ifr = irda_filter;

  // Set IrDA mode and activate filtering of input.
  usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) |
              AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET |
              AVR32_USART_MR_FILTER_MASK;

  return USART_SUCCESS;
}

int usart_init_rs232(volatile avr32_usart_t *usart, const 
usart_options_t *opt, long pba_hz)
{
  // Reset the USART and shutdown TX and RX.
  usart_reset(usart);

  // Check input values.
  if (!opt || // Null pointer.
      opt->charlength < 5 || opt->charlength > 9 ||
      opt->paritytype > 7 ||
      opt->stopbits > 2 + 255 ||
      opt->channelmode > 3 ||
      usart_set_async_baudrate(usart, opt->baudrate, pba_hz) == 
USART_INVALID_INPUT)
    return USART_INVALID_INPUT;

  if (opt->charlength == 9)
  {
    // Character length set to 9 bits. MODE9 dominates CHRL.
    usart->mr |= AVR32_USART_MR_MODE9_MASK;
  }
  else
  {
    // CHRL gives the character length (- 5) when MODE9 = 0.
    usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET;
  }

  usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET |
               opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET;

  if (opt->stopbits > USART_2_STOPBITS)
  {
    // Set two stop bits
    usart->mr |= AVR32_USART_MR_NBSTOP_2 << 
AVR32_USART_MR_NBSTOP_OFFSET;
    // and a timeguard period gives the rest.
    usart->ttgr = opt->stopbits - USART_2_STOPBITS;
  }
  else
    // Insert 1, 1.5 or 2 stop bits.
    usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET;

  // Set normal mode.
  usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) |
              AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET;

  // Setup complete; enable communication.
  // Enable input and output.
  usart->cr = AVR32_USART_CR_RXEN_MASK |
              AVR32_USART_CR_TXEN_MASK;

  return USART_SUCCESS;
}


Ich habe die Einstellungen auch schon mal manuell vorgenommen. Hatte 
auch keine Verbesserung gebracht.

VG Jan

von Sebastian (Gast)


Lesenswert?

Hallo Jan,

mmhhh auf den ersten Blick sieht alles ganz vernüftig aus.

"Leider gibt der Chip die Daten nicht als IrDa Pulse aus."

Meinst Du hiermit, dass Du keine 3/16 Pulse am TX der IRDA siehst?

Sebastian

von Jan E. (bonzai2177)


Lesenswert?

Guten Morgen,

richtig. Ich bekommen nur normale RS232 Pegel. Normal sollte ja anstatt 
der NULL ein 3/16 Puls kommen und für die EINS nichts (also ein 
Low-Pegel).

Gru? Jan

von Jan E. (bonzai2177)


Lesenswert?

Hallo zusammen,

es hat sich geklärt. Die USART0 ist nicht geeignet für IrDa nur die 
USART1.
Das hat mir gerade Atmel geschrieben.

Gruß Jan

von Sebastian (Gast)


Lesenswert?

Na super...

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.