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

このライブラリについては、次のWebを参照してください。
http://mbed.org/users/suupen/code/SwAnalogInputLibraryExampleProgram/wiki/Homepage

Committer:
suupen
Date:
Sun Dec 22 09:05:06 2013 +0000
Revision:
1:3cdb536ed157
Parent:
0:ba027616fdf1
This library is used to perform the SW recognized by the analog port

Who changed what in which revision?

UserRevisionLine numberNew contents of line
suupen 0:ba027616fdf1 1 //======================================================================
suupen 0:ba027616fdf1 2 // SwAnalog.cpp
suupen 0:ba027616fdf1 3 //
suupen 0:ba027616fdf1 4 //
suupen 0:ba027616fdf1 5 //======================================================================
suupen 0:ba027616fdf1 6 #define _SWANALOG_C
suupen 0:ba027616fdf1 7
suupen 0:ba027616fdf1 8 #include "mbed.h"
suupen 0:ba027616fdf1 9 #include "SwAnalog.h"
suupen 0:ba027616fdf1 10
suupen 0:ba027616fdf1 11 //======================================================================
suupen 0:ba027616fdf1 12 // syokika
suupen 0:ba027616fdf1 13 //======================================================================
suupen 0:ba027616fdf1 14
suupen 0:ba027616fdf1 15 SwAnalog::SwAnalog(PinName adinput0, PinName adinput1, PinName adinput2, PinName adinput3, PinName adinput4,
suupen 0:ba027616fdf1 16 PinName adinput5
suupen 0:ba027616fdf1 17 ):
suupen 0:ba027616fdf1 18 _adinput0(adinput0), _adinput1(adinput1), _adinput2(adinput2), _adinput3(adinput3), _adinput4(adinput4),
suupen 0:ba027616fdf1 19 _adinput5(adinput5)
suupen 0:ba027616fdf1 20 {
suupen 0:ba027616fdf1 21
suupen 0:ba027616fdf1 22 //---------------------------------
suupen 0:ba027616fdf1 23 // touroku sareta Sw Suu wo kakunin
suupen 0:ba027616fdf1 24 //---------------------------------
suupen 0:ba027616fdf1 25 if(adinput0 != NC){D_swPinSuu = 1;}
suupen 0:ba027616fdf1 26 if(adinput1 != NC){D_swPinSuu = 2;}
suupen 0:ba027616fdf1 27 if(adinput2 != NC){D_swPinSuu = 3;}
suupen 0:ba027616fdf1 28 if(adinput3 != NC){D_swPinSuu = 4;}
suupen 0:ba027616fdf1 29 if(adinput4 != NC){D_swPinSuu = 5;}
suupen 0:ba027616fdf1 30
suupen 0:ba027616fdf1 31 if(adinput5 != NC){D_swPinSuu = 6;}
suupen 0:ba027616fdf1 32
suupen 0:ba027616fdf1 33
suupen 0:ba027616fdf1 34 // sw ninsiki syuki 10[ms]
suupen 0:ba027616fdf1 35 swCheckTimer.attach_us(this, &SwAnalog::input, Z_matchcycle);
suupen 0:ba027616fdf1 36
suupen 0:ba027616fdf1 37 }
suupen 0:ba027616fdf1 38
suupen 0:ba027616fdf1 39 //=================================================
suupen 0:ba027616fdf1 40 // analog input data wo sw data ni henkan
suupen 0:ba027616fdf1 41 //=================================================
suupen 0:ba027616fdf1 42 void SwAnalog::adInput(float ad, uint8_t swPinSuu){
suupen 0:ba027616fdf1 43 uint8_t ans = 0; // SW ninsikichi 2bit = sw2, 1bit = sw1, 0bit = sw0 0:OFF 1:ON
suupen 0:ba027616fdf1 44
suupen 0:ba027616fdf1 45
suupen 0:ba027616fdf1 46 // ad ninsikich kara sw jotai wo kakutei
suupen 0:ba027616fdf1 47
suupen 0:ba027616fdf1 48 if (ad <= Z_threshold0_1){ans = 0;}
suupen 0:ba027616fdf1 49 else if(ad <= Z_threshold1_2){ans = 1;}
suupen 0:ba027616fdf1 50 else if(ad <= Z_threshold2_3){ans = 2;}
suupen 0:ba027616fdf1 51 else if(ad <= Z_threshold3_4){ans = 3;}
suupen 0:ba027616fdf1 52 else if(ad <= Z_threshold4_5){ans = 4;}
suupen 0:ba027616fdf1 53 else if(ad <= Z_threshold5_6){ans = 5;}
suupen 0:ba027616fdf1 54 else if(ad <= Z_threshold6_7){ans = 6;}
suupen 0:ba027616fdf1 55 else {ans = 7;}
suupen 0:ba027616fdf1 56
suupen 0:ba027616fdf1 57
suupen 0:ba027616fdf1 58 B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 0] << 1) | (ans & 0x01) );
suupen 0:ba027616fdf1 59 B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 1] << 1) | ((ans & 0x02) >> 1));
suupen 0:ba027616fdf1 60 B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] = ((B_kariLevel[(swPinSuu * Z_swInNoMax) + 2] << 1) | ((ans & 0x04) >> 2));
suupen 0:ba027616fdf1 61 }
suupen 0:ba027616fdf1 62
suupen 0:ba027616fdf1 63 //==========================================
suupen 0:ba027616fdf1 64 // subeteno analog input port no sw ninsiki
suupen 0:ba027616fdf1 65 //==========================================
suupen 0:ba027616fdf1 66 void SwAnalog::input(void){
suupen 0:ba027616fdf1 67 // genzai level input
suupen 0:ba027616fdf1 68 switch(D_swPinSuu){
suupen 0:ba027616fdf1 69
suupen 0:ba027616fdf1 70 case 6:
suupen 0:ba027616fdf1 71 adInput(_adinput5, 5);
suupen 0:ba027616fdf1 72 //break;
suupen 0:ba027616fdf1 73 case 5:
suupen 0:ba027616fdf1 74 adInput(_adinput4, 4);
suupen 0:ba027616fdf1 75 //break;
suupen 0:ba027616fdf1 76 case 4:
suupen 0:ba027616fdf1 77 adInput(_adinput3, 3);
suupen 0:ba027616fdf1 78 //break;
suupen 0:ba027616fdf1 79 case 3:
suupen 0:ba027616fdf1 80 adInput(_adinput2, 2);
suupen 0:ba027616fdf1 81 //break;
suupen 0:ba027616fdf1 82 case 2:
suupen 0:ba027616fdf1 83 adInput(_adinput1, 1);
suupen 0:ba027616fdf1 84 //break;
suupen 0:ba027616fdf1 85 case 1:
suupen 0:ba027616fdf1 86 adInput(_adinput0, 0);
suupen 0:ba027616fdf1 87 //break;
suupen 0:ba027616fdf1 88 default:
suupen 0:ba027616fdf1 89 // nothing
suupen 0:ba027616fdf1 90 break;
suupen 0:ba027616fdf1 91 }
suupen 0:ba027616fdf1 92
suupen 0:ba027616fdf1 93 // kakutei Level kosin
suupen 0:ba027616fdf1 94 uint8_t kakutei = 0;
suupen 0:ba027616fdf1 95 for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
suupen 0:ba027616fdf1 96 for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
suupen 0:ba027616fdf1 97 uint8_t work = B_kariLevel[(swPinSuu * Z_swInNoMax) + swInNo] & Z_itchiPattern;
suupen 0:ba027616fdf1 98 if(work == 0x00){
suupen 0:ba027616fdf1 99 // off kakutei
suupen 0:ba027616fdf1 100 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
suupen 0:ba027616fdf1 101 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOff;
suupen 0:ba027616fdf1 102 kakutei = 1;
suupen 0:ba027616fdf1 103 }
suupen 0:ba027616fdf1 104 else if(work == Z_itchiPattern){
suupen 0:ba027616fdf1 105 // on kakutei
suupen 0:ba027616fdf1 106 D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] = D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo];
suupen 0:ba027616fdf1 107 D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] = Z_levelOn;
suupen 0:ba027616fdf1 108 kakutei = 1;
suupen 0:ba027616fdf1 109 }
suupen 0:ba027616fdf1 110 else{
suupen 0:ba027616fdf1 111 // nothing
suupen 0:ba027616fdf1 112 }
suupen 0:ba027616fdf1 113
suupen 0:ba027616fdf1 114 if(kakutei == 1){
suupen 0:ba027616fdf1 115 // edge kosin
suupen 0:ba027616fdf1 116 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn)){
suupen 0:ba027616fdf1 117 B_edgeOn[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
suupen 0:ba027616fdf1 118 }
suupen 0:ba027616fdf1 119 if((D_oldLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOn) && (D_nowLevel[(swPinSuu * Z_swInNoMax) + swInNo] == Z_levelOff)){
suupen 0:ba027616fdf1 120 B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeAri;
suupen 0:ba027616fdf1 121 }
suupen 0:ba027616fdf1 122 }
suupen 0:ba027616fdf1 123 }
suupen 0:ba027616fdf1 124 }
suupen 0:ba027616fdf1 125 }
suupen 0:ba027616fdf1 126
suupen 0:ba027616fdf1 127 //========================================
suupen 0:ba027616fdf1 128 // sw no ninsiki level ,edge data no kosin
suupen 0:ba027616fdf1 129 //========================================
suupen 0:ba027616fdf1 130 void SwAnalog::refreshEdgeData(void){
suupen 0:ba027616fdf1 131 for(uint8_t swPinSuu = 0; swPinSuu < D_swPinSuu; swPinSuu++){
suupen 0:ba027616fdf1 132 for(uint8_t swInNo = 0; swInNo < Z_swInNoMax; swInNo++){
suupen 0:ba027616fdf1 133 __disable_irq(); // Disable Interrupts
suupen 0:ba027616fdf1 134 D_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo];
suupen 0:ba027616fdf1 135 D_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo];
suupen 0:ba027616fdf1 136
suupen 0:ba027616fdf1 137 B_edgeOn [(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
suupen 0:ba027616fdf1 138 B_edgeOff[(swPinSuu * Z_swInNoMax) + swInNo] = Z_edgeNasi;
suupen 0:ba027616fdf1 139 __enable_irq(); // Enable Interrupts
suupen 0:ba027616fdf1 140 }
suupen 0:ba027616fdf1 141 }
suupen 0:ba027616fdf1 142 }
suupen 0:ba027616fdf1 143
suupen 0:ba027616fdf1 144 //===============================
suupen 0:ba027616fdf1 145 // sw no Off to On edge hantei
suupen 0:ba027616fdf1 146 //===============================
suupen 0:ba027616fdf1 147 uint8_t SwAnalog::checkEdgeOn(uint8_t swNo){
suupen 0:ba027616fdf1 148 uint8_t ans = 0;
suupen 0:ba027616fdf1 149
suupen 0:ba027616fdf1 150 if(D_edgeOn[swNo] == Z_edgeAri){
suupen 0:ba027616fdf1 151 ans = 1;
suupen 0:ba027616fdf1 152 }
suupen 0:ba027616fdf1 153
suupen 0:ba027616fdf1 154 return (ans);
suupen 0:ba027616fdf1 155 }
suupen 0:ba027616fdf1 156
suupen 0:ba027616fdf1 157 //===============================
suupen 0:ba027616fdf1 158 // sw no On to Off edge hantei
suupen 0:ba027616fdf1 159 //===============================
suupen 0:ba027616fdf1 160 uint8_t SwAnalog::checkEdgeOff(uint8_t swNo){
suupen 0:ba027616fdf1 161 uint8_t ans = 0;
suupen 0:ba027616fdf1 162
suupen 0:ba027616fdf1 163 if(D_edgeOff[swNo] == Z_edgeAri){
suupen 0:ba027616fdf1 164 ans = 1;
suupen 0:ba027616fdf1 165 }
suupen 0:ba027616fdf1 166
suupen 0:ba027616fdf1 167 return (ans);
suupen 0:ba027616fdf1 168 }
suupen 0:ba027616fdf1 169
suupen 0:ba027616fdf1 170 //==============================
suupen 0:ba027616fdf1 171 // sw no ninsiki level hantei
suupen 0:ba027616fdf1 172 //==============================
suupen 0:ba027616fdf1 173 uint8_t SwAnalog::checkLevel(uint8_t swNo){
suupen 0:ba027616fdf1 174 uint8_t ans = 0;
suupen 0:ba027616fdf1 175
suupen 0:ba027616fdf1 176 if(D_nowLevel[swNo] == Z_levelOn){
suupen 0:ba027616fdf1 177 ans = 1;
suupen 0:ba027616fdf1 178 }
suupen 0:ba027616fdf1 179
suupen 0:ba027616fdf1 180 return (ans);
suupen 0:ba027616fdf1 181 }