Test software for PCF8591 and SAA1064

Dependencies:   PCF8591 SAA1064 mbed

Committer:
wim
Date:
Mon Sep 23 19:24:28 2013 +0000
Revision:
0:cbacd2d41523
Child:
1:7dd6c7104fef
First release of PCF8591 Test software

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:cbacd2d41523 1 #include "mbed.h"
wim 0:cbacd2d41523 2 #include "SAA1064.h"
wim 0:cbacd2d41523 3 #include "PCF8591.h"
wim 0:cbacd2d41523 4
wim 0:cbacd2d41523 5 #define lpc812 1
wim 0:cbacd2d41523 6 #define lpc1768 0
wim 0:cbacd2d41523 7
wim 0:cbacd2d41523 8 //DigitalOut myled1(LED1);
wim 0:cbacd2d41523 9 DigitalOut heartbeatLED(LED1);
wim 0:cbacd2d41523 10
wim 0:cbacd2d41523 11 //Pin Defines for I2C Bus
wim 0:cbacd2d41523 12
wim 0:cbacd2d41523 13 #if (lpc1768)
wim 0:cbacd2d41523 14 // SDA, SCL for LPC1768
wim 0:cbacd2d41523 15 #define D_SDA p28
wim 0:cbacd2d41523 16 #define D_SCL p27
wim 0:cbacd2d41523 17 #endif
wim 0:cbacd2d41523 18
wim 0:cbacd2d41523 19 #if (lpc812)
wim 0:cbacd2d41523 20 // SDA, SCL for LPC812
wim 0:cbacd2d41523 21 #define D_SDA P0_10
wim 0:cbacd2d41523 22 #define D_SCL P0_11
wim 0:cbacd2d41523 23 #endif
wim 0:cbacd2d41523 24
wim 0:cbacd2d41523 25 //I2C Bus
wim 0:cbacd2d41523 26 I2C i2c_bus(D_SDA, D_SCL);
wim 0:cbacd2d41523 27
wim 0:cbacd2d41523 28
wim 0:cbacd2d41523 29 //SAA1064 LED(&i2c_bus, SAA1064_SA0);
wim 0:cbacd2d41523 30 SAA1064 LED(&i2c_bus);
wim 0:cbacd2d41523 31
wim 0:cbacd2d41523 32 //PCF8591 adc_dac(&i2c_bus, PCF8591_SA0);
wim 0:cbacd2d41523 33 PCF8591 adc_dac(&i2c_bus);
wim 0:cbacd2d41523 34
wim 0:cbacd2d41523 35 PCF8591_AnalogOut anaOut(&i2c_bus);
wim 0:cbacd2d41523 36
wim 0:cbacd2d41523 37 PCF8591_AnalogIn anaIn(&i2c_bus, PCF8591_ADC1);
wim 0:cbacd2d41523 38
wim 0:cbacd2d41523 39
wim 0:cbacd2d41523 40 //Host PC Baudrate (Virtual Com Port on USB)
wim 0:cbacd2d41523 41 #define D_BAUDRATE 9600
wim 0:cbacd2d41523 42 //#define D_BAUDRATE 57600
wim 0:cbacd2d41523 43
wim 0:cbacd2d41523 44 // Host PC Communication channels
wim 0:cbacd2d41523 45 #if (lpc1768)
wim 0:cbacd2d41523 46 Serial pc(USBTX, USBRX); // tx, rx for mbed LPC800 MAX
wim 0:cbacd2d41523 47 #endif
wim 0:cbacd2d41523 48
wim 0:cbacd2d41523 49 #if (lpc812)
wim 0:cbacd2d41523 50 Serial pc(P0_4, P0_0); // tx, rx for LPC812 LPCXpresso
wim 0:cbacd2d41523 51 #endif
wim 0:cbacd2d41523 52
wim 0:cbacd2d41523 53 // Variables for Heartbeat and Status monitoring
wim 0:cbacd2d41523 54 Ticker heartbeat;
wim 0:cbacd2d41523 55 bool heartbeatflag=false;
wim 0:cbacd2d41523 56
wim 0:cbacd2d41523 57 // Cycle Timer
wim 0:cbacd2d41523 58 //const int maxcount = 1000;
wim 0:cbacd2d41523 59
wim 0:cbacd2d41523 60 // Local functions
wim 0:cbacd2d41523 61 void clear_screen() {
wim 0:cbacd2d41523 62 //ANSI Terminal Commands
wim 0:cbacd2d41523 63 // pc.printf("\x1B[2J");
wim 0:cbacd2d41523 64 // pc.printf("\x1B[H");
wim 0:cbacd2d41523 65 }
wim 0:cbacd2d41523 66
wim 0:cbacd2d41523 67
wim 0:cbacd2d41523 68 void init_interfaces() {
wim 0:cbacd2d41523 69 // Init Host PC communication, default is 9600
wim 0:cbacd2d41523 70 //pc.baud(D_BAUDRATE);
wim 0:cbacd2d41523 71
wim 0:cbacd2d41523 72 // Init I/F hardware
wim 0:cbacd2d41523 73 i2c_bus.frequency(100000);
wim 0:cbacd2d41523 74
wim 0:cbacd2d41523 75 // Init LEDs off
wim 0:cbacd2d41523 76 heartbeatLED = 1;
wim 0:cbacd2d41523 77 }
wim 0:cbacd2d41523 78
wim 0:cbacd2d41523 79 // Heartbeat monitor
wim 0:cbacd2d41523 80 void pulse() {
wim 0:cbacd2d41523 81 heartbeatLED = !heartbeatLED;
wim 0:cbacd2d41523 82 }
wim 0:cbacd2d41523 83
wim 0:cbacd2d41523 84 void heartbeat_start() {
wim 0:cbacd2d41523 85 heartbeat.attach(&pulse, 0.5);
wim 0:cbacd2d41523 86 }
wim 0:cbacd2d41523 87
wim 0:cbacd2d41523 88 void heartbeat_stop() {
wim 0:cbacd2d41523 89 heartbeat.detach();
wim 0:cbacd2d41523 90 }
wim 0:cbacd2d41523 91
wim 0:cbacd2d41523 92
wim 0:cbacd2d41523 93 int main() {
wim 0:cbacd2d41523 94 uint8_t slave_address = 0x40; //PCF8574
wim 0:cbacd2d41523 95 char buf[128];
wim 0:cbacd2d41523 96 uint8_t count = 0;
wim 0:cbacd2d41523 97 uint8_t analog;
wim 0:cbacd2d41523 98
wim 0:cbacd2d41523 99 init_interfaces();
wim 0:cbacd2d41523 100
wim 0:cbacd2d41523 101 //heartbeat_start();
wim 0:cbacd2d41523 102
wim 0:cbacd2d41523 103 clear_screen();
wim 0:cbacd2d41523 104
wim 0:cbacd2d41523 105 pc.printf("\r\nHello World from LPC812\r\n");
wim 0:cbacd2d41523 106
wim 0:cbacd2d41523 107 LED.write(SAA1064_SEGM[0], SAA1064_SEGM[1], SAA1064_SEGM[2], SAA1064_SEGM[3]);
wim 0:cbacd2d41523 108 // LED.write(SAA1064_SEGM[4], SAA1064_SEGM[5], SAA1064_SEGM[6], SAA1064_SEGM[7]);
wim 0:cbacd2d41523 109 // LED.write(SAA1064_SEGM[8], SAA1064_SEGM[9], SAA1064_SEGM[0x0A], SAA1064_SEGM[0x0B]);
wim 0:cbacd2d41523 110 // LED.write(SAA1064_SEGM[0x0C], SAA1064_SEGM[0x0D], SAA1064_SEGM[0x0E], SAA1064_SEGM[0x0F]);
wim 0:cbacd2d41523 111
wim 0:cbacd2d41523 112 wait(1.0);
wim 0:cbacd2d41523 113
wim 0:cbacd2d41523 114 LED.snake(1);
wim 0:cbacd2d41523 115 wait(1.0);
wim 0:cbacd2d41523 116
wim 0:cbacd2d41523 117 LED.snake(4);
wim 0:cbacd2d41523 118 wait(1.0);
wim 0:cbacd2d41523 119
wim 0:cbacd2d41523 120 LED.splash(6);
wim 0:cbacd2d41523 121 wait(1.0);
wim 0:cbacd2d41523 122
wim 0:cbacd2d41523 123 // pc.printf("Ctrl = 0x%02X ", PCF8591_CTRL_DEF); //0x40
wim 0:cbacd2d41523 124 // pc.printf("ADC Adr = 0x%02X ", PCF8591_ADC1); //0x01
wim 0:cbacd2d41523 125
wim 0:cbacd2d41523 126
wim 0:cbacd2d41523 127 //812 BUG: seems a delay is needed between write ADC register and read ADC or ADC results are unstable, DAC values leaking through...
wim 0:cbacd2d41523 128 //The Heartbeat Interrupt also seems to make the problem worse
wim 0:cbacd2d41523 129
wim 0:cbacd2d41523 130 while(1) {
wim 0:cbacd2d41523 131 float ana;
wim 0:cbacd2d41523 132 //pc.putc('*');
wim 0:cbacd2d41523 133
wim 0:cbacd2d41523 134 wait_ms(20);
wim 0:cbacd2d41523 135
wim 0:cbacd2d41523 136 // analog = adc_dac.read(PCF8591_ADC0); // read A/D value for Channel 0 (LDR)
wim 0:cbacd2d41523 137 // analog = adc_dac.read(PCF8591_ADC1); // read A/D value for Channel 1 (potmeter)
wim 0:cbacd2d41523 138 // pc.printf("%d ", analog);
wim 0:cbacd2d41523 139
wim 0:cbacd2d41523 140 ana=anaIn;
wim 0:cbacd2d41523 141 pc.printf("%2.2f ", ana);
wim 0:cbacd2d41523 142
wim 0:cbacd2d41523 143 // pc.printf("%2.2f ", anaIn);
wim 0:cbacd2d41523 144
wim 0:cbacd2d41523 145 anaOut = ana;
wim 0:cbacd2d41523 146 }
wim 0:cbacd2d41523 147
wim 0:cbacd2d41523 148
wim 0:cbacd2d41523 149
wim 0:cbacd2d41523 150 while(1) {
wim 0:cbacd2d41523 151 // myled1 = 0;
wim 0:cbacd2d41523 152 // wait(0.1);
wim 0:cbacd2d41523 153 // myled1 = 1;
wim 0:cbacd2d41523 154 // wait(0.9);
wim 0:cbacd2d41523 155
wim 0:cbacd2d41523 156 //pc.printf("*");
wim 0:cbacd2d41523 157 pc.putc('*');
wim 0:cbacd2d41523 158 wait(0.2);
wim 0:cbacd2d41523 159
wim 0:cbacd2d41523 160 buf[0] = count;
wim 0:cbacd2d41523 161 i2c_bus.write(slave_address, buf, 1);
wim 0:cbacd2d41523 162 count++;
wim 0:cbacd2d41523 163
wim 0:cbacd2d41523 164 // LED.writeInt(-150 + count, 3, false);
wim 0:cbacd2d41523 165 LED.writeInt(-150 + count, 3); //suppress leading zero
wim 0:cbacd2d41523 166
wim 0:cbacd2d41523 167 adc_dac.write(count); // write D/A value
wim 0:cbacd2d41523 168 // pc.printf("md=0x%02X ", adc_dac._mode);
wim 0:cbacd2d41523 169
wim 0:cbacd2d41523 170 //812 BUG: seems a delay is needed between write DAC and read ADC or ADC results are unstable, DAC values leaking through...
wim 0:cbacd2d41523 171 //The Heartbeat Interrupt also seems to make the problem worse
wim 0:cbacd2d41523 172 // wait_ms(25);
wim 0:cbacd2d41523 173
wim 0:cbacd2d41523 174 // analog = adc_dac.read(PCF8591_ADC0); // read A/D value for Channel 0 (LDR)
wim 0:cbacd2d41523 175 analog = adc_dac.read(PCF8591_ADC1); // read A/D value for Channel 1 (potmeter)
wim 0:cbacd2d41523 176 // pc.printf("ma=0x%02X ", adc_dac._mode);
wim 0:cbacd2d41523 177 pc.printf("%d ", analog);
wim 0:cbacd2d41523 178
wim 0:cbacd2d41523 179 }
wim 0:cbacd2d41523 180
wim 0:cbacd2d41523 181 //pc.printf("Bye World!\n\r");
wim 0:cbacd2d41523 182 }