
Test software for PCF8591 and SAA1064
Dependencies: PCF8591 SAA1064 mbed
main.cpp@1:7dd6c7104fef, 2013-09-23 (annotated)
- Committer:
- wim
- Date:
- Mon Sep 23 20:01:02 2013 +0000
- Revision:
- 1:7dd6c7104fef
- Parent:
- 0:cbacd2d41523
Cleaned up documentation
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:7dd6c7104fef | 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 | |
wim | 1:7dd6c7104fef | 124 | //LPC812 I2C BLOCKWRITE BUG: ADC results are unstable, DAC values leaking through... |
wim | 0:cbacd2d41523 | 125 | //The Heartbeat Interrupt also seems to make the problem worse |
wim | 0:cbacd2d41523 | 126 | |
wim | 1:7dd6c7104fef | 127 | // Test for PCF8591 |
wim | 0:cbacd2d41523 | 128 | while(1) { |
wim | 0:cbacd2d41523 | 129 | float ana; |
wim | 0:cbacd2d41523 | 130 | //pc.putc('*'); |
wim | 0:cbacd2d41523 | 131 | |
wim | 0:cbacd2d41523 | 132 | wait_ms(20); |
wim | 0:cbacd2d41523 | 133 | |
wim | 0:cbacd2d41523 | 134 | // analog = adc_dac.read(PCF8591_ADC0); // read A/D value for Channel 0 (LDR) |
wim | 0:cbacd2d41523 | 135 | // analog = adc_dac.read(PCF8591_ADC1); // read A/D value for Channel 1 (potmeter) |
wim | 0:cbacd2d41523 | 136 | // pc.printf("%d ", analog); |
wim | 0:cbacd2d41523 | 137 | |
wim | 0:cbacd2d41523 | 138 | ana=anaIn; |
wim | 0:cbacd2d41523 | 139 | pc.printf("%2.2f ", ana); |
wim | 0:cbacd2d41523 | 140 | |
wim | 0:cbacd2d41523 | 141 | // pc.printf("%2.2f ", anaIn); |
wim | 0:cbacd2d41523 | 142 | |
wim | 0:cbacd2d41523 | 143 | anaOut = ana; |
wim | 0:cbacd2d41523 | 144 | } |
wim | 0:cbacd2d41523 | 145 | |
wim | 0:cbacd2d41523 | 146 | |
wim | 1:7dd6c7104fef | 147 | // Test for SAA1064 and PCF8591 |
wim | 1:7dd6c7104fef | 148 | while(0) { |
wim | 1:7dd6c7104fef | 149 | |
wim | 0:cbacd2d41523 | 150 | //pc.printf("*"); |
wim | 0:cbacd2d41523 | 151 | pc.putc('*'); |
wim | 1:7dd6c7104fef | 152 | wait_ms(200); |
wim | 0:cbacd2d41523 | 153 | |
wim | 0:cbacd2d41523 | 154 | buf[0] = count; |
wim | 0:cbacd2d41523 | 155 | i2c_bus.write(slave_address, buf, 1); |
wim | 0:cbacd2d41523 | 156 | count++; |
wim | 0:cbacd2d41523 | 157 | |
wim | 0:cbacd2d41523 | 158 | // LED.writeInt(-150 + count, 3, false); |
wim | 0:cbacd2d41523 | 159 | LED.writeInt(-150 + count, 3); //suppress leading zero |
wim | 0:cbacd2d41523 | 160 | |
wim | 0:cbacd2d41523 | 161 | adc_dac.write(count); // write D/A value |
wim | 0:cbacd2d41523 | 162 | |
wim | 0:cbacd2d41523 | 163 | // analog = adc_dac.read(PCF8591_ADC0); // read A/D value for Channel 0 (LDR) |
wim | 0:cbacd2d41523 | 164 | analog = adc_dac.read(PCF8591_ADC1); // read A/D value for Channel 1 (potmeter) |
wim | 0:cbacd2d41523 | 165 | pc.printf("%d ", analog); |
wim | 1:7dd6c7104fef | 166 | |
wim | 0:cbacd2d41523 | 167 | } |
wim | 0:cbacd2d41523 | 168 | |
wim | 1:7dd6c7104fef | 169 | // pc.printf("Bye World!\n\r"); |
wim | 0:cbacd2d41523 | 170 | } |