Forum: Mikrocontroller und Digitale Elektronik SAME54 Interrupt latency Problem


von marmota (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich hab n kleines Projekt mit dem ATSAME54 Xplained Pro Board 
angefangen. Es hat einen Input Pin auf den ein Signal kommt und dann 
einen Interrupt auslöst der der einen Ausgang schaltet.
Das Problem ist das die Zeit vom Input Signal bis zum Schalten 17us 
braucht. Hat jemand eine Idee wie man die Zeit verkürzen kann?

Danke schonmal

von Dr. Sommer (Gast)


Lesenswert?

Software und Konfiguration des Controllers verbessern.

von marmota (Gast)


Lesenswert?

hier noch den Code dazu
1
static void ISR(void){
2
  gpio_toggle_pin_level(PB08);
3
}
4
5
int main(void)
6
{
7
  /* Initializes MCU, drivers and middleware */
8
  atmel_start_init();
9
10
  ext_irq_register(PA06, ISR);
11
12
  /* Replace with your application code */
13
  while (1) {
14
  }
15
}

von Dr. Sommer (Gast)


Lesenswert?

marmota schrieb:
> gpio_toggle_pin_level(PB08);

Diese Funktion ist dann wohl zu langsam. Ersetze sie durch direkte 
Register-Zugriffe.

von marmota (Gast)


Lesenswert?

Die Funktion schaltet im Nanosekunden bereich.

von Dr. Sommer (Gast)


Lesenswert?

marmota schrieb:
> Die Funktion schaltet im Nanosekunden bereich.

Woher weißt du das? Ruf sie doch mal 2x hintereinander auf, dann sieht 
man ja auf dem Oszilloskop wie lange die braucht.

Auf welchem Takt läuft der Controller? Cache aktiviert?

von marmota (Gast)


Lesenswert?

Habs mim Oszi gemessen.

Controller laeuft mit 48MHz, Cache ist aktiviert

von Dr. Sommer (Gast)


Lesenswert?

Dann zeig doch mal den dissassemblierten Code von ISR und 
gpio_toggle_pin_level.
Welchen Takt verwendest du für den EIC? Nicht zufällig den 32kHz-Takt? 
Benutzt du den Filter und die Entprell-Logik?

von Rudolph (Gast)


Lesenswert?

Bäh, ASF. :-)

So langsam sollte das aber echt nicht sein.
17µs ist wirklich übel.

REG_PORT_OUTTGL1 = PORT_PB08;


>ext_irq_register(PA06, ISR);

Wenn ich das so sehe, dass ist doch gar nicht die Interrupt-Funktion.
Da hängt doch sicher noch die eigentliche Funktion davor und dekodiert 
mit was auch immer für einen Aufwand erstmal was passiert ist und wo 
hingesprungen werden soll.

Den EIC von Hand zu konfigurieren und die EIC_Handler Funktion der 
Anforderung entsprechend zu schreiben dürfte deutlich fixeren Code 
erzeugen.

von ThomasF (Gast)


Angehängte Dateien:

Lesenswert?

So sieht es ohne ASF aus.

Kanal1: Eingang
Kanal2: ISR

SAME54@48MHZ und Cache aktiv


ISR(EIC_4_Handler)
{
  PORTB->OUTTGL.reg = (1u<<8);
  __ASM volatile ("":::"memory");

  EIC->INTFLAG.reg = (1u<<4);

  __ASM volatile ("":::"memory");
  PORTB->OUTTGL.reg = (1u<<8);
}

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.