Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:d33360d14a57, committed 2011-11-17
- Comitter:
- Nurbol
- Date:
- Thu Nov 17 17:03:22 2011 +0000
- Commit message:
Changed in this revision
diff -r 000000000000 -r d33360d14a57 MCP23017.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MCP23017.lib Thu Nov 17 17:03:22 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Nurbol/code/MCP23017/#69c047b34ca6
diff -r 000000000000 -r d33360d14a57 WattBob_TextLCD.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WattBob_TextLCD.lib Thu Nov 17 17:03:22 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Nurbol/code/WattBob_TextLCD/#fd972c79270d
diff -r 000000000000 -r d33360d14a57 cmd_io.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd_io.cpp Thu Nov 17 17:03:22 2011 +0000
@@ -0,0 +1,161 @@
+//
+// cmd_io.cpp : library of routines to communicate with virtual COM port
+// ==========
+//
+#include "mbed.h"
+#include "cmd_io.h"
+#include "globals.h"
+
+//************************************************************************
+//
+// get_cmd - read a command string from the serial port
+// =======
+//
+// Method
+// 1. Read string of data until a Newline character
+// string is passed as the parameter
+// 2. return a sting through the pointer and a count of the number of characters
+//
+// Notes
+//
+uint32_t get_cmd(CMD_STRUCT *command)
+{
+char ch;
+uint8_t i;
+//
+// read string and use newline as terminator
+//
+ for (i= 0 ; i < CMD_STR_BUFFER_SZ ; i++) {
+ ch = pc.getc();
+ if (ch == '\r') {
+ continue;
+ }
+ command->cmd_str[i] = ch;
+ if (ch == '\n') {
+ command->cmd_str[i] = '\0';
+ break;
+ }
+ }
+ command->char_cnt = i; // record character count
+ command->result_status = OK;
+ return 0;
+}
+
+//************************************************************************
+//
+// parse_cmd - split command into its component parts
+// =========
+//
+// Method
+// 1. first character is the command code
+// 2. subsequent character define a set of parameters
+//
+// String is located in the CMD_STRUCT and the resulting
+// data is returned to the same structure.
+//
+// Notes
+//
+uint32_t parse_cmd(CMD_STRUCT *command)
+{
+uint8_t param_cnt, i, state;
+uint16_t tmp;
+
+ command->cmd_code = command->cmd_str[0];
+ param_cnt = 0;
+ tmp = 0;
+ state = 0;
+ for (i=1 ; i < CMD_STR_BUFFER_SZ ; i++) { // step through characters
+ if (command->cmd_str[i] == '\0') {
+ if (state == 1) { // count paramter that is terminated by NEWLINE
+ command->param[param_cnt] = tmp;
+ param_cnt++;
+ }
+ command->nos_params = param_cnt;
+ return OK;
+ }
+ if ((command->cmd_str[i] == ' ') && (state == 0)) { // skip spaces
+ continue;
+ }
+ if ((command->cmd_str[i] == ' ') && (state == 1)) { // skip spaces
+ state = 0;
+ command->param[param_cnt] = tmp;
+ param_cnt++;
+ tmp = 0;
+ continue;
+ }
+ state = 1;
+ if ((command->cmd_str[i] >= '0') && (command->cmd_str[i] <= '9')) {
+ tmp = (tmp * 10) + (command->cmd_str[i] - '0');
+ } else {
+ command->param[param_cnt] = tmp;
+ return CMD_BAD_CHARACTER;
+ }
+ }
+ return CMD_NO_TERMINATOR;
+}
+
+//************************************************************************
+//
+// reply_to_cmd - return data and status info
+// ============
+//
+// Method
+//
+// Notes
+//
+void reply_to_cmd(CMD_STRUCT *command)
+{
+ send_status(command->result_status);
+ if ((command->result_status == OK) && (command->nos_data > 0)) {
+ send_data(command);
+ }
+}
+
+//************************************************************************
+//
+// send_status - command status
+// ===========
+//
+// Notes
+// return status value as a positive interger in a string format
+// with a terminating newline character.
+//
+void send_status(uint32_t value)
+{
+ pc.printf("%d\n", value);
+ return;
+}
+
+//************************************************************************
+//
+// send_data - send data appropriate to the command
+// =========
+//
+// Method
+//
+// Notes
+//
+void send_data(CMD_STRUCT *command)
+{
+char buffer[80];
+uint8_t i;
+//
+// create data string
+//
+ if (command->nos_data == 1) {
+ sprintf(buffer, "%u\n", (int)command->result_data[0]);
+ }
+ if (command->nos_data == 2) {
+ sprintf(buffer, "%u %u\n", (int)command->result_data[0], (int)command->result_data[1]);
+ }
+//
+// send string
+//
+ for (i = 0 ; i < 40 ; i++) {
+ if (buffer[i] == '\0') { // do not send NULL character
+ return;
+ }
+ pc.putc(buffer[i]);
+ }
+ return;
+}
\ No newline at end of file
diff -r 000000000000 -r d33360d14a57 cmd_io.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd_io.lib Thu Nov 17 17:03:22 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Nurbol/code/cmd_io/#1722aea42640
diff -r 000000000000 -r d33360d14a57 globals.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/globals.cpp Thu Nov 17 17:03:22 2011 +0000 @@ -0,0 +1,2 @@ +#include "mbed.h" +
diff -r 000000000000 -r d33360d14a57 globals.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/globals.lib Thu Nov 17 17:03:22 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/Nurbol/code/globals/#ca74c2573e8d
diff -r 000000000000 -r d33360d14a57 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Nov 17 17:03:22 2011 +0000
@@ -0,0 +1,309 @@
+//
+// COM_test : program to communicate via a COM port to a PC/laptop
+// ========
+//
+// Description
+// Program to receive ASCII format commands through a virtual COM port and
+// after executing the command return some data (optional, depending on
+// the command) and a status value.
+// The program understands two possible commands :
+// "s i j" : move servo 'i (0 to 5) to postion 'j' (0 to 90)
+// "r" : read the 'i' parameter of the last "s" command
+//
+// Version : 1.0
+// Author : Jim Herd
+// Date : 5th Oct 2011
+//
+#include "mbed.h"
+#include "MCP23017.h"
+#include "WattBob_TextLCD.h"
+#include "cmd_io.h"
+#include "globals.h"
+
+
+
+Ticker timer1p;
+Ticker timer2p;
+Ticker timercounter1p;
+Ticker timercounter2p;
+
+
+AnalogIn sensor1(p15);
+AnalogIn sensor2(p16);
+AnalogOut valueLED1(p18);
+DigitalOut valueLED2(p25);
+
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+DigitalOut clk(p24);
+
+AnalogIn counter1p(p19);
+AnalogIn counter2p(p20);
+
+
+//******************************************************************************
+// declare functions
+//
+void sensor1p (void);
+void sensor2p (void);
+void counter1 (void);
+void counter2 (void);
+
+//
+//
+// 2. five servo outputs
+//
+
+PwmOut servo_0(p26);
+//PwmOut servo_1(p25);
+//PwmOut servo_2(p24);
+//PwmOut servo_3(p23);
+PwmOut servo_4(p22);
+//PwmOut servo_5(p21);
+
+//
+// 3. objects necessary to use the 2*16 character MBED display
+//
+MCP23017 *par_port;
+WattBob_TextLCD *lcd;
+//
+// 4. Virtual COM port over USB link to laptop/PC
+//
+Serial pc(USBTX, USBRX);
+
+//******************************************************************************
+// Defined GLOBAL variables and structures
+//
+CMD_STRUCT ext_cmd; // structure to hold command data
+STAT_STRUCT ext_stat; // structure to hold status reply
+
+uint32_t last_servo; // store for last servo number
+
+//************************************************************************
+//************************************************************************
+// init_sys : initialise the system
+// ========
+//
+// 1. Configure 2*16 character display
+// 2. Print "COM test" string
+// 3. initialise relevant global variables
+// 4. set COM port baud rate to 19200 bits per second
+//
+void init_sys(void) {
+
+ par_port = new MCP23017(p9, p10, 0x40);
+ lcd = new WattBob_TextLCD(par_port);
+
+ par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
+ lcd->cls();
+ lcd->locate(0,0);
+ lcd->printf("COM ");
+
+ servo_0.period(0.020); // servo requires a 20ms period, common for all 5 servo objects
+ last_servo = SERVO_UNKNOWN;
+ pc.baud(19200);
+
+ return;
+} // end init_sys
+
+//************************************************************************
+// process_cmd : decode and execute command
+// ===========
+uint32_t process_cmd(CMD_STRUCT *command)
+{
+int32_t pulse_width;
+
+ switch (command->cmd_code) {
+//
+// move a servo
+//
+ case SERVO_CMD :
+ command->nos_data = 0; // no data to be returned
+ //
+ // check that parameters are OK
+ //
+ if (command->nos_params != 2) { // check for 2 parameters
+ command->result_status = CMD_BAD_NUMBER_OF_PARAMETERS;
+ break;
+ }
+ if (command->param[0] > MAX_SERVO_NUMBER ) { // check servo number
+ command->result_status = CMD_BAD_SERVO_NUMBER;
+ break;
+ }
+ if ((command->param[1] < MIN_SERVO_ANGLE) ||
+ (command->param[1] > MAX_SERVO_ANGLE) ) {
+ command->result_status = CMD_BAD_SERVO_VALUE;
+ break;
+ }
+ if ((command->param[0] == 4) && (command->param[1] == 0)) {
+ pulse_width = 0; // convert angle to pulse width
+ }
+ else{
+ pulse_width = 1000 + (command->param[1] * 1000) / MAX_SERVO_ANGLE; // convert angle to pulse width
+ }
+
+
+
+ //
+ // implement servo move to all 5 servos
+ //
+ switch (command->param[0]) {
+ case 0 : servo_0.pulsewidth_us(pulse_width); break;
+ // case 1 : servo_1.pulsewidth_us(pulse_width); break;
+ // case 2 : servo_2.pulsewidth_us(pulse_width); break;
+ // case 3 : servo_3.pulsewidth_us(pulse_width); break;
+ case 4 : servo_4.pulsewidth_us(pulse_width); break;
+ // case 5 : servo_5.pulsewidth_us(pulse_width); break;
+
+ }
+ last_servo = command->param[0];
+ break;
+//
+// return last servo number
+//
+ case READ_CMD :
+ command->nos_data = 1; // no data to be returned
+ command->result_data[0] = valueLED1;
+ command->result_data[1] = valueLED2;
+ break;
+//
+// catch any problems
+//
+ default:
+ command->nos_data = 0; // no data to be returned
+ command->result_status = CMD_BAD_SERVO_VALUE;
+ break;
+ }
+ return OK;
+}
+
+//************************************************************************
+
+//function
+void sensor1p (void){
+
+
+ clk = !clk;
+ wait(0.01);
+ sensor1.read();
+ if(sensor1 > 0.5) {
+ led1 = 1;
+ valueLED1 = 1;
+ }
+ else if(sensor1 < 0.5){
+ led1 = 0;
+ valueLED1 = 0;
+ }
+}
+
+
+void sensor2p (){
+
+ sensor2.read();
+ if(sensor2 > 0.5) {
+ led2 = 1;
+ valueLED2 = 1;
+ }
+ else if(sensor2 < 0.5){
+ led2 = 0;
+ valueLED2 = 0;
+ }
+}
+
+void counter1 (){
+ if(counter1p > 0.5){
+ led3 = 1;
+ }
+ else{
+ led3 = 0;
+ }
+}
+
+void counter2(){
+ if(counter2p > 0.5){
+ led4 = 1;
+ process_cmd(&ext_cmd);
+ }
+ else{
+ led4 = 0;
+ }
+}
+
+
+
+
+//************************************************************************
+//
+int main() {
+
+ valueLED1=0;
+ valueLED2=0;
+ clk=0;
+ init_sys();
+
+
+
+
+
+ FOREVER {
+
+ timer2p.attach(&sensor2p, 0.1);
+ timer1p.attach(&sensor1p, 0.1);
+
+
+ clk = !clk;
+ wait(0.1);
+
+ timercounter2p.attach(&counter2, 0.1);
+ timercounter1p.attach(&counter1, 0.1);
+
+
+
+
+
+
+
+ get_cmd(&ext_cmd);
+ //
+ // Check status of read command activity and return an error status if there was a problem
+ // If there is a problem, then return status code only and wait for next command.
+ //
+ if (ext_cmd.result_status != OK){
+ send_status(ext_cmd.result_status);
+ continue;
+ }
+ //
+ // Parse command and return an error staus if there is a problem
+ // If there is a problem, then return status code only and wait for next command.
+ //
+ parse_cmd(&ext_cmd);
+ lcd->locate(1,0); lcd->printf(ext_cmd.cmd_str);
+ if ((ext_cmd.result_status != OK) && (ext_cmd.cmd_code != TEXT_CMD)){
+ lcd->locate(1,0); lcd->printf("parse : error");
+ send_status(ext_cmd.result_status);
+ continue;
+ }
+ //
+ // Execute command and return an error staus if there is a problem
+ //
+ process_cmd(&ext_cmd);
+ reply_to_cmd(&ext_cmd);
+
+
+
+ }
+
+}
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r d33360d14a57 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Nov 17 17:03:22 2011 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912