www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Konfiguration eines Pin-Interrups auf dem AT91 unter ecos


Autor: Christian L. (chl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich brauche unter Ecos einen Interrupt der auf die steigende Flanke an 
einem Pin reagiert.

Meine Konfigration sieht momentan folgendermaßen aus:
//=========ECOS PIN IRQ DATA======================================================================================

struct fs20pin_irqConfig_t
{
    cyg_vector_t   int_vector;       //  number of irq (eg 5 for SPI)
    cyg_priority_t irq_priority;     //  AIC Priority Level
    cyg_uint32     irq_mode;         //  AIC Interrupt Source Type
    cyg_uint32     irq_initData;     //  additional irq data
    cyg_uint32     irq_data;         //  passed data to the IRQ
};

//  Create and initialise the interrupt data:
static struct fs20pin_irqConfig_t fs20pin_irqConfig =
{
    //  regular SPI interrupt
    AT91C_ID_PIOA,                 //  int_vector
    7,                             //  irq_priority
    AT91C_AIC_PRIOR_LOWEST         //  irq_mode
};

//  Create a structures for eCos internal interrupt specific data:
static cyg_interrupt fs20pin_ecosIrq;
static cyg_handle_t  irq_fs20pin_handle;

cyg_uint32 at91_fs20pin_ISR( cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);
void at91_fs20pin_DSR( cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data);

//=========ECOS TC IRQ DATA=======================================================================================

void Setup_Pin_Interrupt(void){   

    AT91F_PIO_CfgInput( AT91C_BASE_PIOA, RX_PIN );
    //AT91F_PIO_CfgPullup( AT91C_BASE_PIOA, RX_PIN );

    //SETUP interrupt
    cyg_drv_interrupt_create( fs20pin_irqConfig.int_vector,         //  number of the interrupt (0-31)
                              fs20pin_irqConfig.irq_priority,
                              (cyg_addrword_t) &fs20pin_irqConfig,  //  data used by the ISR & DSR
                              at91_fs20pin_ISR,
                              at91_fs20pin_DSR,
                              &irq_fs20pin_handle,                  //  irq handle
                              &fs20pin_ecosIrq);                    //  ecos internal struct

    //Interrupt konfigurieren
    //Interupt loest bei steigender Flanke am Pin aus, so kann mit dem Timer eine Periodendauer gemssen werden.
    cyg_interrupt_configure(
        fs20pin_irqConfig.int_vector,   //Interrupt-Nummer
        false,                          //reagiere auf Flanke, nicht Level
        true);                          //reagiere auf steigend, nicht fallend


    //  Fill eCos interrupt vector tables
    cyg_drv_interrupt_attach( irq_fs20pin_handle);
    cyg_drv_interrupt_unmask( fs20pin_irqConfig.int_vector);

    AT91F_PIO_InterruptEnable ( AT91C_BASE_PIOA, RX_PIN );
   

}
cyg_uint32 at91_fs20pin_ISR( cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data ){

    //aktuellen Interrupt sperren
    cyg_interrupt_mask(fs20pin_irqConfig.int_vector);

    AT91F_PIO_InterruptDisable ( AT91C_BASE_PIOA, RX_PIN );
    
    //aktuellen Interrupt bestaetigen
    cyg_interrupt_acknowledge(fs20pin_irqConfig.int_vector);

    if(AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, RX_PIN)){
    
        xPrintf("Inputset\n");
        AT91F_PIO_GetInterruptStatus(AT91C_BASE_PIOA); // Statusregister lesen => Clear Interrupt
        
        //xPrintf("Interuptabfrage %d\n",AT91F_PIO_IsInterruptSet( AT91C_BASE_PIOA, RX_PIN ));
    }
    else {
        xPrintf("Input not set\n");
        cyg_interrupt_unmask(fs20pin_irqConfig.int_vector);
        return (CYG_ISR_HANDLED);
    }

    //AT91F_PIO_InterruptEnable ( AT91C_BASE_PIOA, RX_PIN );

    
    cyg_drv_interrupt_unmask(AT91C_ID_PIOA);
    return (CYG_ISR_HANDLED);
}

Der Interrupt wird aber bei jedem Flankenwechsel ausgelöst und nicht nur 
bei der steigenden Flanke, was mich zu dem etwas unschönen Workaround 
veranlasst hat.
Lieber wäre es mir den Interrupt nur zu bekommen, wenn von Low auf High 
gewechselt wird.

Vielleicht kann mir jemand weiter helfen.
Danke

Autor: Christian L. (chl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat niemand einen Tipp? :(

Autor: gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
du kannst beim at91sam7 nur die Leitungen IRQ0/IRQ1/FIQ auf 
flanken-triggerung einstellen. bei allen anderen i/o-leitungen wird bei 
jeder flanke der interrupt getriggert.

gruss
gerhard

Autor: Christian L. (chl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Danke, dann werde ich wohl bei meiner Methode bleiben müssen.

Autor: Christian L. (chl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gerhard schrieb:
> du kannst beim at91sam7 nur die Leitungen IRQ0/IRQ1/FIQ auf
> flanken-triggerung einstellen.

Hallo nochmal

Ich versuche gerde diesen IRQ0 Interrupt unter Ecos zu verwenden.
Aber ich bekomme ihn nicht ausgelöst.

Ich verwende den Code wie oben habe aber die Konfiguration des 
Interrupts angepasst.
AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91C_PA30_IRQ0);

static struct RX_PIN_irqConfig_t RX_PIN_irqConfig =
{
    //  regular SPI interrupt
    AT91C_ID_IRQ0,                 //  int_vector
    7,                             //  irq_priority
    AT91C_AIC_PRIOR_LOWEST         //  irq_mode
};

Desweiteren verwende ich die folgenden Funktionen
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0)
AT91F_AIC_DisableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0)
AT91F_AIC_ClearIt (AT91C_BASE_AIC, AT91C_ID_IRQ0)

anstatt der PioInterruptEnable etc

Ich war der Meinung dass sich der IRQ genauso konfigurieren ließe wie 
der PIO-Interrupt. Vielleicht könnte mir jemand weiterhelfen.

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.