Interrupt Handler verbiegen klappt nicht

Nutzen der APIs und allgemeine Coding Fragen
Thomas Barth
Administrator
Beiträge: 85
Registriert: So 5. Apr 2015, 21:46
Wohnort: Frankfurt/M
Kontaktdaten:

Re: Interrupt Handler verbiegen klappt nicht

Beitragvon Thomas Barth » Di 3. Mai 2016, 11:59

Bei CAN bin ich einen anderen Weg gegangen weil ich diesen GlobalAPI zu hakelig finde.
Ich habe ein Array aus Funktionszeigern angelegt und habe diese dann über macros im CAN Treiber aufgerufen, so kann man jeder Mailbox einen eigenen Handler zuweisen und einfach ändern.

Das mit dem ACR/AMR/CMD registern ist ein wenig spooky, schein als wäre da IP einfach eingekauft worden.

Das mit dem Filter gucke ich mir dann auch nochmal an, mache das derzeit in Software (schalte den Interrupt nur frei wenn ich auf Nachrichten von Servern warte).

Das CMD register habe ich mal auseinander genommen:

Code: Alles auswählen

CMD        1000 0000 0000 0000 0010 1000
           |  | ||||           |||| || |---// bit 0: ACK
           |  | ||||           |||| ||     
           |  | ||||           |||| ||-----// bit 2: RTR Abort
           |  | ||||           |||| |------// bit 3: Buffer Enabled
           |  | ||||           ||||
           |  | ||||           ||||--------// bit 4: RTR Reply                           
           |  | ||||           |||---------// bit 5: Interrupt Enable
           |  | ||||           ||----------// bit 6: Linking enabled
           |  | ||||           |-----------// bit 7: Write Protection Low
           |  | ||||
           |  | ||||-----------------------// bit 16: DLC[0]
           |  | |||------------------------// bit 17: DLC[1]
           |  | ||-------------------------// bit 18: DLC[2]
           |  | |--------------------------// bit 19: DLC[3]
           |  |
           |  |----------------------------// bit 20: IDE
           |
           |
           |-------------------------------// bit 23: Write Protection High

Code: Alles auswählen

P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S
                                   ((1.0/C_M_LSB_BH) *
                                   G_M_INFO_DERIVE(T_ALG.E_BH)))

Thomas Barth
Administrator
Beiträge: 85
Registriert: So 5. Apr 2015, 21:46
Wohnort: Frankfurt/M
Kontaktdaten:

Re: Interrupt Handler verbiegen klappt nicht

Beitragvon Thomas Barth » Di 3. Mai 2016, 12:09

Gnutzi hat geschrieben:Nur, wenn anschließend irgendwelche Änderungen an der TopDesign Seite gemacht werden, waren meine Einträge wieder futsch.
Jetzt habe ich ein eigenes myCFILE.h und myCFILE.c dafür angelegt,die entsprechenden Funktionen umbenannt und dorthin kopiert.
Sicherlich nicht die eleganteste Lösung aber es funktioniert (und ich verstehe es).


Hier musst du auf die Zeilen in folgendem Format achten
cpp code
/* `#START ISR_Timer1_Interrupt` */

/* `#END` */


Diese Teile bleiben immer erhalten, auch wenn du im TopDesign die Einstellungen änderst und den Treiber neu generierst.

Code: Alles auswählen

P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S
                                   ((1.0/C_M_LSB_BH) *
                                   G_M_INFO_DERIVE(T_ALG.E_BH)))

Gnutzi
Beiträge: 6
Registriert: Sa 26. Mär 2016, 16:22

Re: Interrupt Handler verbiegen klappt nicht

Beitragvon Gnutzi » Fr 6. Mai 2016, 07:48

Hallo Thomas,

Hier musst du auf die Zeilen in folgendem Format achten
cpp code

Code: Alles auswählen

/* `#START ISR_Timer1_Interrupt` */
 
    /* `#END` */



Diese Teile bleiben immer erhalten, auch wenn du im TopDesign die Einstellungen änderst und den Treiber neu generierst.


An der Stelle ist für mich der Zug aber schon abgefahren. Das Filter soll ja bewirken, dass der Interrupt nur bei den richtigen CAN-IDs aufgerufen wird. Meine Platine hängt an dem CAN-Bus einer Märklin Steuerung. Märklin hält sich nicht an den üblichen Aufbau einer CAN Nachricht sondern setzt auf das CAN Protokoll ein eigenes Layer drauf. Meine Platine soll Magnetartikel schalten, deswegen interessieren mich nur die Nachrichten für das schalten von Magnetartikeln (0xB0). Dieser Code ist in den 29Bit der ID an einer festgelegten Position zu finden. Dazu kommt noch, dass Märklin nicht das Reply Bit verwendet sondern diese Information auch in die 29Bit der ID gelegt hat. Nur auf dieses Bit zu filtern würde mir schon 50% aller Nachrichten in dem Interrupt ersparen.
Für Einstellungen auf meiner Platine verwende ich auch noch den Code 0xD0, deswegen habe ich mir 2 Mailboxen für den Empfang eingerichtet und dafür das CAN.C File editiert.


