Forum: Mikrocontroller und Digitale Elektronik PSoC Interrupt wird nicht ausgelöst


von Tobi (Gast)


Angehängte Dateien:

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

von Tobi (Gast)


Lesenswert?

UPDATE


Er springt in die Routine rein, aber nicht mehr raus...! Unten mach ich 
aber doch ClearInterrupt, also sollte er doch wieder raus gehen?

von T. F. (waidler)


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

von Patrick C. (pcrom)


Lesenswert?

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

von T. F. (waidler)


Lesenswert?

Aus dem Datenblatt zu "Interrupt"...

von Tobi (Gast)


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

von Tobi (Gast)


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

von Reiner W. (reiner_w)


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

: Bearbeitet durch User
von Patrick C. (pcrom)


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 ?

: Bearbeitet durch User
von Reiner W. (reiner_w)


Angehängte Dateien:

Lesenswert?

Patrick C. schrieb:
> kann sein das
> es bei PSOC4 anders funktioniert

Tut es, die TCPWM-Komponente arbeitet anders.
In Bild 1 noch die Komponenteneinstellung zu meiner ISR

Reiner

von Tobi (Gast)


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

von Reiner W. (reiner_w)


Lesenswert?

Reiner W. schrieb:
> Da vermisse ich in der ISR schon mal die Ermittlung der IR-Quelle.

Und wenn das nicht nötig ist, gehts auch einfach so:

https://www.youtube.com/watch?v=zRAP3PRudMg

Etwas bei 2:30

von Reiner W. (reiner_w)


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.

: Bearbeitet durch User
von Tobi (Gast)


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

von Reiner W. (reiner_w)


Lesenswert?

Tobi schrieb:
> Hattet ihr das Problem schonmal

Einmal? ;-)

Tobi schrieb:
> ne Ahnung woran das liegen könnte?

Das ist stochern im Nebel.

von Reiner W. (reiner_w)


Lesenswert?

Ein Hinweis sei mir noch gestattet.
Für so einen Standardtimer nehme ich immer den SysTick-Timer des 
Prozessors. Der ist ja sowieso vorhanden.
Das spart schon mal eine TCPWM Komponente (in deinem Fall gleich 2).
Die Hardwareressourcen sind ja in PSoC4 ohnehin knapp.

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.