トランジスタ技術2014年2月号に付属のI2C実験基板を黄mbed(LPC11U24)で動かしてみました。

Dependencies:   mbed

Committer:
y_notsu
Date:
Mon Jan 13 12:34:19 2014 +0000
Revision:
0:3a0493cd3408
????????2014?2???????mbed???????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
y_notsu 0:3a0493cd3408 1 #include "mbed.h"
y_notsu 0:3a0493cd3408 2 #include "ADT7410.h"
y_notsu 0:3a0493cd3408 3 #include "LPS331.h"
y_notsu 0:3a0493cd3408 4 #include <stdio.h>
y_notsu 0:3a0493cd3408 5 #include <stdlib.h>
y_notsu 0:3a0493cd3408 6
y_notsu 0:3a0493cd3408 7 #define AQM0802_ADDR 0x7c
y_notsu 0:3a0493cd3408 8 #define CMD 0x00
y_notsu 0:3a0493cd3408 9 #define DAT 0x40
y_notsu 0:3a0493cd3408 10
y_notsu 0:3a0493cd3408 11 DigitalOut myled(LED1);
y_notsu 0:3a0493cd3408 12 DigitalOut myled2(p29);
y_notsu 0:3a0493cd3408 13 I2C i2c(p28, p27);
y_notsu 0:3a0493cd3408 14
y_notsu 0:3a0493cd3408 15 void LocateLCD(int x, int y)
y_notsu 0:3a0493cd3408 16 {
y_notsu 0:3a0493cd3408 17
y_notsu 0:3a0493cd3408 18 // 8x2
y_notsu 0:3a0493cd3408 19 char cmd[2];
y_notsu 0:3a0493cd3408 20 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 21 cmd[1]=0x80 + y*0x40 + x;
y_notsu 0:3a0493cd3408 22 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 23
y_notsu 0:3a0493cd3408 24 }
y_notsu 0:3a0493cd3408 25
y_notsu 0:3a0493cd3408 26 void PutsLCD(char *buffer)
y_notsu 0:3a0493cd3408 27 {
y_notsu 0:3a0493cd3408 28
y_notsu 0:3a0493cd3408 29 while(*buffer != '\0')
y_notsu 0:3a0493cd3408 30 {
y_notsu 0:3a0493cd3408 31 char cmd[2];
y_notsu 0:3a0493cd3408 32 cmd[0]=DAT;
y_notsu 0:3a0493cd3408 33 cmd[1]=*buffer;
y_notsu 0:3a0493cd3408 34 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 35 buffer++;
y_notsu 0:3a0493cd3408 36 }
y_notsu 0:3a0493cd3408 37
y_notsu 0:3a0493cd3408 38 }
y_notsu 0:3a0493cd3408 39
y_notsu 0:3a0493cd3408 40
y_notsu 0:3a0493cd3408 41 int main() {
y_notsu 0:3a0493cd3408 42
y_notsu 0:3a0493cd3408 43 char msg[10];
y_notsu 0:3a0493cd3408 44 int temp;
y_notsu 0:3a0493cd3408 45 int l;
y_notsu 0:3a0493cd3408 46 long press;
y_notsu 0:3a0493cd3408 47 char cmd[2];
y_notsu 0:3a0493cd3408 48 char recv[10];
y_notsu 0:3a0493cd3408 49
y_notsu 0:3a0493cd3408 50 // set 16bit resolution of ADT7410
y_notsu 0:3a0493cd3408 51
y_notsu 0:3a0493cd3408 52 cmd[0] = ADT7410_CONFIG;
y_notsu 0:3a0493cd3408 53 cmd[1] = 0xC0;
y_notsu 0:3a0493cd3408 54 i2c.write(ADT7410_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 55
y_notsu 0:3a0493cd3408 56 // Power ON Cycle=1Hz of LPS331
y_notsu 0:3a0493cd3408 57 cmd[0]=LPS331_CTRL_REG1;
y_notsu 0:3a0493cd3408 58 cmd[1]=0x90;
y_notsu 0:3a0493cd3408 59 i2c.write(LPS331_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 60
y_notsu 0:3a0493cd3408 61 //init LCD
y_notsu 0:3a0493cd3408 62 // Wait 40ms
y_notsu 0:3a0493cd3408 63 wait_ms(40);
y_notsu 0:3a0493cd3408 64 // Function set = 0x38
y_notsu 0:3a0493cd3408 65 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 66 cmd[1]=0x38;
y_notsu 0:3a0493cd3408 67 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 68 // Wait 26.3us
y_notsu 0:3a0493cd3408 69 wait_us(26.3);
y_notsu 0:3a0493cd3408 70 // Function set = 0x39
y_notsu 0:3a0493cd3408 71 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 72 cmd[1]=0x39;
y_notsu 0:3a0493cd3408 73 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 74 // Wait 26.3us
y_notsu 0:3a0493cd3408 75 wait_us(26.3);
y_notsu 0:3a0493cd3408 76 // Internal OSC frequency = 0x14
y_notsu 0:3a0493cd3408 77 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 78 cmd[1]=0x14;
y_notsu 0:3a0493cd3408 79 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 80 // Wait 26.3us
y_notsu 0:3a0493cd3408 81 wait_us(26.3);
y_notsu 0:3a0493cd3408 82 // Contrast set = 0x70
y_notsu 0:3a0493cd3408 83 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 84 cmd[1]=0x70;
y_notsu 0:3a0493cd3408 85 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 86 // Wait 26.3us
y_notsu 0:3a0493cd3408 87 wait_us(26.3);
y_notsu 0:3a0493cd3408 88 // Power/ICON/Contrast control = 0x56
y_notsu 0:3a0493cd3408 89 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 90 cmd[1]=0x56;
y_notsu 0:3a0493cd3408 91 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 92 // Wait 26.3us
y_notsu 0:3a0493cd3408 93 wait_us(26.3);
y_notsu 0:3a0493cd3408 94 // Follower control = 0x6C
y_notsu 0:3a0493cd3408 95 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 96 cmd[1]=0x6C;
y_notsu 0:3a0493cd3408 97 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 98 // Wait 200ms
y_notsu 0:3a0493cd3408 99 wait_ms(200);
y_notsu 0:3a0493cd3408 100 // Function set = 0x38
y_notsu 0:3a0493cd3408 101 cmd[1]=0x38;
y_notsu 0:3a0493cd3408 102 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 103 // Wait 26.3us
y_notsu 0:3a0493cd3408 104 wait_us(26.3);
y_notsu 0:3a0493cd3408 105 // Display ON/OFF control = 0x0C
y_notsu 0:3a0493cd3408 106 cmd[1]=0x0C;
y_notsu 0:3a0493cd3408 107 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 108 // Wait 26.3us
y_notsu 0:3a0493cd3408 109 wait_us(26.3);
y_notsu 0:3a0493cd3408 110 // Clear Display = 0x01
y_notsu 0:3a0493cd3408 111 cmd[1]=0x01;
y_notsu 0:3a0493cd3408 112 i2c.write( AQM0802_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 113 // Wait 1.08ms
y_notsu 0:3a0493cd3408 114 wait_ms(1.08);
y_notsu 0:3a0493cd3408 115
y_notsu 0:3a0493cd3408 116 #define PCF8591_ADDR 0x92
y_notsu 0:3a0493cd3408 117 #define M24LC64_ADDR 0xA0
y_notsu 0:3a0493cd3408 118 #define EEPROM
y_notsu 0:3a0493cd3408 119 #define ADC
y_notsu 0:3a0493cd3408 120 #define TEMP
y_notsu 0:3a0493cd3408 121 #define BAR
y_notsu 0:3a0493cd3408 122
y_notsu 0:3a0493cd3408 123 while(1)
y_notsu 0:3a0493cd3408 124 {
y_notsu 0:3a0493cd3408 125
y_notsu 0:3a0493cd3408 126
y_notsu 0:3a0493cd3408 127 #ifdef EEPROM
y_notsu 0:3a0493cd3408 128
y_notsu 0:3a0493cd3408 129 // Clear Display = 0x01
y_notsu 0:3a0493cd3408 130 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 131 cmd[1]=0x01;
y_notsu 0:3a0493cd3408 132 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 133 // Wait 2ms
y_notsu 0:3a0493cd3408 134 wait_ms(2);
y_notsu 0:3a0493cd3408 135 // EEPROM 0x0002=0x5A
y_notsu 0:3a0493cd3408 136 char EEPROM_CMD[3];
y_notsu 0:3a0493cd3408 137 EEPROM_CMD[0]=0x00;
y_notsu 0:3a0493cd3408 138 EEPROM_CMD[1]=0x02;
y_notsu 0:3a0493cd3408 139 EEPROM_CMD[2]=0x5A;
y_notsu 0:3a0493cd3408 140 i2c.write(M24LC64_ADDR,EEPROM_CMD,3);
y_notsu 0:3a0493cd3408 141 wait_us(131.5);
y_notsu 0:3a0493cd3408 142
y_notsu 0:3a0493cd3408 143 //for(l=0;l<0x1FFF;l++){
y_notsu 0:3a0493cd3408 144 for(l=0;l<0x10;l++){
y_notsu 0:3a0493cd3408 145 // EEPROM for 24LC64
y_notsu 0:3a0493cd3408 146 EEPROM_CMD[0]=l>>8;
y_notsu 0:3a0493cd3408 147 EEPROM_CMD[1]=l&0xFF;
y_notsu 0:3a0493cd3408 148 i2c.write(M24LC64_ADDR,EEPROM_CMD,2);
y_notsu 0:3a0493cd3408 149 i2c.read(M24LC64_ADDR,EEPROM_CMD,1);
y_notsu 0:3a0493cd3408 150 temp=EEPROM_CMD[0];
y_notsu 0:3a0493cd3408 151 LocateLCD(0,0);
y_notsu 0:3a0493cd3408 152 PutsLCD("ADR=");
y_notsu 0:3a0493cd3408 153 //itoa(l,msg,16);
y_notsu 0:3a0493cd3408 154 sprintf(msg,"%x",l);
y_notsu 0:3a0493cd3408 155 PutsLCD(msg);
y_notsu 0:3a0493cd3408 156 LocateLCD(0,1);
y_notsu 0:3a0493cd3408 157 PutsLCD("DAT=");
y_notsu 0:3a0493cd3408 158 //itoa(temp,msg,16);
y_notsu 0:3a0493cd3408 159 sprintf(msg,"%x",temp);
y_notsu 0:3a0493cd3408 160 PutsLCD(msg);
y_notsu 0:3a0493cd3408 161 PutsLCD(" ");
y_notsu 0:3a0493cd3408 162 myled2=1;
y_notsu 0:3a0493cd3408 163 wait_ms(100);
y_notsu 0:3a0493cd3408 164 myled2=0;
y_notsu 0:3a0493cd3408 165 wait_ms(1000);
y_notsu 0:3a0493cd3408 166 }
y_notsu 0:3a0493cd3408 167 #endif
y_notsu 0:3a0493cd3408 168
y_notsu 0:3a0493cd3408 169
y_notsu 0:3a0493cd3408 170 #ifdef ADC
y_notsu 0:3a0493cd3408 171 // Clear Display = 0x01
y_notsu 0:3a0493cd3408 172 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 173 cmd[1]=0x01;
y_notsu 0:3a0493cd3408 174 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 175 // Wait 2ms
y_notsu 0:3a0493cd3408 176 wait_ms(2);
y_notsu 0:3a0493cd3408 177 // A/D for PCF8591
y_notsu 0:3a0493cd3408 178 //GetI2C(0x40, PCF8591_ADDR); // ch0 with D/A enable
y_notsu 0:3a0493cd3408 179 cmd[0]=0x40;
y_notsu 0:3a0493cd3408 180 i2c.write(PCF8591_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 181 i2c.read(PCF8591_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 182 // GetI2C(0x01, PCF8591_ADDR); // ch1
y_notsu 0:3a0493cd3408 183 // GetI2C(0x02, PCF8591_ADDR); // ch2
y_notsu 0:3a0493cd3408 184 // GetI2C(0x03, PCF8591_ADDR); // ch3
y_notsu 0:3a0493cd3408 185 temp=cmd[0];
y_notsu 0:3a0493cd3408 186 //itoa(temp,msg,10);
y_notsu 0:3a0493cd3408 187 sprintf(msg,"%d",temp);
y_notsu 0:3a0493cd3408 188 LocateLCD(0,0);
y_notsu 0:3a0493cd3408 189 PutsLCD("A/D=");
y_notsu 0:3a0493cd3408 190 PutsLCD(msg);
y_notsu 0:3a0493cd3408 191 PutsLCD(" ");
y_notsu 0:3a0493cd3408 192 myled2=1;
y_notsu 0:3a0493cd3408 193 // D/A for PCF8591
y_notsu 0:3a0493cd3408 194 //PutI2C(0x40, temp, PCF8591_ADDR);
y_notsu 0:3a0493cd3408 195 cmd[0]=0x40;
y_notsu 0:3a0493cd3408 196 cmd[1]=temp;
y_notsu 0:3a0493cd3408 197 i2c.write(PCF8591_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 198 wait_ms(1000);
y_notsu 0:3a0493cd3408 199 myled2=0;
y_notsu 0:3a0493cd3408 200 wait_ms(1000);
y_notsu 0:3a0493cd3408 201 #endif
y_notsu 0:3a0493cd3408 202
y_notsu 0:3a0493cd3408 203 #ifdef TEMP
y_notsu 0:3a0493cd3408 204 // Temperature
y_notsu 0:3a0493cd3408 205 // RDY?
y_notsu 0:3a0493cd3408 206 // Clear Display = 0x01
y_notsu 0:3a0493cd3408 207 cmd[0]=CMD;
y_notsu 0:3a0493cd3408 208 cmd[1]=0x01;
y_notsu 0:3a0493cd3408 209 i2c.write(AQM0802_ADDR,cmd,2);
y_notsu 0:3a0493cd3408 210 // Wait 2ms
y_notsu 0:3a0493cd3408 211 wait_ms(2);
y_notsu 0:3a0493cd3408 212 do{
y_notsu 0:3a0493cd3408 213 //GetI2C(ADT7410_STATUS, ADT7410_ADDR);
y_notsu 0:3a0493cd3408 214
y_notsu 0:3a0493cd3408 215 cmd[0]=ADT7410_STATUS;
y_notsu 0:3a0493cd3408 216
y_notsu 0:3a0493cd3408 217 i2c.write(ADT7410_ADDR, cmd,1);
y_notsu 0:3a0493cd3408 218 i2c.read(ADT7410_ADDR, recv,1);
y_notsu 0:3a0493cd3408 219 temp=recv[0];
y_notsu 0:3a0493cd3408 220 }while(temp & 0x80);
y_notsu 0:3a0493cd3408 221
y_notsu 0:3a0493cd3408 222 // get temp_high
y_notsu 0:3a0493cd3408 223 cmd[0]=ADT7410_TEMP_H;
y_notsu 0:3a0493cd3408 224 i2c.write(ADT7410_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 225 i2c.read(ADT7410_ADDR,recv,1);
y_notsu 0:3a0493cd3408 226 temp=recv[0]*0x100;
y_notsu 0:3a0493cd3408 227 // get temp_low
y_notsu 0:3a0493cd3408 228 cmd[0]=ADT7410_TEMP_L;
y_notsu 0:3a0493cd3408 229 i2c.write(ADT7410_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 230 i2c.read(ADT7410_ADDR,recv,1);
y_notsu 0:3a0493cd3408 231 temp+=recv[0];
y_notsu 0:3a0493cd3408 232 // temp/=128; // for C
y_notsu 0:3a0493cd3408 233 temp/=13;
y_notsu 0:3a0493cd3408 234 //itoa(temp,msg,10);
y_notsu 0:3a0493cd3408 235 sprintf(msg,"%d",temp);
y_notsu 0:3a0493cd3408 236 l=strlen(msg);
y_notsu 0:3a0493cd3408 237 msg[l]=msg[l-1];
y_notsu 0:3a0493cd3408 238 msg[l-1]='.';
y_notsu 0:3a0493cd3408 239 msg[l+1]=0;
y_notsu 0:3a0493cd3408 240 LocateLCD(0,0);
y_notsu 0:3a0493cd3408 241 PutsLCD(msg);
y_notsu 0:3a0493cd3408 242 PutsLCD("C ");
y_notsu 0:3a0493cd3408 243 myled2=1;
y_notsu 0:3a0493cd3408 244 wait_ms(1000);
y_notsu 0:3a0493cd3408 245 #endif
y_notsu 0:3a0493cd3408 246
y_notsu 0:3a0493cd3408 247 #ifdef BAR
y_notsu 0:3a0493cd3408 248 // Barometer
y_notsu 0:3a0493cd3408 249 // get press_high
y_notsu 0:3a0493cd3408 250 cmd[0]=LPS331_PRESS_OUT_H;
y_notsu 0:3a0493cd3408 251 i2c.write(LPS331_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 252 i2c.read(LPS331_ADDR,recv,1);
y_notsu 0:3a0493cd3408 253 press=recv[0]*0x10000;
y_notsu 0:3a0493cd3408 254 // get tpress_low
y_notsu 0:3a0493cd3408 255 cmd[0]=LPS331_PRESS_OUT_L;
y_notsu 0:3a0493cd3408 256 i2c.write(LPS331_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 257 i2c.read(LPS331_ADDR,recv,1);
y_notsu 0:3a0493cd3408 258 press+=recv[0]*0x100;
y_notsu 0:3a0493cd3408 259 // get press_xl
y_notsu 0:3a0493cd3408 260 cmd[0]=LPS331_PRESS_POUT_XL_REH;
y_notsu 0:3a0493cd3408 261 i2c.write(LPS331_ADDR,cmd,1);
y_notsu 0:3a0493cd3408 262 i2c.read(LPS331_ADDR,recv,1);
y_notsu 0:3a0493cd3408 263 press+=recv[0];
y_notsu 0:3a0493cd3408 264 // press/=4096; // for hPa
y_notsu 0:3a0493cd3408 265 press/=41;
y_notsu 0:3a0493cd3408 266 //itoa(press,msg,10);
y_notsu 0:3a0493cd3408 267 sprintf(msg,"%d",press);
y_notsu 0:3a0493cd3408 268 LocateLCD(0,1);
y_notsu 0:3a0493cd3408 269 PutsLCD(msg);
y_notsu 0:3a0493cd3408 270 PutsLCD("Pa ");
y_notsu 0:3a0493cd3408 271 myled2=0;
y_notsu 0:3a0493cd3408 272 wait_ms(1000);
y_notsu 0:3a0493cd3408 273 #endif
y_notsu 0:3a0493cd3408 274
y_notsu 0:3a0493cd3408 275 }
y_notsu 0:3a0493cd3408 276
y_notsu 0:3a0493cd3408 277 }
y_notsu 0:3a0493cd3408 278