Code: Alles auswählen

uint8 myCAN_RxTxBuffersConfig(void)
{
    /* Initial values of CAN RX and TX registers 0xFE07FFFFu als Maske und 0x00B00000 als Filter für Zubehör */
    static const CAN_RX_CFG CYCODE CAN_RXConfigStruct[] =
    {
        // eigene Anpassungen um auf Befehle B0 und D0 zu filtern
        { 0u, 0x28u, 0xFE07FFFFu, 0x00B00000u },            // auf B0 filtern             
        { 1u, 0x28u, 0xFE07FFFFu, 0x00D00000u },            // auf D0 filtern
        { 2u, 0x0u, 0x0u, 0x0u },
        { 3u, 0x0u, 0x0u, 0x0u },
        { 4u, 0x0u, 0x0u, 0x0u },
        { 5u, 0x0u, 0x0u, 0x0u },
        { 6u, 0x0u, 0x0u, 0x0u },
        { 7u, 0x0u, 0x0u, 0x0u },
        { 8u, 0x0u, 0x0u, 0x0u },
        { 9u, 0x0u, 0x0u, 0x0u },
        { 10u, 0x0u, 0x0u, 0x0u },
        { 11u, 0x0u, 0x0u, 0x0u },
        { 12u, 0x0u, 0x0u, 0x0u },
        { 13u, 0x0u, 0x0u, 0x0u },
        { 14u, 0x0u, 0x0u, 0x0u },
        { 15u, 0x0u, 0x0u, 0x0u }
    };


Das funktioniert soweit ganz ordentlich und bleibt dank des myCFILE.C ja nun auch erhalten.
Diese Woche hatte ich aber auch keine Zeit daran weiter zu basteln.

Ich benötige aber noch eine Möglichkeit Daten zu speichern und das em_EEPROM Modul gibt es bei dem 4200M nicht....
Dafür mache ich dann aber einen neuen Thread.

Gruß Frank

Thomas Barth
Administrator
Beiträge: 85
Registriert: So 5. Apr 2015, 21:46
Wohnort: Frankfurt/M
Kontaktdaten:

Re: Interrupt Handler verbiegen klappt nicht

Beitragvon Thomas Barth » Fr 13. Mai 2016, 11:08

Von dieser Märklin Sache habe ich schon mal gehört, merke ich mir für die Rente ;)

Ich habe gerade einen Screenshot gesucht, wo ich mal das Timing meines CANopen Stack gemessen habe. Ich hatte CAN mit 1MBit laufen. Meine, doch recht komplexe, Verarbeitung des CAN-Frames war nur einen Bruchteil so lang wie ein CAN-Frame auf dem Bus braucht. Der Ansatz der Adressfilterung in Hardware ist gut und richtig aber eigentlich nicht wirklich benötigt da der PSoC flott unterwegs ist. An deiner Stelle wuerde ich es daher erstmal in Software bauen, mich über den Erfolg auf der Eisenbahnplatte freuen und dann in einer nächsten Iteration das System optimieren.

Bildchen reiche ich nach.

P.S: Bezüglich EEPROM kannst du z.B. Richtung PSoC 5 mit EEPROM zu gehen oder dir die FRAMs von cypress mal anzugucken. Habe da einen kleinen Treiber geschrieben, den ich auch veröffentlicht habe. Aber das können wir dann ja im anderen Thread besprechen :lol:

Code: Alles auswählen

P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S
                                   ((1.0/C_M_LSB_BH) *
                                   G_M_INFO_DERIVE(T_ALG.E_BH)))

Thomas Barth
Administrator
Beiträge: 85
Registriert: So 5. Apr 2015, 21:46
Wohnort: Frankfurt/M
Kontaktdaten:

Re: Interrupt Handler verbiegen klappt nicht

Beitragvon Thomas Barth » Sa 14. Mai 2016, 19:32

Hier das versprochene Bildchen
can.png
can.png (22.56 KiB) 1550 mal betrachtet


In den 25µs passiert eine Menge! So schnell kommt der Bus garnicht hinterher wie du die Frames abfrühstücken kannst 8-) :lol:

Code: Alles auswählen

P_M_DERIVE(T_ALG.E_BH) := UC_16S_EN_16NS (TDB.T_ENTIER_16S
                                   ((1.0/C_M_LSB_BH) *
                                   G_M_INFO_DERIVE(T_ALG.E_BH)))


Zurück zu „PSoC Software“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron