2014-05-30
After reviewing many blogs and websites, there is no ready to use version.
The major issues are that
1, Contiki OS grows up under Linux. For example, the codes are organized by make file method. Linux does not have a formal toolchain to support all MSP430 versions. The formal toolchain means well documented and easy to use.
2, The IAR and Code Composer Studio have the very formal toolchain under Window. That is why they are expensive.Instead of make file, the tools organize the codes using configuration (i.e. clicking on option). In order to integrate Contiki OS, there are still many changes needed.
Next
1, Try Code Composer Studio Linux version.
Before try Code Composer, I find that msp430-bsl-linux,which may be the tool to program a telsob.
2014-06-01
It is not easy to install code composer on linux.
It is seem like that MSP430-5438-STK does not support bsl connector.
I have to migrate the Contiki OS into IRA on window.
I saw that many Contiki OS codes include some codes related to IRA, but really do not know how to use it.
2014-06-01
IAR complier has different syntax from GCC.
Xuefei
Friday, 30 May 2014
Wednesday, 31 July 2013
netcat example
Server side:
nc -k -l 10000 < my_in_file
Client side:
echo "bye" | netcat 192.168.1.6 10000 > my_in_file -
Monday, 14 January 2013
Thursday, 11 October 2012
a quick demo CO2 + Telosb
Change following lines in sky/dev/light-sensor.c
#define INPUT_CHANNEL (1 << INCH_0)#define INPUT_REFERENCE SREF_0
#define PHOTOSYNTHETIC_MEM ADC12MEM0
#define TOTAL_SOLAR_MEM ADC12MEM0
Then, the light sensor channel is redirected into CO2.
I try to creat a new sensor file in Contiki for Telosb, but it alway fails.
Any one know offical documents about this issues? Thanks for the help
Monday, 1 October 2012
write-USB Contiki OS Telosb
#include "dev/serial-line.h"
PROCESS(gas_client, "GAS Client Process");
AUTOSTART_PROCESSES(&gas_client);
/*----------------------------------------------------------------------------*/
PROCESS_THREAD(gas_client, ev, data)
{
PROCESS_BEGIN();
// bootup();
// printf("Welcome to GAS Client process!\n");
uint8_t command_str[10] = {'\0'};
// uint8_t contents[10] = {'\0'};
while(1) {
PROCESS_WAIT_EVENT_UNTIL(ev == serial_line_event_message && data != NULL);
strcpy( command_str, (uint8_t *) data);
printf( "\nReceived command %s", command_str);
// if (strncmp(command_str, ADDR_C, 2) == 0) {
// }
// strcpy(command_str, "");
}
PROCESS_END();
}
Terminal1:
echo "hello" > /dev/ttyUSB4
Terminal2:
make login
Received command hello
PROCESS(gas_client, "GAS Client Process");
AUTOSTART_PROCESSES(&gas_client);
/*----------------------------------------------------------------------------*/
PROCESS_THREAD(gas_client, ev, data)
{
PROCESS_BEGIN();
// bootup();
// printf("Welcome to GAS Client process!\n");
uint8_t command_str[10] = {'\0'};
// uint8_t contents[10] = {'\0'};
while(1) {
PROCESS_WAIT_EVENT_UNTIL(ev == serial_line_event_message && data != NULL);
strcpy( command_str, (uint8_t *) data);
printf( "\nReceived command %s", command_str);
// if (strncmp(command_str, ADDR_C, 2) == 0) {
// }
// strcpy(command_str, "");
}
PROCESS_END();
}
Terminal1:
echo "hello" > /dev/ttyUSB4
Terminal2:
make login
Received command hello
Friday, 7 September 2012
sriLCD
void setup()
{
Serial.begin(9600);
backlightOn();
}
void loop()
{
selectLineOne();
Serial.print(millis());
selectLineTwo();
Serial.print(millis()/2);
delay(100);
}
void selectLineOne(){ //puts the cursor at line 0 char 0.
Serial.write(0xFE); //command flag
Serial.write(128); //position
delay(10);
}
void selectLineTwo(){ //puts the cursor at line 0 char 0.
Serial.write(0xFE); //command flag
Serial.write(192); //position
delay(10);
}
void goTo(int position) { //position = line 1: 0-15, line 2: 16-31, 31+ defaults back to 0
if (position<16){ Serial.write(0xFE); //command flag
Serial.write((position+128)); //position
}else if (position<32){Serial.write(0xFE); //command flag
Serial.write((position+48+128)); //position
} else { goTo(0); }
delay(10);
}
void clearLCD(){
Serial.write(0xFE); //command flag
Serial.write(0x01); //clear command.
delay(10);
}
void backlightOn(){ //turns on the backlight
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(157); //light level.
delay(10);
}
void backlightOff(){ //turns off the backlight
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(128); //light level for off.
delay(10);
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
Serial.write(0xFE);
}
{
Serial.begin(9600);
backlightOn();
}
void loop()
{
selectLineOne();
Serial.print(millis());
selectLineTwo();
Serial.print(millis()/2);
delay(100);
}
void selectLineOne(){ //puts the cursor at line 0 char 0.
Serial.write(0xFE); //command flag
Serial.write(128); //position
delay(10);
}
void selectLineTwo(){ //puts the cursor at line 0 char 0.
Serial.write(0xFE); //command flag
Serial.write(192); //position
delay(10);
}
void goTo(int position) { //position = line 1: 0-15, line 2: 16-31, 31+ defaults back to 0
if (position<16){ Serial.write(0xFE); //command flag
Serial.write((position+128)); //position
}else if (position<32){Serial.write(0xFE); //command flag
Serial.write((position+48+128)); //position
} else { goTo(0); }
delay(10);
}
void clearLCD(){
Serial.write(0xFE); //command flag
Serial.write(0x01); //clear command.
delay(10);
}
void backlightOn(){ //turns on the backlight
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(157); //light level.
delay(10);
}
void backlightOff(){ //turns off the backlight
Serial.write(0x7C); //command flag for backlight stuff
Serial.write(128); //light level for off.
delay(10);
}
void serCommand(){ //a general function to call the command flag for issuing all other commands
Serial.write(0xFE);
}
RTC Control v1.00
http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock
/* RTC Control v1.00 * by <http://www.combustory.com> John Vaughters * * THIS CODE IS FREE FOR ANYTHING - There is no Rocket Science here. No need to create some long GPL statement. * * Credit to: * Maurice Ribble - http://www.glacialwanderer.com/hobbyrobotics for RTC DS1307 code * BB Riley - Underhill Center, VT <brianbr@wulfden.org> For simplification of the Day of Week and month * and updating to Arduino 1.0 * peep rada - from Arduino Forum - Found that only 32 registers per I2C connection was possible * * With this code you can set the date/time, retreive the date/time and use the extra memory of an RTC DS1307 chip. * The program also sets all the extra memory space to 0xff. * Serial Communication method with the Arduino that utilizes a leading CHAR for each command described below. * * Commands: * T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) - T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) - * T - Sets the date of the RTC DS1307 Chip. * Example to set the time for 25-Jan-2012 @ 19:57:11 for the 4 day of the week, use this command - T1157194250112 * Q(1-2) - (Q1) Memory initialization (Q2) RTC - Memory Dump * R - Read/display the time, day and date * * --------------------------------------------------------- * Notes: * Version 1.0 * Moving this code to Version 1.0 because this code has been updated to Arduino v1.0 and the features have * been well tested and improved in a collaborative effort. * - Fixed the issue of not being able to access all the registers - JWV * - Added initialization for all non-time registers - JWV * - Added Dump of all 64 registers - JWV * - Some Date/Time reformatting and cleanup of display, added Day/Month texts - BBR * - Made compatible with Arduino 1.0 - BBR * - Added Rr command for reading date/time - BBR * - Made commands case insensitive - BBR * - Create #define varibles to support pre Arduino v1.0 - JWV * Version 0.01 * Inital code with basics of setting time and the first 37 registers and dumping the first 32 registers. * The code was based on Maurice Ribble's original code. * */
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // This is the I2C address
// Arduino version compatibility Pre-Compiler Directives
#if defined(ARDUINO) && ARDUINO >= 100 // Arduino v1.0 and newer
#define I2C_WRITE Wire.write
#define I2C_READ Wire.read
#else // Arduino Prior to v1.0
#define I2C_WRITE Wire.send
#define I2C_READ Wire.receive
#endif
// Global Variables
int command = 0; // This is the command char, in ascii form, sent from the serial port
int i;
long previousMillis = 0; // will store last time Temp was updated
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
byte zero;
char *Day[] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
char *Mon[] = {"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers, Probably need to put in checks for valid numbers.
void setDateDs1307()
{
second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.
minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
hour = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
dayOfWeek = (byte) (Serial.read() - 48);
dayOfMonth = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
year= (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(zero);
I2C_WRITE(decToBcd(second) & 0x7f); // 0 to bit 7 starts the clock
I2C_WRITE(decToBcd(minute));
I2C_WRITE(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
I2C_WRITE(decToBcd(dayOfWeek));
I2C_WRITE(decToBcd(dayOfMonth));
I2C_WRITE(decToBcd(month));
I2C_WRITE(decToBcd(year));
Wire.endTransmission();
}
// Gets the date and time from the ds1307 and prints result
void getDateDs1307()
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
second = bcdToDec(I2C_READ() & 0x7f);
minute = bcdToDec(I2C_READ());
hour = bcdToDec(I2C_READ() & 0x3f); // Need to change this if 12 hour am/pm
dayOfWeek = bcdToDec(I2C_READ());
dayOfMonth = bcdToDec(I2C_READ());
month = bcdToDec(I2C_READ());
year = bcdToDec(I2C_READ());
if (hour < 10)
Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10)
Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10)
Serial.print("0");
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(Day[dayOfWeek]);
Serial.print(", ");
Serial.print(dayOfMonth, DEC);
Serial.print(" ");
Serial.print(Mon[month]);
Serial.print(" 20");
if (year < 10)
Serial.print("0");
Serial.println(year, DEC);
}
void setup() {
Wire.begin();
Serial.begin(57600);
zero=0x00;
}
void loop() {
if (Serial.available()) { // Look for char in serial que and process if found
command = Serial.read();
if (command == 84 || command == 116) { //If command = "Tt" Set Date
setDateDs1307();
getDateDs1307();
Serial.println(" ");
}
else if (command == 82 || command == 114) { //If command = "Rr" Read Date ... BBR
getDateDs1307();
Serial.println(" ");
}
else if (command == 81 || command == 113) { //If command = "Qq" RTC1307 Memory Functions
delay(100);
if (Serial.available()) {
command = Serial.read();
if (command == 49) { //If command = "1" RTC1307 Initialize Memory - All Data will be set to
// 255 (0xff). Therefore 255 or 0 will be an invalid value.
Wire.beginTransmission(DS1307_I2C_ADDRESS); // 255 will be the init value and 0 will be considered
// an error that occurs when the RTC is in Battery mode.
I2C_WRITE(0x08); // Set the register pointer to be just past the date/time registers.
for (i = 1; i <= 24; i++) {
I2C_WRITE(0Xff);
delay(10);
}
Wire.endTransmission();
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(0x21); // Set the register pointer to 33 for second half of registers. Only 32 writes per connection allowed.
for (i = 1; i <= 33; i++) {
I2C_WRITE(0Xff);
delay(10);
}
Wire.endTransmission();
getDateDs1307();
Serial.println(": RTC1307 Initialized Memory");
}
else if (command == 50) { //If command = "2" RTC1307 Memory Dump
getDateDs1307();
Serial.println(": RTC 1307 Dump Begin");
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 32);
for (i = 0; i <= 31; i++) { //Register 0-31 - only 32 registers allowed per I2C connection
test = I2C_READ();
Serial.print(i);
Serial.print(": ");
Serial.print(test, DEC);
Serial.print(" : ");
Serial.println(test, HEX);
}
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(0x20);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 32);
for (i = 32; i <= 63; i++) { //Register 32-63 - only 32 registers allowed per I2C connection
test = I2C_READ();
Serial.print(i);
Serial.print(": ");
Serial.print(test, DEC);
Serial.print(" : ");
Serial.println(test, HEX);
}
Serial.println(" RTC1307 Dump end");
}
}
}
Serial.print("Command: ");
Serial.println(command); // Echo command CHAR in ascii that was sent
}
command = 0; // reset command
delay(100);
}
//*****************************************************The End***********************
/* RTC Control v1.00 * by <http://www.combustory.com> John Vaughters * * THIS CODE IS FREE FOR ANYTHING - There is no Rocket Science here. No need to create some long GPL statement. * * Credit to: * Maurice Ribble - http://www.glacialwanderer.com/hobbyrobotics for RTC DS1307 code * BB Riley - Underhill Center, VT <brianbr@wulfden.org> For simplification of the Day of Week and month * and updating to Arduino 1.0 * peep rada - from Arduino Forum - Found that only 32 registers per I2C connection was possible * * With this code you can set the date/time, retreive the date/time and use the extra memory of an RTC DS1307 chip. * The program also sets all the extra memory space to 0xff. * Serial Communication method with the Arduino that utilizes a leading CHAR for each command described below. * * Commands: * T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99) - T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year) - * T - Sets the date of the RTC DS1307 Chip. * Example to set the time for 25-Jan-2012 @ 19:57:11 for the 4 day of the week, use this command - T1157194250112 * Q(1-2) - (Q1) Memory initialization (Q2) RTC - Memory Dump * R - Read/display the time, day and date * * --------------------------------------------------------- * Notes: * Version 1.0 * Moving this code to Version 1.0 because this code has been updated to Arduino v1.0 and the features have * been well tested and improved in a collaborative effort. * - Fixed the issue of not being able to access all the registers - JWV * - Added initialization for all non-time registers - JWV * - Added Dump of all 64 registers - JWV * - Some Date/Time reformatting and cleanup of display, added Day/Month texts - BBR * - Made compatible with Arduino 1.0 - BBR * - Added Rr command for reading date/time - BBR * - Made commands case insensitive - BBR * - Create #define varibles to support pre Arduino v1.0 - JWV * Version 0.01 * Inital code with basics of setting time and the first 37 registers and dumping the first 32 registers. * The code was based on Maurice Ribble's original code. * */
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // This is the I2C address
// Arduino version compatibility Pre-Compiler Directives
#if defined(ARDUINO) && ARDUINO >= 100 // Arduino v1.0 and newer
#define I2C_WRITE Wire.write
#define I2C_READ Wire.read
#else // Arduino Prior to v1.0
#define I2C_WRITE Wire.send
#define I2C_READ Wire.receive
#endif
// Global Variables
int command = 0; // This is the command char, in ascii form, sent from the serial port
int i;
long previousMillis = 0; // will store last time Temp was updated
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
byte test;
byte zero;
char *Day[] = {"","Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
char *Mon[] = {"","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock
// Assumes you're passing in valid numbers, Probably need to put in checks for valid numbers.
void setDateDs1307()
{
second = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.
minute = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
hour = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
dayOfWeek = (byte) (Serial.read() - 48);
dayOfMonth = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
month = (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
year= (byte) ((Serial.read() - 48) *10 + (Serial.read() - 48));
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(zero);
I2C_WRITE(decToBcd(second) & 0x7f); // 0 to bit 7 starts the clock
I2C_WRITE(decToBcd(minute));
I2C_WRITE(decToBcd(hour)); // If you want 12 hour am/pm you need to set
// bit 6 (also need to change readDateDs1307)
I2C_WRITE(decToBcd(dayOfWeek));
I2C_WRITE(decToBcd(dayOfMonth));
I2C_WRITE(decToBcd(month));
I2C_WRITE(decToBcd(year));
Wire.endTransmission();
}
// Gets the date and time from the ds1307 and prints result
void getDateDs1307()
{
// Reset the register pointer
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
second = bcdToDec(I2C_READ() & 0x7f);
minute = bcdToDec(I2C_READ());
hour = bcdToDec(I2C_READ() & 0x3f); // Need to change this if 12 hour am/pm
dayOfWeek = bcdToDec(I2C_READ());
dayOfMonth = bcdToDec(I2C_READ());
month = bcdToDec(I2C_READ());
year = bcdToDec(I2C_READ());
if (hour < 10)
Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10)
Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10)
Serial.print("0");
Serial.print(second, DEC);
Serial.print(" ");
Serial.print(Day[dayOfWeek]);
Serial.print(", ");
Serial.print(dayOfMonth, DEC);
Serial.print(" ");
Serial.print(Mon[month]);
Serial.print(" 20");
if (year < 10)
Serial.print("0");
Serial.println(year, DEC);
}
void setup() {
Wire.begin();
Serial.begin(57600);
zero=0x00;
}
void loop() {
if (Serial.available()) { // Look for char in serial que and process if found
command = Serial.read();
if (command == 84 || command == 116) { //If command = "Tt" Set Date
setDateDs1307();
getDateDs1307();
Serial.println(" ");
}
else if (command == 82 || command == 114) { //If command = "Rr" Read Date ... BBR
getDateDs1307();
Serial.println(" ");
}
else if (command == 81 || command == 113) { //If command = "Qq" RTC1307 Memory Functions
delay(100);
if (Serial.available()) {
command = Serial.read();
if (command == 49) { //If command = "1" RTC1307 Initialize Memory - All Data will be set to
// 255 (0xff). Therefore 255 or 0 will be an invalid value.
Wire.beginTransmission(DS1307_I2C_ADDRESS); // 255 will be the init value and 0 will be considered
// an error that occurs when the RTC is in Battery mode.
I2C_WRITE(0x08); // Set the register pointer to be just past the date/time registers.
for (i = 1; i <= 24; i++) {
I2C_WRITE(0Xff);
delay(10);
}
Wire.endTransmission();
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(0x21); // Set the register pointer to 33 for second half of registers. Only 32 writes per connection allowed.
for (i = 1; i <= 33; i++) {
I2C_WRITE(0Xff);
delay(10);
}
Wire.endTransmission();
getDateDs1307();
Serial.println(": RTC1307 Initialized Memory");
}
else if (command == 50) { //If command = "2" RTC1307 Memory Dump
getDateDs1307();
Serial.println(": RTC 1307 Dump Begin");
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 32);
for (i = 0; i <= 31; i++) { //Register 0-31 - only 32 registers allowed per I2C connection
test = I2C_READ();
Serial.print(i);
Serial.print(": ");
Serial.print(test, DEC);
Serial.print(" : ");
Serial.println(test, HEX);
}
Wire.beginTransmission(DS1307_I2C_ADDRESS);
I2C_WRITE(0x20);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 32);
for (i = 32; i <= 63; i++) { //Register 32-63 - only 32 registers allowed per I2C connection
test = I2C_READ();
Serial.print(i);
Serial.print(": ");
Serial.print(test, DEC);
Serial.print(" : ");
Serial.println(test, HEX);
}
Serial.println(" RTC1307 Dump end");
}
}
}
Serial.print("Command: ");
Serial.println(command); // Echo command CHAR in ascii that was sent
}
command = 0; // reset command
delay(100);
}
//*****************************************************The End***********************
Subscribe to:
Posts (Atom)


