INPUT

In this assignment we had to design and build a wired &/or wireless network connecting at least two processors.

LESSON >> video recording - web

PROCESS

I used the asynchronous system from the serial protocol, so I took the hello bus sample. I only used the sample bridge.
For both nodes I made a redesign adding some leds in each one. Bridge (1 led) - Node 1 (2 leds) - Node 2 (3 leds)


Using the modela and the mill 1/64 for traces and 1/32 for cut I made my PCB.
The final PCBs: 1 bridge + 2 nodes:
Now it is time to create the bus cable.

Programming using Arduino and the C code from Neil: hello.bus.45.c.

I used knowledge acquired in my work Embedded Programming. This is the program. :

            //
            //
            // hello.bus.45.c
            //
            // 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 
            #include 
            #include 
            #include 
            
            #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 '0'
            
            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) {
                     output(serial_direction, serial_pin_out);
                     static const char message[] PROGMEM = "node ";
                     put_string(&serial_port, serial_pin_out, (PGM_P) message);
                     put_char(&serial_port, serial_pin_out, chr);
                     put_char(&serial_port, serial_pin_out, 10); // new line
                     led_delay();
                     flash();
                     input(serial_direction, serial_pin_out);
                     }
                  }
               }
            


You have to change this line for the number that you designed to each node, for exxample, for bride "0" and for nodes "1" and "2",
            #define node_id '0'
            


Time to program my pcb:


OUTPUT

I had some connections erros, maybe I had problem with solder and my pcbs will not work again.
Here is the image of the error:.
The good news is that I learnt this assignment checking the work in real time of my partners.



>>> COMMENTS