tahamajs's picture
|
download
raw
11.6 kB
# Computer Assignment No. 1
## Communication Protocol Simulation
**Course:** Embedded Systems (Bare‑Metal)
**Instructor:** Dr. Mehdi Shokri‑Saz
**Teaching Assistants:** Dr. Mohsen …
**Assignment Designers:** Sohrab Moradi, Aryan Firoozi, Hatef Rezaei
**Field:** Computer Engineering
**Semester:** Second Semester 1404–1405
---
# Project Title
**Simulation of Communication Protocols**
---
# 1. Introduction
In this assignment, we aim to make the simulation of embedded systems more realistic by **adding communication protocols** to the system.
This assignment consists of **three implementation sections**, each followed by several questions:
• Implementation of an **Address‑Based Protocol (I2C)**
• Implementation of a **Full‑Duplex Protocol (USART)**
• Implementation of an **I2C Multiplexer**
In the following sections, the details and expected behavior of each part are explained.
⚠ **Important:**
Before implementing each part, carefully read the **coding guide** provided.
---
# 2. Implementation of an Address‑Based Protocol (I2C)
The provided code base creates an environment to simulate connections between different hardware components.
Connecting two or more physical modules requires not only **hardware connections**, but also **software and protocol agreements**.
In this assignment, hardware connections are already simulated, and the goal of this section is to **add support for the I2C protocol**.
The protocol implemented here is a **simplified version of the real I2C protocol**.
---
## Hardware Requirements
The protocol requires four pins between the **sensor board** and the **microcontroller**:
• **SCL** – Clock bus
• **SDA** – Data bus
• **GND** – Ground
• **VDD** – Power supply
These pins must be connected **pairwise between the sensor and microcontroller**.
---
## I2C Communication Process
The protocol works as follows:
### Step 1
The **microcontroller writes the destination sensor address** on the SDA line.
Each sensor has a predefined address.
Example:
VL530X sensor address = **0x29 (HEX)**
---
### Step 2
If a sensor detects its own address, it sends an **ACK bit** on the SDA line.
After that, the sensor can **send the data it has received from the environment**.
---
### Step 3
Once the microcontroller receives the ACK bit, it becomes ready to **read data from the sensor**.
The sensor and microcontroller stay synchronized using the **SCL clock line**.
For simplicity in the simulator:
• The **SCL line is automatically connected to the microcontroller clock**
• You **do not need to generate or control the clock signal**
---
## Task
You must:
1. Connect a **microcontroller and a sensor**
2. Implement the **I2C protocol**
3. Use it to **transfer data between the two devices**
The required data format is described in the **coding guide**.
---
# Questions
### 1
Since **I2C is a bus protocol**, what problems occur if **multiple sensors with the same address** are connected?
### 2
Compared to the **real I2C protocol studied in class**, mention **four general weaknesses** of this simplified implementation.
### 3
Explain the functionality of:
• `ByteVector`
• `ByteStream`
• `getByte`
---
# Coding Guide
The project includes:
• **ESP8266 board**
• **VL530X sensor**
Each board has a **GPIO interface**.
Board files:
ESP8266
```
{PROJECT_DIR}/include/CPS4042/Hardwares/Boards/Esp8266.h
```
VL530X
```
{PROJECT_DIR}/include/CPS4042/Hardwares/Sensors/VL530X.h
```
---
## GPIO
The GPIO interface contains multiple pins used for different hardware functions.
For example:
• Presence of **SDA and SCL pins** indicates that the board supports **I2C communication**.
Both boards include a subclass named:
```
I2C
```
---
# Implementing the I2C Class
Your task is to implement the **I2C protocol class**.
It contains **four functions**.
---
### 1. run()
Executed automatically in every **CPU cycle**.
Inside this function you must implement the **internal logic of the protocol**, including:
• detecting addresses
• storing data
• handling received bits
---
### 2. init()
Called inside the **setup() function of the sketch**.
Here you must **set the address of the sensor** you want to communicate with.
---
### 3. read() and write()
These functions act as the **protocol API**.
Inside the sketch's `loop()` you should call them using the protocol object.
Example usage is shown in the document.
---
### 4. Helper utilities
Some required functions are provided in:
```
Protocols::AbstractI2C
AbstractProtocol
```
You should use these helpers to implement the protocol.
---
# main Function
You must create instances of the boards and connect them together.
Example:
Two instances of boards are created and **linked together using Link objects**.
Important macros:
```
CPS_SET_OBJECT_NAME
CPS_SET_OBJECT_NAME_PTR
```
These help with **debugging and logging**.
Also remember to call:
```
exec()
```
at the end of the `main()` function.
This simulates **connecting two boards in the real world**.
---
# Sketch Classes
The two boards are controlled by two sketches:
• `MicroController`
• `Sensor`
Both are subclasses of:
```
Sketch
```
These sketches simulate **Arduino‑style programming**.
They contain:
```
setup()
loop()
```
• `setup()` runs once
• `loop()` runs repeatedly
Sketch files must be placed in:
```
{PROJECT_DIR}/include/CPS4042/Sketchs
```
---
# Sensor Behavior
The sensor must return a **random number between 0 and 4000**.
Because the protocol works with **bytes**, the number must be transmitted using:
• **2 bytes** for the number
• **1 byte checksum**
Checksum:
```
checksum = larger_byte − smaller_byte
```
The checksum is always **non‑negative**.
On the microcontroller side:
1. Read the three bytes
2. Verify the checksum
3. If valid → print the result
Useful classes:
```
Utils/ByteStream
Units/Byte
ByteVector
getByte
```
---
# USART Full Duplex Protocol
In the second part, you must implement a simplified version of the **USART protocol**.
USART is used for **serial communication** and supports **Full Duplex communication**, meaning:
Both devices can **send and receive data simultaneously**.
---
## USART Pins
• **TX** – Transmit
• **RX** – Receive
• **VDD** – Power
• **GND** – Ground
Important:
The **sensor wiring is reversed** relative to the microcontroller:
```
TX ↔ RX
```
---
# Task
Simulate a **Hard Disk device** that communicates with the microcontroller via USART.
Procedure:
1. Microcontroller sends an **address (0–255)** through TX
2. Hard disk receives it
3. Hard disk returns the corresponding **data through RX**
A partially implemented sketch is already provided.
---
# USART Frame Structure
Data is transmitted as **frames** consisting of:
• Start Bit
• Data Bits
• Parity Bit
• Stop Bit
---
## Frame Details
### Start Bit
Normally the line is **HIGH (1)**.
To start transmission the sender pulls it **LOW (0)**.
---
### Data Bits
Usually **8 bits**.
They are transmitted **LSB first**.
This part is already implemented internally.
You only need to use:
```
write()
```
---
### Parity Bit
Used for error detection.
Types:
• Even
• Odd
(Not required for this assignment.)
---
### Stop Bit
One or two bits with value **1**.
Indicates end of frame.
Already implemented.
You only need to listen for incoming data inside:
```
run()
```
using
```
hasBitToRead()
```
---
# Example Frame
Sending data:
```
01010101
```
Frame:
```
Start | Data | Stop
1 | 01010101 | 0
```
Transmission line:
```
1 01010101 0
```
---
# Questions
### 1
Why are **start and stop bits not confused with data bits**?
### 2
Without a clock signal, how does USART **synchronize and detect data bits**?
### 3
Is it possible to implement USART **purely in software using digital pins** if the microcontroller has no hardware USART module?
Explain your reasoning.
---
# Coding Guide
You must implement a board that supports the **USART protocol**.
This board must contain the subclass:
```
USART
```
Important settings:
Do NOT set the board frequency to **Driven**.
Set:
```
BaudRate = BaudRates::NotSpecified
BitRate = BitRates::same(BaudRates::NotSpecified)
```
You must also create required **GPIO pins**.
Place the board in:
```
Hardwares/Comm
```
Use the **VL530X constructor** as an example for installing the protocol in the processor.
The processor can manage **multiple protocols simultaneously**.
---
⚠ Important
Do NOT modify the **Transmitter class**.
Using the protocol functions correctly should avoid logic errors.
---
# Part 3 — I2C Multiplexer
In this part, several sensors must connect to the microcontroller through **I2C**.
However, sensors with **identical addresses cannot share the same I2C bus**.
Solution:
Use an **I2C Multiplexer (I2C MUX)**.
---
# System Architecture
```
Microcontroller
│
USART
│
I2C MUX
│
Multiple I2C Channels
│
Sensors
```
---
# System Operation
1. Microcontroller sends a **channel selection command via USART**
2. MUX activates the selected **I2C channel**
3. Sensor communicates with the MUX through I2C
4. Sensor data goes to the MUX
5. MUX forwards the data to the microcontroller through USART
---
# Advantages of I2C MUX
• Connect multiple sensors with identical addresses
• Prevent I2C bus conflicts
• Easier sensor management
• Increase number of sensors connected to system
---
# Task
Create **at least two sensors** with different data ranges.
Example:
Sensor 1 → numbers between **0–20**
Sensor 2 → numbers between **50–100**
Or another sensor returning **characters of a string**.
The microcontroller should:
• Use a **static counter**
• Select sensors sequentially through the MUX
• Read and print their data
---
You must implement:
```
I2C Mux class
```
inside:
```
Hardwares/Comm
```
Creating a **generic reusable I2C class** that can be instantiated multiple times will give **extra credit**.
---
# Questions
### 1
Explain the function **reverse()** in `Byte.h`.
Where is it used?
Is such an operation realistic in real hardware systems?
---
### 2
Explain the difference between the functions in:
```
Bit.h
takeNthBit
```
---
### 3
Explain the function:
```
Board::attachPinToCommunicationClock
```
both in terms of **code implementation and purpose**.
---
# Final Notes
Deadline:
**1405/02/11 — 23:59**
---
### Group Work
Projects must be completed in **groups of 4**.
---
### Language and Libraries
Use:
• **C++ (C++20)**
• **Boost library**
The simulator uses **Boost header‑only modules**, so you do not need to build Boost.
---
### Compilation
If you are using Windows, a **precompiled build** is provided.
Make sure the **include paths are correctly set in `CMakeLists.txt`**.
---
### Grading
Part of your grade depends on:
• Clean code structure
• Clear documentation
• A well‑written report
Submissions **without a report will not be graded**.
Reports can be written in:
• **Markdown (.md)**
• **Word**
---
### Academic Integrity
The goal is learning. Please complete the assignment yourselves and collaborate properly with your team.
---
### Questions
Ask questions in the **discussion forum** when possible.
For private questions contact:
Aryan.Firoozi@ut.ac.ir
Hatef.Rezaee@ut.ac.ir
M.Moradi1998@ut.ac.ir

Xet Storage Details

Size:
11.6 kB
·
Xet hash:
6824d4f3c307f98346424699d609f19e15661aa3474fcba8ee2e4a314880a90c

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.