EasyCAT test with SM synchronization - 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_SM_sync program is a basic example that shows how to excange some I/O between the EtherCAT master and the EasyCAT slave, using the Synchronization Manager synchronization.

Import programTestEasyCAT_SM_sync

EasyCAT test with SM synchronization - EtherCAT slave example

Import libraryEasyCAT_lib

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

Committer:
EasyCAT
Date:
Wed Jan 09 09:40:53 2019 +0000
Revision:
1:a1411df7f601
Parent:
0:ec011e648d2e
revision 2 - moved  "DigitalOut Led(LED1)"

Who changed what in which revision?

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