Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: CAN_Library_Example Ekran CAN-library
CANlibrary.cpp
00001 #include "CANlibrary.h" 00002 00003 00004 extern CAN can; 00005 extern Serial pc; 00006 00007 Ticker tick1; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!! nije hteo da se prevede kao extern 00008 Ticker tick2; 00009 Ticker tick3; 00010 00011 /****************************************** 00012 - - - - - VAZNO! - - - - - 00013 IDjevi se tumace u decimalnom brojnom sistemu 00014 - can_flag niz treba namestiti adrese da idu u u intervalu od 0-15 celobrojno 00015 - tj, mogle bi da se i koriste one od 2000h ali tipa da to se oduzima 00016 nekom celobrojom konstantom koja ce davati oseg adresa od 0 do 15 00017 */ 00018 00019 00020 bool can_flag[16]; 00021 CANMessage msgs[16]; 00022 char data[8],data1[8],data2[8],data3[8]; 00023 char idTX=0,idTX1=0,idTX2=0,idTX3=0; 00024 float msgInterval1=0,msgInterval2=0,msgInterval3=0; 00025 00026 void can_initRX(){ 00027 can.attach(can_msg_receive, CAN::RxIrq); 00028 } 00029 void can_msg_receive(){ // CAN RX Interrupt Function 00030 CANMessage tmpMsg; 00031 if (can.read(tmpMsg)) { //Detect message 00032 can_flag[tmpMsg.id]=true; 00033 msgs[tmpMsg.id%16]=tmpMsg; 00034 } 00035 }; 00036 00037 uint16_t get_data(char id, char indeks){ 00038 return msgs[id].data[indeks<<1] | (msgs[id].data[(indeks << 1) + 1] << 8); 00039 } 00040 00041 bool check_flag(char id){ 00042 bool ret = can_flag[id]; 00043 can_flag[id]=false; 00044 return ret; 00045 } 00046 00047 00048 //------------------------------------------------------------------- 00049 //------------------------------------------------------------------- 00050 // Funkcije slanja poruka: 00051 void canTX_set_Interval(float inter){ 00052 00053 //Zadavanje fiksnog intervala slanja CAN poruke 00054 //Vrednost je realna. Jedinica zadavanja je u sekundama. 00055 msgInterval1=inter; 00056 } 00057 00058 void canTX_set_Interval_1(float inter){ 00059 00060 //Zadavanje fiksnog intervala slanja CAN poruke 00061 //Vrednost je realna. Jedinica zadavanja je u sekundama. 00062 msgInterval1=inter; 00063 } 00064 00065 void canTX_set_Interval_2(float inter){ 00066 00067 //Zadavanje fiksnog intervala slanja CAN poruke 00068 //Vrednost je realna. Jedinica zadavanja je u sekundama. 00069 msgInterval2=inter; 00070 } 00071 00072 void canTX_set_Interval_3(float inter){ 00073 00074 //Zadavanje fiksnog intervala slanja CAN poruke 00075 //Vrednost je realna. Jedinica zadavanja je u sekundama. 00076 msgInterval3=inter; 00077 } 00078 void can_initTX(char idtx){ 00079 00080 //Fukcija koja zadaje fiksnu adresu slanja poruke 00081 idTX1=idtx; 00082 } 00083 00084 void can_initTX1(char idtx){ 00085 00086 //Fukcija koja zadaje fiksnu adresu slanja poruke 00087 idTX1=idtx; 00088 } 00089 00090 void can_initTX2(char idtx){ 00091 00092 //Fukcija koja zadaje fiksnu adresu slanja poruke 00093 idTX2=idtx; 00094 } 00095 00096 void can_initTX3(char idtx){ 00097 00098 //Fukcija koja zadaje fiksnu adresu slanja poruke 00099 idTX3=idtx; 00100 } 00101 void can_msg_send(){ 00102 00103 /* 00104 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 00105 * Duzina poruke podesena je fiksno na 8B. 00106 */ 00107 can.write(CANMessage((uint16_t)idTX1, data1, 8)); 00108 } 00109 void can_msg_send1(){ 00110 00111 /* 00112 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 00113 * Duzina poruke podesena je fiksno na 8B. 00114 */ 00115 can.write(CANMessage((uint16_t)idTX1, data1, 8)); 00116 } 00117 void can_msg_send2(){ 00118 00119 /* 00120 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 00121 * Duzina poruke podesena je fiksno na 8B. 00122 */ 00123 can.write(CANMessage((uint16_t)idTX2, data2, 8)); 00124 } 00125 void can_msg_send3(){ 00126 00127 /* 00128 * Fukcija koja salje podatke na CAN mrezu po zadatom,setovanom, IDju. 00129 * Duzina poruke podesena je fiksno na 8B. 00130 */ 00131 can.write(CANMessage((uint16_t)idTX3, data3, 8)); 00132 } 00133 00134 void can_msg_send_tick(){ 00135 00136 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala 00137 idTX=idTX1; 00138 //strcpy(data,data1); 00139 tick1.attach(can_msg_send1, msgInterval1); 00140 } 00141 void can_msg_send_tick1(){ 00142 00143 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala 00144 idTX=idTX1; 00145 //strcpy(data,data1); 00146 tick1.attach(can_msg_send1, msgInterval1); 00147 } 00148 void can_msg_send_tick2(){ 00149 00150 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala 00151 idTX=idTX2; 00152 //strcpy(data,data2); 00153 tick2.attach(can_msg_send2, msgInterval2); 00154 } 00155 void can_msg_send_tick3(){ 00156 00157 //Funkcija koja se poziva za slanje poruka u okviru fiksnog intervala 00158 idTX=idTX3; 00159 //strcpy(data,data3); 00160 tick3.attach(can_msg_send3, msgInterval3); 00161 } 00162 //---------------------------------------------------------------------------- 00163 /* Pomocne funkcije za pakovanje podataka prilikom slanja: 00164 * Ove funkcije omogućavaju da automatsko pakovanje u razlicite velicine poruke 00165 * u zavisnosti od tipa i pozicije na kojoj treba poslati podatak. 00166 * 00167 * Realizovane su za dva tipa: 00168 * -unit16_t (automatsko pakovanje u dva podatka od po 1B) 00169 * -char 00170 * 00171 * Format: dta = vrednost koju saljemo kao podatak CANom, pos = pozicija u CAN 00172 * poruci. 00173 * 00174 * CAN poruka: (IDslanja, DD7, DD6, DD5, DD4, DD3,DD2, DD1, DD0) 00175 * Velicina podataka (DD7...DD0) je od po 1Byte. 00176 * Maximalno se mogu poslati 4 podatka od po 2B (pos polje u opsegu od 0 do 3) 00177 * ili 8 od po 1B (pos polje u opsegu od 0 do 7). 00178 */ 00179 void pack_data(uint16_t dta, char pos){ 00180 00181 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci 00182 data1[pos<<1] = dta; 00183 data1[(pos<<1)+1] = dta >> 8; 00184 } 00185 00186 void pack_data1(uint16_t dta, char pos){ 00187 00188 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci 00189 data1[pos<<1] = dta; 00190 data1[(pos<<1)+1] = dta >> 8; 00191 } 00192 00193 void pack_data1(char dta, char pos){ 00194 00195 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci 00196 data1[pos<<1] = dta; 00197 } 00198 00199 void pack_data2(uint16_t dta, char pos){ 00200 00201 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci 00202 data2[pos<<1] = dta; 00203 data2[(pos<<1)+1] = dta >> 8; 00204 } 00205 00206 void pack_data2(char dta, char pos){ 00207 00208 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci 00209 data2[pos<<1] = dta; 00210 } 00211 00212 void pack_data3(uint16_t dta, char pos){ 00213 00214 //Pakuje unit16_t u dva podatka od po 1B, na poziciji pos u CAN poruci 00215 data3[pos<<1] = dta; 00216 data3[(pos<<1)+1] = dta >> 8; 00217 } 00218 00219 void pack_data3(char dta, char pos){ 00220 00221 //Pakuje char u jedan podatka od 1B, na poziciji pos u CAN poruci 00222 data3[pos<<1] = dta; 00223 } 00224 00225
Generated on Thu Jul 14 2022 10:55:48 by
1.7.2