Test application to demonstrate MCP4xxxx_SPI library

Dependencies:   DebugLibrary MCP4xxxx_SPI mbed

Committer:
Yann
Date:
Tue Jan 29 15:02:41 2013 +0000
Revision:
3:7dbac45b8fd3
Parent:
1:a463807bf483
Add /CS supported by the MCP4xxxx_SPI library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yann 0:62020bd58748 1 #include <string>
Yann 0:62020bd58748 2 #include <iostream>
Yann 0:62020bd58748 3 #include <iomanip>
Yann 0:62020bd58748 4
Yann 3:7dbac45b8fd3 5 /**
Yann 3:7dbac45b8fd3 6 * Tests were done with schema proposed here: DS11195C-page 11 FIGURE 2-25: Potentiometer Divider Non-Linearity Error Test Circuit (DNL, INL)
Yann 3:7dbac45b8fd3 7 */
Yann 0:62020bd58748 8 #include "MCP4xxxx_SPI.h"
Yann 0:62020bd58748 9
Yann 0:62020bd58748 10 struct UserChoice {
Yann 0:62020bd58748 11 char choice;
Yann 0:62020bd58748 12 unsigned char moduleId;
Yann 0:62020bd58748 13 };
Yann 0:62020bd58748 14
Yann 0:62020bd58748 15 /*
Yann 0:62020bd58748 16 * Declare functions
Yann 0:62020bd58748 17 */
Yann 0:62020bd58748 18 void AvailableIndicator(); // LED1 flashing for program while program is alive
Yann 0:62020bd58748 19 UserChoice DisplayMenuAndGetChoice(); // Display and get the user choice
Yann 0:62020bd58748 20
Yann 0:62020bd58748 21 /*
Yann 0:62020bd58748 22 * Declare statics
Yann 0:62020bd58748 23 */
Yann 0:62020bd58748 24 DigitalOut g_availableLed(LED1); // To verify if program in running
Yann 0:62020bd58748 25 Ticker g_available; // LED1 will flash with a period of 2s
Yann 3:7dbac45b8fd3 26 #define __MANAGE_CS__ // /CS managed by application
Yann 3:7dbac45b8fd3 27 #undef __MANAGE_CS__ // /CS managed by library
Yann 3:7dbac45b8fd3 28 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 29 DigitalOut g_chipSelect(p8); // /CS to select MCP4xxxx device
Yann 3:7dbac45b8fd3 30 CMCP4xxxx_SPI g_digitalPot(p5, p6, p7, NC, NC, NC); // Create an instance of the class CMCP4xxxx_SPI, p5/p6/p7: SPI#1, /CS managed by application, /RESET input not connected, , /SHDN input not connected
Yann 3:7dbac45b8fd3 31 #else // __MANAGE_CS__
Yann 3:7dbac45b8fd3 32 CMCP4xxxx_SPI g_digitalPot(p5, p6, p7, p8, NC, NC); // Create an instance of the class CMCP4xxxx_SPI, p5/p6/p7: SPI#1, /CS managed by library, /RESET input not connected, , /SHDN input not connected
Yann 3:7dbac45b8fd3 33 #endif // __MANAGE_CS__
Yann 0:62020bd58748 34 UserChoice g_userChoice; // Used to store user choice from displayed menu
Yann 0:62020bd58748 35
Yann 0:62020bd58748 36 int main() {
Yann 0:62020bd58748 37
Yann 0:62020bd58748 38 unsigned char potLevel = 0x80; // Initial digital potentiometer value
Yann 0:62020bd58748 39
Yann 3:7dbac45b8fd3 40 #if defined(__MANAGE_CS__)
Yann 3:7dbac45b8fd3 41 g_chipSelect.write(1); // Disable chip
Yann 3:7dbac45b8fd3 42 #endif // __MANAGE_CS__
Yann 0:62020bd58748 43
Yann 0:62020bd58748 44 // Launch available indicator
Yann 0:62020bd58748 45 g_available.attach(&AvailableIndicator, 2.0);
Yann 0:62020bd58748 46
Yann 0:62020bd58748 47 while (true) {
Yann 0:62020bd58748 48
Yann 0:62020bd58748 49 g_userChoice = DisplayMenuAndGetChoice(); // Retrieve the user selection
Yann 0:62020bd58748 50 switch (g_userChoice.choice) {
Yann 0:62020bd58748 51 case 'a':
Yann 0:62020bd58748 52 potLevel += 1;
Yann 3:7dbac45b8fd3 53 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 54 g_chipSelect.write(0);
Yann 3:7dbac45b8fd3 55 #endif // __MANAGE_CS__
Yann 0:62020bd58748 56 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot1, potLevel);
Yann 3:7dbac45b8fd3 57 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 58 g_chipSelect.write(1);
Yann 3:7dbac45b8fd3 59 #endif // __MANAGE_CS__
Yann 0:62020bd58748 60 break;
Yann 0:62020bd58748 61 case 'b':
Yann 0:62020bd58748 62 potLevel += 1;
Yann 3:7dbac45b8fd3 63 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 64 g_chipSelect.write(0);
Yann 3:7dbac45b8fd3 65 #endif // __MANAGE_CS__
Yann 0:62020bd58748 66 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot2, potLevel);
Yann 3:7dbac45b8fd3 67 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 68 g_chipSelect.write(1);
Yann 3:7dbac45b8fd3 69 #endif // __MANAGE_CS__
Yann 0:62020bd58748 70 break;
Yann 0:62020bd58748 71 case 'c':
Yann 0:62020bd58748 72 potLevel -= 1;
Yann 3:7dbac45b8fd3 73 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 74 g_chipSelect.write(0);
Yann 3:7dbac45b8fd3 75 #endif // __MANAGE_CS__
Yann 0:62020bd58748 76 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot1, potLevel);
Yann 3:7dbac45b8fd3 77 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 78 g_chipSelect.write(1);
Yann 3:7dbac45b8fd3 79 #endif // __MANAGE_CS__
Yann 0:62020bd58748 80 break;
Yann 0:62020bd58748 81 case 'd':
Yann 0:62020bd58748 82 potLevel -= 1;
Yann 3:7dbac45b8fd3 83 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 84 g_chipSelect.write(0);
Yann 3:7dbac45b8fd3 85 #endif // __MANAGE_CS__
Yann 0:62020bd58748 86 g_digitalPot.Write(CMCP4xxxx_SPI::WriteToPot2, potLevel);
Yann 3:7dbac45b8fd3 87 #if defined(__MANAGE_CS__)
Yann 0:62020bd58748 88 g_chipSelect.write(1);
Yann 3:7dbac45b8fd3 89 #endif // __MANAGE_CS__
Yann 0:62020bd58748 90 break;
Yann 1:a463807bf483 91 case 'e':
Yann 1:a463807bf483 92 potLevel -= 1;
Yann 3:7dbac45b8fd3 93 #if defined(__MANAGE_CS__)
Yann 1:a463807bf483 94 g_chipSelect.write(0);
Yann 3:7dbac45b8fd3 95 #endif // __MANAGE_CS__
Yann 1:a463807bf483 96 g_digitalPot.Write(CMCP4xxxx_SPI::ShutdownPot1);
Yann 3:7dbac45b8fd3 97 #if defined(__MANAGE_CS__)
Yann 1:a463807bf483 98 g_chipSelect.write(1);
Yann 3:7dbac45b8fd3 99 #endif // __MANAGE_CS__
Yann 1:a463807bf483 100 break;
Yann 1:a463807bf483 101 case 'f':
Yann 1:a463807bf483 102 potLevel -= 1;
Yann 3:7dbac45b8fd3 103 #if defined(__MANAGE_CS__)
Yann 1:a463807bf483 104 g_chipSelect.write(0);
Yann 3:7dbac45b8fd3 105 #endif // __MANAGE_CS__
Yann 1:a463807bf483 106 g_digitalPot.Write(CMCP4xxxx_SPI::ShutdownPot2);
Yann 3:7dbac45b8fd3 107 #if defined(__MANAGE_CS__)
Yann 1:a463807bf483 108 g_chipSelect.write(1);
Yann 3:7dbac45b8fd3 109 #endif // __MANAGE_CS__
Yann 1:a463807bf483 110 break;
Yann 1:a463807bf483 111 case 'r':
Yann 1:a463807bf483 112 g_digitalPot.Reset();
Yann 1:a463807bf483 113 break;
Yann 0:62020bd58748 114 default:
Yann 0:62020bd58748 115 std::cout << "Invalid user choice\r" << std::endl;
Yann 0:62020bd58748 116 break;
Yann 0:62020bd58748 117 } // End of 'switch' statement
Yann 0:62020bd58748 118
Yann 0:62020bd58748 119 } // End of 'while' statement
Yann 0:62020bd58748 120 } // End of program - nerver reached
Yann 0:62020bd58748 121
Yann 0:62020bd58748 122 void AvailableIndicator() {
Yann 0:62020bd58748 123 g_availableLed = !g_availableLed;
Yann 0:62020bd58748 124 } // End of AvailableIndicator
Yann 0:62020bd58748 125
Yann 0:62020bd58748 126 UserChoice DisplayMenuAndGetChoice() {
Yann 0:62020bd58748 127 static UserChoice userChoice;
Yann 0:62020bd58748 128
Yann 0:62020bd58748 129 // Display the title
Yann 0:62020bd58748 130 std::cout << "\r" << std::endl << "MCP4xxxx_SPI v0.1\r" << std::endl;
Yann 0:62020bd58748 131
Yann 0:62020bd58748 132 // Display the menu
Yann 0:62020bd58748 133 std::cout << "\tIncrease level on pot #1:\t\t\ta\r" << std::endl;
Yann 0:62020bd58748 134 std::cout << "\tIncrease level on pot #2:\t\t\tb\r" << std::endl;
Yann 0:62020bd58748 135 std::cout << "\tDecrease level on pot #1:\t\t\tc\r" << std::endl;
Yann 0:62020bd58748 136 std::cout << "\tDecrease level on pot #2:\t\t\td\r" << std::endl;
Yann 1:a463807bf483 137 std::cout << "\tShutdown pot #1 :\t\t\te\r" << std::endl;
Yann 1:a463807bf483 138 std::cout << "\tShutdown pot #2 :\t\t\tf\r" << std::endl;
Yann 1:a463807bf483 139 std::cout << "\tReset MCP4xxxx :\t\t\tr\r" << std::endl;
Yann 0:62020bd58748 140 std::cout << "Enter your choice: " << std::flush;
Yann 0:62020bd58748 141 userChoice.choice = getchar();
Yann 0:62020bd58748 142 // Display the menu
Yann 0:62020bd58748 143 std::cout << "\r" << std::endl << std::flush;
Yann 0:62020bd58748 144 return userChoice;
Yann 0:62020bd58748 145 }