Forum: Mikrocontroller und Digitale Elektronik ATMEL SAM D20J Externe Interrupts


von daniel89 (Gast)


Lesenswert?

Hallo liebe Gemeinde,

mein Anliegen ist folgendes:

Seit letzter Woche bin ich in die Programmierung des ATMEL SAM D20J µC 
und ATMEL Studio 6.1, XPLAINED PRO and OLED1 XPLAINED PRO boards 
eingestiegen.

Um mehr über die Programmierung mehrerer externer interrupts zu 
erfahren, wollte ich eine Stoppuhr realisieren die über 2 Buttons auf 
dem OLED board gesteuert werden soll.

Button 2 (PIN PA_02) startet Timer 0.
Button 3 (PIN PA_03) stoppt Timer 0.

Main Funktion:

int main(void)
{
  system_init();
  init_display();
  init_buttons();
  extinit_enable();
  configure_EI();
  configure_timer0();
          .
          .
          .
          .
}

Ich dachte mir, Timer0 soll über zwei Callbacks (Interrupt Service 
Routinen) gesteuert werden.

Mit "configure_EI()" wird der EIC (Externer Interrupt Controller) 
eingestellt:

void configure_EI(void)
{
  struct extint_chan_conf EI_B2;
  struct extint_chan_conf EI_B3;

  EI_B2.gpio_pin = Button2;
  EI_B2.gpio_mux = Button2;
  EI_B2.gpio_pin_pull = EXTINT_PULL_UP;
  EI_B2.detection_criteria = EXTINT_DETECT_FALLING;

  extint_chan_set_config(Button2, &EI_B2);
  extint_register_callback(Button2_callback,EXTINT_CALL 
BACK_TYPE_DETECT);
  extint_enable_callback(Button2,EXTINT_CALL BACK_TYPE_DETECT);

  EI_B3.gpio_pin = Button3;
  EI_B3.gpio_mux = Button3;
  EI_B3.gpio_pin_pull = EXTINT_PULL_UP;
  EI_B3.detection_criteria = EXTINT_DETECT_FALLING;

  extint_chan_set_config(Button3, &EI_B3);
  extint_register_callback(Button3_callback,EXTINT_CALL 
BACK_TYPE_DETECT);
  extint_enable_callback(Button3,EXTINT_CALL BACK_TYPE_DETECT);

}

Wenn ich nun einen der beiden Buttons betätige, werden beide Callbacks 
ausgeführt.

Meine Vermutung:

extint_register_callback(Param_1 , Param_2);


Diese Funktion führt dazu, dass die Callback-Addressen in ein Array 
hinterlegt werden. Egal welchen Wert ich für Param_1 übergebe, wird 
diese Callbackadresse immer in ein und das selbe Array gespeichert. 
(In meinem Fall Array[0]=Callback1,  Array[1]=Callback2). 
Und zu Param_2 ist zu sagen, das mir das Atmel Studio 6.1 nur diese eine 
Möglichkeit bietet.

Es findet meiner Meinung nach keine wirkliche Zuweisung von Button zu 
Callback statt so das der EIC_Handler immer dieses ein Array sturr 
durchläuft und in die Adressen darin springt.

Wie kann ich nun eine eindeutige Zuweisung realisieren? Ich habe leider 
nur diese Funktionen aus "configure_EI()" zur Steuerung externer 
Interrupts gefunden.

PS: Den Code aus "configure_EI()"

habe ich aus einem Atmel Studio Beispiel entnommen und um eine 
Komponente also Button 3 erweitert.

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.