Hallo An alle, Ich versuche seit tagen mit Can interrupt klar zu kommen. Kann mir jemand ein BSP. geben wie ich Can Interrupt benutzen kann. Ich habe unter mein Funktion can_set_functional_mode(1) dannn diue ganze Filter auf 0x7E8 enable_interrupts(int_canrx0); enable_interrupts(GLOBAL); #int_canrx0 void canrx0_int() { can_getd(rx_id,receive,rx_len,stat); } Es funktioniert aber nicht. Was mache ich Falsch?
Ich versuche seit Tagen mit einem auf der strasse gefundenen Schlüssel den Ferrari meines Nachbarn zum laufen zu kriegen, funktioniert aber nicht. Was mache ich falsch? Da fehlen Angaben. - Welches PIC nutzt du? - Sind die ganzen Funktionen aus einer Lib oder von dir alle selbst programmiert? Falls von dir -> Poste den Code - Um Code im Forum übersichtlicher zu gestalten, kannst du diesen auch mit BBCode oder wie man die Dinger nennt übersichtlicher gestalten. Oberhalb des Textfeldes um Beiträge zu schreiben sind diese beschrieben. Hier:
1 | can_set_functional_mode(1) |
2 | dannn diue ganze Filter auf 0x7E8 |
3 | |
4 | enable_interrupts(int_canrx0); |
5 | enable_interrupts(GLOBAL); |
6 | |
7 | |
8 | #int_canrx0
|
9 | void canrx0_int() |
10 | {
|
11 | can_getd(rx_id,receive,rx_len,stat); |
12 | }
|
:) Ok also ich nutze den Pic18f4580 mit mcp2551. hier ist mein Code: #include <18F4580.h> #fuses HS,NOPROTECT,NOLVP,NOWDT #use delay(clock=20000000) #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7) #include "can-18F4580.c" #include "lcd_benim.c" #define S1 0x7DF #define CAN_USE_EXTENDED_ID False #define Button pin_c0 int time, time1; int32 rx_id; int z=0, rx_len,i; struct rx_stat stat; int receive[8]; unsigned char A1[8]={0x02,0x01,0x0C,0x00,0x00,0x00,0x00,0x00}; int16 A1_rpm; #int_canrx0 void canrx0_int () { lcd_gotoxy(1,4); printf(lcd_putc,"canbus "); can_getd(rx_id,receive,rx_len,stat); if(receive[2] == 0x0C) { A1_rpm=((receive[3]*256)+receive[4])/4; lcd_gotoxy(1,3); printf(lcd_putc,"S1: %Li rpm",A1_rpm); } } void main() { set_tris_c(0x03); lcd_init(); delay_ms(200); can_init(); can_set_functional_mode(1); // mode 1 can_set_id(RX0MASK,0xFFF,FALSE); can_set_id(RXFILTER0,0x7E8,FALSE); can_set_id(RXFILTER1,0x7E8,FALSE); can_set_id(RXFILTER2,0x7E8,FALSE); can_set_id(RXFILTER3,0x7E8,FALSE); can_set_id(RXFILTER4,0x7E8,FALSE); can_set_id(RXFILTER5,0x7E8,FALSE); can_set_id(RXFILTER6,0x7E8,FALSE); can_set_id(RXFILTER7,0x7E8,FALSE); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F0BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F1BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F2BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F3BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F4BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F5BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F6BP); can_associate_filter_to_mask(ACCEPTANCE_MASK_0,F7BP); can_associate_filter_to_buffer(ARXB0, F0BP); can_associate_filter_to_buffer(ARXB1, F1BP); can_associate_filter_to_buffer(AB0, F2BP); can_associate_filter_to_buffer(AB1, F3BP); can_associate_filter_to_buffer(AB2, F4BP); can_associate_filter_to_buffer(AB3, F5BP); can_associate_filter_to_buffer(AB4, F6BP); can_associate_filter_to_buffer(AB5, F7BP); enable_interrupts(int_canrx0); enable_interrupts(GLOBAL); delay_ms(500); time = 100; While(TRUE) { can_putd(S1,A1, 8, 1, False, FALSE); } }
In der Interrupt Service Routine musst Du aufpassen, was für Funktionen Du benutzt. Du darfst nichts aufrufen, was seinerseits wieder Interrupts benötigt. printf und andere Funktionen der Laufzeitbibliothek funktionieren meistens nicht. Hier musst Du eine andere Strategie wählen, zB nur ein Flag setzen (volatile deklarieren), das dann im Hauptprogramm ausgewertet wird. fchk
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.