X-Git-Url: http://rtime.felk.cvut.cz/gitweb/mf624-simulink.git/blobdiff_plain/3426e8bcd6d22d6cee1203bbd2a63c3c55bd4009..13cde8a33f64c7b6d64c456a133efe6525e8a4a7:/sfAnalogInput.c diff --git a/sfAnalogInput.c b/sfAnalogInput.c index 9f7dd14..70e4ca9 100644 --- a/sfAnalogInput.c +++ b/sfAnalogInput.c @@ -1,8 +1,36 @@ /* - * (c) Michal Kreč, Czech Technical University in Prague, 2013 + * S-function to support analog inputs on Humusoft MF624 card + * + * Copyright (C) 2013 Michal Kreč + * Copyright (C) 2013 Michal Sojka + * + * Department of Control Engineering + * Faculty of Electrical Engineering + * Czech Technical University in Prague (CTU) + * + * The S-Function for ERT Linux can be distributed in compliance + * with GNU General Public License (GPL) version 2 or later. + * Other licence can negotiated with CTU. + * + * Next exception is granted in addition to GPL. + * Instantiating or linking compiled version of this code + * to produce an application image/executable, does not + * by itself cause the resulting application image/executable + * to be covered by the GNU General Public License. + * This exception does not however invalidate any other reasons + * why the executable file might be covered by the GNU Public License. + * Publication of enhanced or derived S-function files is required + * although. + * + * Linux ERT code is available from + * http://rtime.felk.cvut.cz/gitweb/ert_linux.git + * More CTU Linux target for Simulink components are available at + * http://lintarget.sourceforge.net/ + * + * sfuntmpl_basic.c by The MathWorks, Inc. has been used to accomplish + * required S-function structure. */ - /* * You must specify the S_FUNCTION_NAME as the name of your S-function * (i.e. replace sfuntmpl_basic with the name of your S-function). @@ -18,7 +46,11 @@ */ #include "simstruc.h" +#include + +#ifndef WITHOUT_HW #include "mf624_SIMULINK.h" +#endif /*WITHOUT_HW*/ /* Error handling @@ -147,26 +179,27 @@ static void mdlInitializeSampleTimes(SimStruct *S) */ static void mdlStart(SimStruct *S) { + + #ifndef WITHOUT_HW if (mf624_init(NULL) != 0) return; - + #endif /*WITHOUT_HW*/ + int ADCCMask = (int)MASK_PRM(S); if(ADCCMask > 255 || ADCCMask < 0) { ssSetErrorStatus(S,"Invalid parameter mask, set to 0-255"); } - + int ADCChannels = __builtin_popcount((uint32_t)ADCCMask); //Counts number of set bits in ADCCMask - + ssSetIWorkValue(S, 0, ADCChannels); - + #ifndef WITHOUT_HW mfst->ADC_enabled = ADCCMask; mfst->ADC_enabled &= 0xFF; - + mf624_write16(mfst->ADC_enabled, MFST2REG(mfst, 2, ADCTRL_reg)); - - - + #endif /*WITHOUT_HW*/ } #endif /* MDL_START */ @@ -184,35 +217,41 @@ static void mdlOutputs(SimStruct *S, int_T tid) real_T* y[ADCChannels]; int i; int res,res1; - + #ifndef WITHOUT_HW if (mf624_check(S) != 0) - return; + return; // Activate trigger to start conversion - mf624_read16(MFST2REG(mfst, 2, ADSTART_reg)); - + mf624_read16(MFST2REG(mfst, 2, ADSTART_reg)); + #endif /*WITHOUT_HW*/ + for(i=0; i < ADCChannels;i++){ y[i]=ssGetOutputPortSignal(S,i); } - + + #ifndef WITHOUT_HW // Check if conversion has finished - while((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) & GPIOC_EOLC_mask)) { - for (i = 0; i < 1000; i++) {} // small wait - } - - - for(i=1; i < ADCChannels;i+=2){ + while((mf624_read32(MFST2REG(mfst, 0, GPIOC_reg)) & GPIOC_EOLC_mask)) { + for (i = 0; i < 1000; i++) {} // small wait + } + + for(i=1; i < ADCChannels;i+=2){ res = mf624_read32(MFST2REG(mfst, 2, ADDATA0_reg)); res1= res >> 16; res = res & 0xFFFF; *y[i-1] = (real_T) (10.0 * ((int16_t) (res << 2)) / (double) 0x8000); *y[i] = (real_T) (10.0 * ((int16_t) (res1 << 2)) / (double) 0x8000); } - + if(i == ADCChannels){ res = mf624_read16(MFST2REG(mfst, 2, ADDATA0_reg)); *y[ADCChannels-1]=(real_T)(10.0 * ((int16_t) (res << 2)) / (double) 0x8000); } + #else /*WITHOUT_HW*/ + for(i=0; i < ADCChannels; i++){ + *y[i] = 0; + } + #endif /*WITHOUT_HW*/ } @@ -255,7 +294,9 @@ static void mdlOutputs(SimStruct *S, int_T tid) */ static void mdlTerminate(SimStruct *S) { + #ifndef WITHOUT_HW mf624_done(S); + #endif /*WITHOUT_HW*/ }