EasyCAT shield basic test - EtherCAT slave example

Dependencies:   mbed EasyCAT_lib

The EasyCAT Shield and /static/img/mbed.gif boards

/media/uploads/EasyCAT/easycat_onnucleo.jpg

  • The EasyCAT Shield is an Arduino shield, designed and manufactured in Italy by AB&T Tecnologie Informatiche, that allow us to build a custom EtherCAT® slave in an easy way.
  • The TestEasyCAT program is a basic example that shows how to excange some I/O between the EtherCAT master and the EasyCAT slave.

Import programTestEasyCAT

EasyCAT shield basic test - EtherCAT slave example

Import libraryEasyCAT_lib

EasyCAT shield library - It allows you to make an EtherCAT slave

Committer:
EasyCAT
Date:
Wed Jan 09 09:45:21 2019 +0000
Revision:
1:1e7996e6c4a7
Parent:
0:31a727b65397
revision 2 - moved  "DigitalOut Led(LED1)"

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EasyCAT 0:31a727b65397 1 //********************************************************************************************
EasyCAT 0:31a727b65397 2 // *
EasyCAT 0:31a727b65397 3 // AB&T Tecnologie Informatiche - Ivrea Italy *
EasyCAT 0:31a727b65397 4 // http://www.bausano.net *
EasyCAT 0:31a727b65397 5 // https://www.ethercat.org/en/products/791FFAA126AD43859920EA64384AD4FD.htm *
EasyCAT 0:31a727b65397 6 // *
EasyCAT 0:31a727b65397 7 //********************************************************************************************
EasyCAT 0:31a727b65397 8 // *
EasyCAT 0:31a727b65397 9 // This software is distributed as an example, in the hope that it could be useful, *
EasyCAT 0:31a727b65397 10 // WITHOUT ANY WARRANTY, even the implied warranty of FITNESS FOR A PARTICULAR PURPOSE *
EasyCAT 0:31a727b65397 11 // *
EasyCAT 0:31a727b65397 12 //********************************************************************************************
EasyCAT 0:31a727b65397 13
EasyCAT 0:31a727b65397 14
EasyCAT 1:1e7996e6c4a7 15 // revision 2 - moved "DigitalOut Led(LED1)"
EasyCAT 1:1e7996e6c4a7 16
EasyCAT 1:1e7996e6c4a7 17
EasyCAT 1:1e7996e6c4a7 18
EasyCAT 0:31a727b65397 19 //----- EasyCAT shield application basic example for mbed boards 170912 ----------------------
EasyCAT 0:31a727b65397 20 //----- Derived from the example project TestEasyCAT.ino for the AB&T EasyCAT Arduino shield
EasyCAT 0:31a727b65397 21
EasyCAT 0:31a727b65397 22 //----- Tested with the STM32 NUCLEO-F767ZI board --------------------------------------------
EasyCAT 0:31a727b65397 23
EasyCAT 0:31a727b65397 24
EasyCAT 0:31a727b65397 25
EasyCAT 0:31a727b65397 26 #include "mbed.h"
EasyCAT 0:31a727b65397 27 #include "EasyCAT.h" // EasyCAT library to interface the LAN9252
EasyCAT 0:31a727b65397 28
EasyCAT 0:31a727b65397 29
EasyCAT 0:31a727b65397 30 void Application (void);
EasyCAT 0:31a727b65397 31
EasyCAT 0:31a727b65397 32
EasyCAT 0:31a727b65397 33 EasyCAT EASYCAT; // EasyCAT istantiation
EasyCAT 0:31a727b65397 34
EasyCAT 0:31a727b65397 35 // The constructor allow us to choose the pin used for the EasyCAT SPI chip select
EasyCAT 0:31a727b65397 36 // Without any parameter pin 9 will be used
EasyCAT 0:31a727b65397 37
EasyCAT 0:31a727b65397 38 // for EasyCAT board REV_A we can choose between:
EasyCAT 0:31a727b65397 39 // 8, 9, 10
EasyCAT 0:31a727b65397 40 //
EasyCAT 0:31a727b65397 41 // for EasyCAT board REV_B we can choose between:
EasyCAT 0:31a727b65397 42 // 8, 9, 10, A5, 6, 7
EasyCAT 0:31a727b65397 43
EasyCAT 0:31a727b65397 44 // example:
EasyCAT 0:31a727b65397 45 //EasyCAT EASYCAT(8); // pin 8 will be used as SPI chip select
EasyCAT 0:31a727b65397 46
EasyCAT 0:31a727b65397 47
EasyCAT 0:31a727b65397 48 // The chip select chosen by the firmware must match the setting on the board
EasyCAT 0:31a727b65397 49
EasyCAT 0:31a727b65397 50 // On board REV_A the chip select is set soldering
EasyCAT 0:31a727b65397 51 // a 0 ohm resistor in the appropriate position
EasyCAT 0:31a727b65397 52
EasyCAT 0:31a727b65397 53 // On board REV_B the chip select is set
EasyCAT 0:31a727b65397 54 // througt a bank of jumpers
EasyCAT 0:31a727b65397 55
EasyCAT 0:31a727b65397 56
EasyCAT 0:31a727b65397 57
EasyCAT 0:31a727b65397 58 //---- pins declaration ------------------------------------------------------------------------------
EasyCAT 0:31a727b65397 59
EasyCAT 0:31a727b65397 60
EasyCAT 0:31a727b65397 61
EasyCAT 0:31a727b65397 62 AnalogIn Ana0(A0); // analog input 0
EasyCAT 0:31a727b65397 63 AnalogIn Ana1(A1); // analog input 1
EasyCAT 0:31a727b65397 64
EasyCAT 0:31a727b65397 65
EasyCAT 0:31a727b65397 66 DigitalOut Out_0(A2); // four bits output
EasyCAT 0:31a727b65397 67 DigitalOut Out_1(A3); //
EasyCAT 0:31a727b65397 68 DigitalOut Out_2(A4); //
EasyCAT 0:31a727b65397 69 DigitalOut Out_3(A5); //
EasyCAT 0:31a727b65397 70
EasyCAT 0:31a727b65397 71 DigitalIn In_0(D3); // four bits input
EasyCAT 0:31a727b65397 72 DigitalIn In_1(D5); //
EasyCAT 0:31a727b65397 73 DigitalIn In_2(D6); //
EasyCAT 0:31a727b65397 74 DigitalIn In_3(D7); //
EasyCAT 0:31a727b65397 75
EasyCAT 1:1e7996e6c4a7 76
EasyCAT 0:31a727b65397 77
EasyCAT 0:31a727b65397 78
EasyCAT 0:31a727b65397 79
EasyCAT 0:31a727b65397 80 //---- global variables ---------------------------------------------------------------------------
EasyCAT 0:31a727b65397 81
EasyCAT 0:31a727b65397 82
EasyCAT 0:31a727b65397 83 UWORD ContaUp; // used for sawthoot test generation
EasyCAT 0:31a727b65397 84 UWORD ContaDown; //
EasyCAT 0:31a727b65397 85
EasyCAT 0:31a727b65397 86 unsigned long Millis = 0;
EasyCAT 0:31a727b65397 87 unsigned long PreviousSaw = 0;
EasyCAT 0:31a727b65397 88 unsigned long PreviousCycle = 0;
EasyCAT 0:31a727b65397 89
EasyCAT 0:31a727b65397 90
EasyCAT 0:31a727b65397 91 //---- declarations for Arduino "millis()" emulation -----------------------
EasyCAT 0:31a727b65397 92
EasyCAT 0:31a727b65397 93 static Ticker uS_Tick;
EasyCAT 0:31a727b65397 94 static volatile uint32_t MillisVal = 0;
EasyCAT 0:31a727b65397 95
EasyCAT 0:31a727b65397 96 void InitMillis(void);
EasyCAT 0:31a727b65397 97 void mS_Tick(void);
EasyCAT 0:31a727b65397 98
EasyCAT 0:31a727b65397 99 inline static uint32_t millis (void)
EasyCAT 0:31a727b65397 100 {
EasyCAT 0:31a727b65397 101 return MillisVal;
EasyCAT 0:31a727b65397 102 };
EasyCAT 0:31a727b65397 103
EasyCAT 0:31a727b65397 104
EasyCAT 0:31a727b65397 105
EasyCAT 0:31a727b65397 106 //---------------------------------------------------------------------------------------------
EasyCAT 0:31a727b65397 107
EasyCAT 0:31a727b65397 108 int main(void)
EasyCAT 0:31a727b65397 109 {
EasyCAT 0:31a727b65397 110
EasyCAT 0:31a727b65397 111 printf ("\nEasyCAT - Generic EtherCAT slave\n"); // print the banner
EasyCAT 0:31a727b65397 112
EasyCAT 0:31a727b65397 113 InitMillis(); // init Arduino "millis()" emulation
EasyCAT 0:31a727b65397 114
EasyCAT 0:31a727b65397 115 ContaDown.Word = 0x0000;
EasyCAT 0:31a727b65397 116 ContaUp.Word = 0x0000;
EasyCAT 0:31a727b65397 117 //---- initialize the EasyCAT board -----
EasyCAT 0:31a727b65397 118
EasyCAT 0:31a727b65397 119 if (EASYCAT.Init() == true) // initialization
EasyCAT 0:31a727b65397 120 { // succesfully completed
EasyCAT 0:31a727b65397 121 printf ("initialized\n"); //
EasyCAT 0:31a727b65397 122 }
EasyCAT 0:31a727b65397 123
EasyCAT 0:31a727b65397 124 else // initialization failed
EasyCAT 0:31a727b65397 125 { // the EasyCAT board was not recognized
EasyCAT 0:31a727b65397 126 printf ("initialization failed\n"); //
EasyCAT 0:31a727b65397 127 // The most common reason is that the SPI
EasyCAT 0:31a727b65397 128 // chip select choosen on the board doesn't
EasyCAT 0:31a727b65397 129 // match the one choosen by the firmware
EasyCAT 1:1e7996e6c4a7 130
EasyCAT 1:1e7996e6c4a7 131 DigitalOut Led(LED1); //
EasyCAT 0:31a727b65397 132
EasyCAT 0:31a727b65397 133 while (1) // stay in loop for ever
EasyCAT 0:31a727b65397 134 { // with the led blinking
EasyCAT 0:31a727b65397 135 Led = 1; //
EasyCAT 0:31a727b65397 136 wait_ms(125); //
EasyCAT 0:31a727b65397 137 Led = 0; //
EasyCAT 0:31a727b65397 138 wait_ms(125); //
EasyCAT 0:31a727b65397 139 } //
EasyCAT 0:31a727b65397 140 }
EasyCAT 0:31a727b65397 141
EasyCAT 0:31a727b65397 142
EasyCAT 0:31a727b65397 143 while (1) //---- main loop ---------------------------
EasyCAT 0:31a727b65397 144 {
EasyCAT 0:31a727b65397 145 // In the main loop we must call ciclically the
EasyCAT 0:31a727b65397 146 // EasyCAT task and our application
EasyCAT 0:31a727b65397 147 //
EasyCAT 0:31a727b65397 148 // This allows the bidirectional exachange of the data
EasyCAT 0:31a727b65397 149 // between the EtherCAT master and our application
EasyCAT 0:31a727b65397 150 //
EasyCAT 0:31a727b65397 151 // The EasyCAT cycle and the Master cycle are asynchronous
EasyCAT 0:31a727b65397 152 //
EasyCAT 0:31a727b65397 153
EasyCAT 0:31a727b65397 154 // wait_ms(20); // Here we to set the EasyCAT cycle time
EasyCAT 0:31a727b65397 155 // according to the needs of our application
EasyCAT 0:31a727b65397 156 //
EasyCAT 0:31a727b65397 157 // For user interface applications a cycle time of 100mS,
EasyCAT 0:31a727b65397 158 // or even more, is appropriate, but, for data processing
EasyCAT 0:31a727b65397 159 // applications, a faster cycle time may be required
EasyCAT 0:31a727b65397 160 //
EasyCAT 0:31a727b65397 161 // In this case we can also completely eliminate this
EasyCAT 0:31a727b65397 162 // delay in order to obtain the fastest possible response
EasyCAT 0:31a727b65397 163
EasyCAT 0:31a727b65397 164
EasyCAT 0:31a727b65397 165 // Instead we can also use millis() to set the cycle time
EasyCAT 0:31a727b65397 166 //
EasyCAT 0:31a727b65397 167 // example:
EasyCAT 0:31a727b65397 168 Millis = millis(); //
EasyCAT 0:31a727b65397 169 if (Millis - PreviousCycle >= 10) // each 10 mS
EasyCAT 0:31a727b65397 170 { //
EasyCAT 0:31a727b65397 171 PreviousCycle = Millis; //
EasyCAT 0:31a727b65397 172
EasyCAT 0:31a727b65397 173 EASYCAT.MainTask(); // execute the EasyCAT task
EasyCAT 0:31a727b65397 174
EasyCAT 0:31a727b65397 175 Application(); // execute the user application
EasyCAT 0:31a727b65397 176 }
EasyCAT 0:31a727b65397 177 }
EasyCAT 0:31a727b65397 178 }
EasyCAT 0:31a727b65397 179
EasyCAT 0:31a727b65397 180
EasyCAT 0:31a727b65397 181 //---- user application ------------------------------------------------------------------------------
EasyCAT 0:31a727b65397 182
EasyCAT 0:31a727b65397 183 void Application (void)
EasyCAT 0:31a727b65397 184
EasyCAT 0:31a727b65397 185 {
EasyCAT 0:31a727b65397 186 float Analog;
EasyCAT 0:31a727b65397 187 // --- analog inputs management ---
EasyCAT 0:31a727b65397 188 //
EasyCAT 0:31a727b65397 189 Analog = Ana0.read(); // read analog input 0
EasyCAT 0:31a727b65397 190 Analog = Analog * 255; // normalize it on 8 bits
EasyCAT 0:31a727b65397 191 EASYCAT.BufferIn.Byte[0] = (uint8_t)Analog; // and put the result into
EasyCAT 0:31a727b65397 192 // input Byte 0
EasyCAT 0:31a727b65397 193
EasyCAT 0:31a727b65397 194 Analog = Ana1.read(); // read analog input 1
EasyCAT 0:31a727b65397 195 Analog = Analog * 255; // normalize it on 8 bits
EasyCAT 0:31a727b65397 196 EASYCAT.BufferIn.Byte[1] = (uint8_t)Analog; // and put the result into
EasyCAT 0:31a727b65397 197 // input Byte 1
EasyCAT 0:31a727b65397 198
EasyCAT 0:31a727b65397 199
EasyCAT 0:31a727b65397 200 // --- four output bits management ----
EasyCAT 0:31a727b65397 201 //
EasyCAT 0:31a727b65397 202 if (EASYCAT.BufferOut.Byte[0] & 0b00000001) // the four output bits are mapped to the
EasyCAT 0:31a727b65397 203 Out_0 = 1; // lower nibble of output Byte 0
EasyCAT 0:31a727b65397 204 else //
EasyCAT 0:31a727b65397 205 Out_0 = 0; //
EasyCAT 0:31a727b65397 206 //
EasyCAT 0:31a727b65397 207 if (EASYCAT.BufferOut.Byte[0] & (1<<0)) //
EasyCAT 0:31a727b65397 208 Out_0 = 1; //
EasyCAT 0:31a727b65397 209 else //
EasyCAT 0:31a727b65397 210 Out_0 = 0; //
EasyCAT 0:31a727b65397 211 //
EasyCAT 0:31a727b65397 212 if (EASYCAT.BufferOut.Byte[0] & (1<<1)) //
EasyCAT 0:31a727b65397 213 Out_1 = 1; //
EasyCAT 0:31a727b65397 214 else //
EasyCAT 0:31a727b65397 215 Out_1 = 0; //
EasyCAT 0:31a727b65397 216 //
EasyCAT 0:31a727b65397 217 if (EASYCAT.BufferOut.Byte[0] & (1<<2)) //
EasyCAT 0:31a727b65397 218 Out_2 = 1; //
EasyCAT 0:31a727b65397 219 else //
EasyCAT 0:31a727b65397 220 Out_2 = 0; //
EasyCAT 0:31a727b65397 221 //
EasyCAT 0:31a727b65397 222 if (EASYCAT.BufferOut.Byte[0] & (1<<3)) //
EasyCAT 0:31a727b65397 223 Out_3 = 1; //
EasyCAT 0:31a727b65397 224 else //
EasyCAT 0:31a727b65397 225 Out_3 = 0; //
EasyCAT 0:31a727b65397 226
EasyCAT 0:31a727b65397 227 //--- four input bits management ---
EasyCAT 0:31a727b65397 228 //
EasyCAT 0:31a727b65397 229 EASYCAT.BufferIn.Byte[6] = 0x00; // the four input pins are mapped to the
EasyCAT 0:31a727b65397 230 if (!In_0) // lower nibble of input Byte 6
EasyCAT 0:31a727b65397 231 EASYCAT.BufferIn.Byte[6] |= 0b00000001; //
EasyCAT 0:31a727b65397 232 if (!In_1) //
EasyCAT 0:31a727b65397 233 EASYCAT.BufferIn.Byte[6] |= 0b00000010; //
EasyCAT 0:31a727b65397 234 if (!In_2) //
EasyCAT 0:31a727b65397 235 EASYCAT.BufferIn.Byte[6] |= 0b00000100; //
EasyCAT 0:31a727b65397 236 if (!In_3) //
EasyCAT 0:31a727b65397 237 EASYCAT.BufferIn.Byte[6] |= 0b00001000; //
EasyCAT 0:31a727b65397 238
EasyCAT 0:31a727b65397 239
EasyCAT 0:31a727b65397 240 // --- test sawtooth generation ---
EasyCAT 0:31a727b65397 241 //
EasyCAT 0:31a727b65397 242 Millis = millis(); // each 100 mS
EasyCAT 0:31a727b65397 243
EasyCAT 0:31a727b65397 244 if (Millis - PreviousSaw >= 100) //
EasyCAT 0:31a727b65397 245 { //
EasyCAT 0:31a727b65397 246 PreviousSaw = Millis; //
EasyCAT 0:31a727b65397 247 //
EasyCAT 0:31a727b65397 248 ContaUp.Word++; // we increment the variable ContaUp
EasyCAT 0:31a727b65397 249 ContaDown.Word--; // and decrement ContaDown
EasyCAT 0:31a727b65397 250 } //
EasyCAT 0:31a727b65397 251
EasyCAT 0:31a727b65397 252 // we use these variables to create sawtooth,
EasyCAT 0:31a727b65397 253 // with different slopes and periods, for
EasyCAT 0:31a727b65397 254 // test pourpose, in input Bytes 2,3,4,5,30,31
EasyCAT 0:31a727b65397 255
EasyCAT 0:31a727b65397 256 EASYCAT.BufferIn.Byte[2] = ContaUp.Byte[0]; // slow rising slope
EasyCAT 0:31a727b65397 257 EASYCAT.BufferIn.Byte[3] = ContaUp.Byte[1]; // extremly slow rising slope
EasyCAT 0:31a727b65397 258
EasyCAT 0:31a727b65397 259 EASYCAT.BufferIn.Byte[4] = ContaDown.Byte[0]; // slow falling slope
EasyCAT 0:31a727b65397 260 EASYCAT.BufferIn.Byte[5] = ContaDown.Byte[1]; // extremly slow falling slope
EasyCAT 0:31a727b65397 261
EasyCAT 0:31a727b65397 262
EasyCAT 0:31a727b65397 263 EASYCAT.BufferIn.Byte[30] = ContaUp.Byte[0] << 2; // medium speed rising slope
EasyCAT 0:31a727b65397 264 EASYCAT.BufferIn.Byte[31] = ContaDown.Byte[0] << 2; // medium speed falling slope
EasyCAT 0:31a727b65397 265 }
EasyCAT 0:31a727b65397 266
EasyCAT 0:31a727b65397 267
EasyCAT 0:31a727b65397 268 //--- functions for Arduino "millis()" emulation -------------------------------------
EasyCAT 0:31a727b65397 269
EasyCAT 0:31a727b65397 270
EasyCAT 0:31a727b65397 271 void InitMillis(void)
EasyCAT 0:31a727b65397 272 {
EasyCAT 0:31a727b65397 273 uS_Tick.attach (&mS_Tick, 0.001);
EasyCAT 0:31a727b65397 274 }
EasyCAT 0:31a727b65397 275
EasyCAT 0:31a727b65397 276 void mS_Tick(void)
EasyCAT 0:31a727b65397 277 {
EasyCAT 0:31a727b65397 278 MillisVal++;
EasyCAT 0:31a727b65397 279 }