This library has been tested with LPC1768. I can use the analog port of six of p20 from p15 of the LPC1768.

Dependents:   SwAnalogInputLibraryExampleProgram

Fork of SwAnalog by suu pen

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SwAnalog.cpp Source File

SwAnalog.cpp

00001 //======================================================================
00002 //    SwAnalog.cpp
00003 //
00004 // 
00005 //======================================================================
00006 #define _SWANALOG_C
00007 
00008 #include "mbed.h"
00009 #include "SwAnalog.h"
00010 
00011 //======================================================================
00012 // syokika
00013 //======================================================================
00014 
00015     SwAnalog::SwAnalog(PinName adinput0, PinName adinput1, PinName adinput2, PinName adinput3, PinName adinput4,
00016                          PinName adinput5
00017                          ):
00018                          _adinput0(adinput0),   _adinput1(adinput1),   _adinput2(adinput2),   _adinput3(adinput3),   _adinput4(adinput4),
00019                          _adinput5(adinput5)
00020                          {
00021        
00022     //---------------------------------
00023     // touroku sareta Sw Suu wo kakunin
00024     //---------------------------------
00025     if(adinput0 != NC){D_swPinSuu = 1;}
00026     if(adinput1 != NC){D_swPinSuu = 2;}
00027     if(adinput2 != NC){D_swPinSuu = 3;}
00028     if(adinput3 != NC){D_swPinSuu = 4;}
00029     if(adinput4 != NC){D_swPinSuu = 5;}
00030     
00031     if(adinput5 != NC){D_swPinSuu = 6;}
00032     
00033     
00034     // sw ninsiki syuki 10[ms]
00035     swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle); 
00036         
00037 }
00038 
00039 //=================================================
00040 // analog input data wo sw data ni henkan
00041 //=================================================
00042 void SwAnalog::adInput(float ad, uint8_t swPinSuu){
00043     uint8_t ans = 0;    // SW ninsikichi   2bit = sw2, 1bit = sw1, 0bit = sw0  0:OFF 1:ON 
00044     
00045       
00046     // ad ninsikich kara sw jotai wo kakutei 
00047      
00048     if     (ad <= Z_threshold0_1){ans = 0;}
00049     else if(ad <= Z_threshold1_2){ans = 1;}
00050     else if(ad <= Z_threshold2_3){ans = 2;}
00051     else if(ad <= Z_threshold3_4){ans = 3;}
00052     else if(ad <= Z_threshold4_5){ans = 4;}
00053     else if(ad <= Z_threshold5_6){ans = 5;}
00054     else if(ad <= Z_threshold6_7){ans = 6;}
00055     else                         {ans = 7;}
00056     
00057 
00058     B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] << 1) |  (ans & 0x01)      );
00059     B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] << 1) | ((ans & 0x02) >> 1));
00060     B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] << 1) | ((ans & 0x04) >> 2));
00061 }
00062 
00063 //==========================================
00064 // subeteno analog input port no sw ninsiki
00065 //==========================================
00066 void SwAnalog::input(void){
00067     // genzai level input
00068     switch(D_swPinSuu){
00069 
00070     case 6:
00071         adInput(_adinput5, 5);
00072         //break;
00073     case 5:
00074         adInput(_adinput4, 4);
00075         //break;
00076     case 4:
00077         adInput(_adinput3, 3);
00078         //break;
00079     case 3:
00080         adInput(_adinput2, 2);
00081         //break;        
00082     case 2:
00083         adInput(_adinput1, 1);
00084         //break;        
00085     case 1:
00086         adInput(_adinput0, 0);
00087         //break;                       
00088     default:
00089         // nothing
00090         break;
00091     }
00092     
00093     // kakutei Level kosin
00094     uint8_t kakutei = 0;
00095     for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
00096         for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
00097             uint8_t work = B_kariLevel[(swPinSuu * Z_swInNoMax) + swInNo] & Z_itchiPattern;
00098             if(work == 0x00){
00099                 // off kakutei
00100                 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
00101                 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOff;
00102                 kakutei = 1;
00103             }
00104             else if(work == Z_itchiPattern){
00105                 // on kakutei
00106                 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
00107                 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOn;
00108                 kakutei = 1;
00109             }
00110             else{
00111                 // nothing
00112             }
00113         
00114             if(kakutei == 1){
00115                 // edge kosin
00116                 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn)){
00117                     B_edgeOn[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
00118                 }
00119                 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff)){
00120                     B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
00121                 }
00122             }
00123         }
00124     }              
00125 }
00126 
00127 //========================================
00128 // sw no ninsiki level ,edge data no kosin
00129 //========================================
00130 void SwAnalog::refreshEdgeData(void){
00131     for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
00132         for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
00133             __disable_irq();     // Disable Interrupts
00134             D_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo];
00135             D_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo];
00136         
00137             B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
00138             B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
00139             __enable_irq();     // Enable Interrupts
00140         }
00141     }
00142 }
00143 
00144 //===============================
00145 // sw no Off to On edge hantei
00146 //===============================
00147 uint8_t SwAnalog::checkEdgeOn(uint8_t swNo){
00148     uint8_t ans = 0;
00149     
00150     if(D_edgeOn[swNo] == Z_edgeAri){
00151         ans = 1;
00152     } 
00153 
00154     return (ans);
00155 }
00156 
00157 //===============================
00158 // sw no On to Off edge hantei
00159 //===============================
00160 uint8_t SwAnalog::checkEdgeOff(uint8_t swNo){
00161     uint8_t ans = 0;
00162     
00163     if(D_edgeOff[swNo] == Z_edgeAri){
00164         ans = 1;
00165     } 
00166 
00167     return (ans);
00168 }
00169 
00170 //==============================
00171 // sw no ninsiki level hantei
00172 //==============================
00173 uint8_t SwAnalog::checkLevel(uint8_t swNo){
00174     uint8_t ans = 0;
00175     
00176     if(D_nowLevel[swNo] == Z_levelOn){
00177         ans = 1;
00178     } 
00179 
00180     return (ans);
00181 }