PSoC Interrupt wird nicht ausgelöst

Gast #4628569
Lesenswert?

Hallo,
ich habe oben meinen Code gepostet. Der Interrupt wird nicht ausgelöst. 
Es sopll quasi ein Timer zählen der alle 25 ms zurückgesetzt wird und 
dann den Interrupt auslöst Beim Debuggen springt er aber nie rein.

Der Prototyp ist angelegt was bei meiner Struktur aber eig nicht 
notwendig ist. Aktiviert ist der Interrupt auch. Die Bezeichner sind 
identisch. Hab ich vielleich tbeim Anschluss etwas falsch gemacht? Bzw 
müssen zusätzliche Einstellungen am Timer erfolgen?

Wäre cool wenn jemand helfen kann.


Grüße
Angehängte Dateien:
#4628599
Lesenswert?

1
void ISR_ClearPending(void)
2
Description: Clears a pending interrupt in the interrupt controller.
3
Note Some interrupt sources are clear-on-read and require the block interrupt/status register
4
to be read/cleared with the appropriate block API (GPIO, UART, and so on). Otherwise the
5
ISR will continue to remain in pending state even though the interrupt itself is cleared using
6
this API.
7
Parameters: None
8
Return Value: None
9
Side Effects: None
Gast #4628642
Lesenswert?

Jetzt funktioniert es.

Habe das ClearInterrupt aber so gelassen. Habe bei den Timer 
Einstellungen auf "On Terminal Count" umgestellt und dann beim 
ClearInterrupt die Masek umbenannt auf 
"Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC"

TC für Terminal Count. Jetzt tut es.

Das ClearPending ist doch eig eine angekündigte Löschung wenn man zum 
beispiel die einzelnen Interrupts unterschiedlich priorisiert und der 
eine interrupt nicht immer ausgelöst wird oder so ähnlich.


Grüße


P.S. Thread kann geschlossen werden
Gast #4630967
Lesenswert?

Patrick C. schrieb:
> Du benutzt die falsche funktion. Es soll sein :
> Trigger_1_ReadStatusRegister(); // Clear Interrupt Flag
>
> Bin ich froh das es nicht nur mich passiert. Ich habe genau dasselbe
> problem gehat

Hey,
ich hab hier nochmal meinen Code


CY_ISR(Interrupt_25ms_Handler)
{
    //Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC);   //Interrupt Flag 
zurücksetzen

    status_sensor1 = Sensor1_Status_Read(); //Lese aktuellen Pegel und 
schreibe in Variable
    status_sensor2 = Sensor2_Status_Read();

    Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC);   //Interrupt Flag 
zurücksetzen
}

Jetzt springt er wieder nicht aus der scheiß Interrupt Routine. Deien 
Lösung check ich nicht, weil er dieses Makro nicht kennt.

Hat jemand nen Plan was ich falsch mache???

Grüße
#4631023
Lesenswert?

Deine Infos sind zu dürftig, um genauer helfen zu können.
Ich denke mal, dass du die PSoC4 TCPWM Komponente einsetzt.
Da vermisse ich in der ISR schon mal die Ermittlung der IR-Quelle.

Vlt. kann der Auszug meiner ISR aus einer Drehzahlmessung(Periodendauer) 
helfen.
1
CY_ISR(CounterISR){    
2
    /* Variable to store the Counter Status register. The bits in this register determined which caused the
3
       Interrupt (either Terminal Count or Capture). */
4
    uint32 counterStatus = 0u;
5

6
    counterStatus = Counter_GetInterruptSource(); //read counter status register
7

8
    /* Check if the Counter interrupt source. 
9
     * The defines Counter_INTR_MASK_TC and Counter_INTR_MASK_CC_MATCH can be seen in Counter.h file.
10
     * These defines indicate the type of interrupt*/
11
    if ((counterStatus & Counter_INTR_MASK_TC) == Counter_INTR_MASK_TC) //counter overflow (TC)
12
    {
13
        speedMeter_1.counterOverflowCount++;                            //increment overflow counter
14
        Counter_ClearInterrupt(counterStatus & Counter_INTR_MASK_TC);   //clear TC interrupt      
15
    }    
16

17
    /* Check if the Counter interrupt is caused by Capture Event */
18
    if ((counterStatus & Counter_INTR_MASK_CC_MATCH) == Counter_INTR_MASK_CC_MATCH) 
19
    {
20
        speedMeter_1.capturedCount = Counter_ReadCapture();             //capture event occurred    
21
        /* Set the ISR_flag to TRUE to indicate the occurrence of CC Interrupt */
22
        speedMeter_1.capturedIsr_Flag = TRUE;  
23

24
        /*Clear the Interrupt*/
25
        Counter_ClearInterrupt(counterStatus & Counter_INTR_MASK_CC_MATCH);
26
    }
27
}

