ATMEL SAM D20J Externe Interrupts

Gast #3579460
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.