logo academy i3d
THIRTEENTH WEEK
ASSIGNMENT
home about assignments finalproyec

Networking and communications                  

  Assignment    

  • Design and build a wired &/or wireless network connecting at least two processors.
This assignment has two parts, the first is to make a few boards to implement a serial wired communication with three microcontrollers Attiny 45, following the Fab files.

The communication is through pins (RX) for input and (TX) for output.

The second part is to modify the program to control some elements connected to the nodes.

Serial Asynchronous

The files for this assignments can be found here:   networking_communications:
ruteado

MAKING  BOARD


The files for the bridge and the nodes are;
       hello.bus.45.bridge.cad board traces interior                  hello.bus.45.node.cad board traces interior     
Here you can see the work done with modela , and after that the welding of components.
 
modela1


          tarjetas



PROGRAMMING

Programs for the bridge and the nodes are available here:
  hello.bus.45.c  makefile 
There are some modifications to be done according to ID of the board.

In the 3 boards I changed the time delay in the line 29 from 100 to 1000ms
.This is for better viewing of the process:
       #define () _delay_ms (1000) // LED flash delay

For the bridge I only changed the LED flash delay. Line 41 remains at zero:

       #define node_id '0'

For the node 1
, line 41 changed to one:
       #define node_id '1'

For the node 2, line 41 changed to two:
       #define node_id '2'

hello_bus_45_c
TESTING PROGRAM

The boards are connected to the PC through a FTDI cable, which will allow communication
entering numbers 0,1 or 2 into the "serial monitor" of "ARDUINO IDE".


ASSIGNMENT COMPLETED

MODIFIED PROGRAM
The next modification in the program allows node "2" to change its behavior.
By entering number "0" from the serial monitor
, the LED  of node 2 gets SET and if you enter number "2", the LED  RESETS.

PENDING TASK:

The next step is to SET and RESET from the inputs of  nodes "0" and "1".
//
//
// hello.bus.45.c        ..... modificado
//
// 9600 baud serial bus hello-world
//
// Neil Gershenfeld
// 11/24/10
//
// (c) Massachusetts Institute of Technology 2010
// Permission granted for experimental and personal use;
// license for commercial sale available from MIT.
//

#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <string.h>

#define output(directions,pin) (directions |= pin) // set port direction for output
#define input(directions,pin) (directions &= (~pin)) // set port direction for input
#define set(port,pin) (port |= pin) // set port pin
#define clear(port,pin) (port &= (~pin)) // clear port pin
#define pin_test(pins,pin) (pins & pin) // test for port pin
#define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set
#define bit_delay_time 100 // bit delay for 9600 with overhead
#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay
#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay
#define led_delay() _delay_ms(100) // LED flash delay

#define led_port PORTB
#define led_direction DDRB
#define led_pin (1 << PB0)

#define serial_port PORTB
#define serial_direction DDRB
#define serial_pins PINB
#define serial_pin_in (1 << PB3)
#define serial_pin_out (1 << PB4)

#define node_id '1'

void get_char(volatile unsigned char *pins, unsigned char pin, char *rxbyte) {
  //
  // read character into rxbyte on pins pin
  //    assumes line driver (inverts bits)
  //
  *rxbyte = 0;
  while (pin_test(*pins,pin))
    //
    // wait for start bit
    //
    ;
  //
  // delay to middle of first data bit
  //
  half_bit_delay();
  bit_delay();
  //
  // unrolled loop to read data bits
  //
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 0);
  else
    *rxbyte |= (0 << 0);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 1);
  else
    *rxbyte |= (0 << 1);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 2);
  else
    *rxbyte |= (0 << 2);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 3);
  else
    *rxbyte |= (0 << 3);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 4);
  else
    *rxbyte |= (0 << 4);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 5);
  else
    *rxbyte |= (0 << 5);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 6);
  else
    *rxbyte |= (0 << 6);
  bit_delay();
  if pin_test(*pins,pin)
    *rxbyte |= (1 << 7);
  else
    *rxbyte |= (0 << 7);
  //
  // wait for stop bit
  //
  bit_delay();
  half_bit_delay();
}

void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {
  //
  // send character in txchar on port pin
  //    assumes line driver (inverts bits)
  //
  // start bit
  //

  clear(*port,pin);
  bit_delay();
  //
  // unrolled loop to write data bits
  //
  if bit_test(txchar,0)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,1)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,2)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,3)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,4)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,5)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,6)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  if bit_test(txchar,7)
    set(*port,pin);
  else
    clear(*port,pin);
  bit_delay();
  //
  // stop bit
  //
  set(*port,pin);
  bit_delay();
  //
  // char delay
  //
  bit_delay();
}
void put_string(volatile unsigned char *port, unsigned char pin, PGM_P str) {
  //
  // send character in txchar on port pin
  //    assumes line driver (inverts bits)
  //
  static char chr;
  static int index;
  index = 0;
  do {
    chr = pgm_read_byte(&(str[index]));
    put_char(&serial_port, serial_pin_out, chr);
    ++index;
  }
  while (chr != 0);
}

void flash() {
  //
  // LED flash delay
  //
  clear(led_port, led_pin);
  led_delay();
  set(led_port, led_pin);
}

int main(void) {
  //
  // main
  //
  static char chr;
  //
  // set clock divider to /1
  //
  CLKPR = (1 << CLKPCE);
  CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);
  //
  // initialize output pins
  //
  set(serial_port, serial_pin_out);
  input(serial_direction, serial_pin_out);
  set(led_port, led_pin);
  output(led_direction, led_pin);
  //
  // main loop
  //
  while (1) {
    get_char(&serial_pins, serial_pin_in, &chr);
    //flash();
    if (chr == node_id) {

      //flash();
        set(led_port, led_pin);
     
      input(serial_direction, serial_pin_out);
    }else if(chr =='0'){
        clear(led_port, led_pin);

    }
  }
}
ASSIGNMENT COMPLETED
<==  PREVIOUS  -                                 -   ASSIGNMENTS   -                                   - NEXT  ==>