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
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 | }
|
marmota schrieb: > gpio_toggle_pin_level(PB08); Diese Funktion ist dann wohl zu langsam. Ersetze sie durch direkte Register-Zugriffe.
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?
Habs mim Oszi gemessen. Controller laeuft mit 48MHz, Cache ist aktiviert
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

