AB&T / Mbed 2 deprecated TestEasyCAT_SM_sync

Dependencies:   mbed EasyCAT_lib

Committer:
EasyCAT
Date:
Tue Sep 12 17:26:41 2017 +0000
Revision:
0:ec011e648d2e
Child:
1:a1411df7f601
first release

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