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
UPDATE Er springt in die Routine rein, aber nicht mehr raus...! Unten mach ich aber doch ClearInterrupt, also sollte er doch wieder raus gehen?
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 |
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
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
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
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
>>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
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
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
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
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
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
Tobi schrieb: > Hattet ihr das Problem schonmal Einmal? ;-) Tobi schrieb: > ne Ahnung woran das liegen könnte? Das ist stochern im Nebel.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.