Ist sicher nicht der einzigste und auch sicher nicht der optimalste 
Code, läuft aber sicher;-)

Reiner
#4631029
Lesenswert?

>>Deinen Lösung check ich nicht, weil er dieses Makro nicht kennt.
Schueldigung, in deiner software musz es wahrscheinlich 
Timer_1_ReadStatusRegister() sein

Ich musz sagen die support von Cypress selber ist sehr gut, du kannst es 
da auch versuchen. (English)

PS Meine loesung funktioniert auf meinen PSOC3 und PSOC5, kann sein das 
es bei PSOC4 anders funktioniert. Welchen PSOC benutzt du ?
Gast #4631173
Lesenswert?

Aber ich möchte doch nicht irgendwelche counter values lesen. Ich will 
einfach nur das Interrupt Flag zurücksetzen. In den Tutorials von 
Cypress wird das genau so gemacht und dort hat es komischer weise 
funktioniert.
@Reiner: Ganz oben siehst du noch den Aufbau, bzw meinen ganzen Code 
(ist nicht mehr der aktuellste aber alles zu diesem Thema drinne)

Grüße
#4631215
Lesenswert?

Deine Anforderung sollte doch so ungefähr dem hier entsprechen:

http://www.cypress.com/documentation/code-examples/ce95385-tcpwm-timercounter-operation-psoc-4

Sie dir doch mal an, wie die es gemacht haben.

Oder besser noch hier:

http://www.cypress.com/documentation/code-examples/ce210557-psoc-4-timer-interrupt

Das letzte Beispiel ist interessant, weil es eigentlich ebenfalls nur 
einen periodischen Impuls erzeugt.
Die isr versteckt sich hier allerdings in der Datei isr.c, die 
(zumindest bei mir) gar nicht im Projektbaum auftaucht.

relevanter Auszug:
1
CY_ISR(isr_Interrupt)
2
{
3
    /*  Place your Interrupt code here. */
4
    /* `#START isr_Interrupt` */
5
  
6
  /* Clear TCPWM Interrupt */
7
  TCPWM_ClearInterrupt(TCPWM_INTR_MASK_TC);
8
  
9
  /* Toggle LED */
10
  Pin_LED_Write(~Pin_LED_Read());
11
    /* `#END` */
12
}

Nee, die ist ist doch in isr_Timer.c.
Das ist von Cypress äußerst inkonsistent gemacht.
Gast #4631300
Lesenswert?

Hallo,

kleines Update!

Ich habe ein neues projekt angelegt und nochmal das Top Design und auch 
meinen c-Code neu eingefügt bzw neu ertsellt. Das habe ich getan weil 
plötzlich auch die UART Übertragung nicht mehr funktionierte und keine 
Werte mehr übertragen wurden.

Jetzt tut wieder alles. Komisch, ich verstehe nicht genau wieso. 
Vielleicht hat sich beim testen und debuggen irgendwo ein Fehler 
eingeschlichen.

Hattet ihr das Problem schonmal bzw ne Ahnung woran das liegen könnte?


Meine Interrupt Routine konnte ich jetzt auch wieder ganz normal mit
Timer_ClearInterrupt(Timer_INTR_MASK_TC); zurücksetzen.
Bei den Pins habe ich es genau so gemacht:
Sensor1_Z_ClearInterrupt();

Vielen Dank für eure Hilfe
Wenn irgendwas ist melde ich mich hier nochmal.

Grüße

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren