9. Embedded programming¶
Individual Assignment:
- Read a microcontroller data sheet
- Program your board to do something with as many different programming languages and programming environments as possible
Group Assignment:
- Compare the performance and development workflows for other architectures
INDIVIDUAL ASSIGNMENT¶
This week I analize the response of the ATTINY44A with Asembler, C++ Native and Arduino IDE.
1. The summarize of Attiny44A¶
The Attiny44A datasheet we can download in this page.
The first information to learn is the internal structure of microcontroller:
We can see the connection of: - Flash Program Memory - Instruction Register - Instruction DEcoder - ALU - Data SRAM - Register - Internal Resources
In the figure 4-2 we can see the list of working registers from R0 to R31:
In the Figure 4-5 we can see the Cycle ALU operation, it operation is considerated a cycle.
In the Figure 5.1 we can see the address program memory from the Attiny:
In the Figure 5.2 we can see the address data memory from the Attiny:
In the Figure 6-1 we can see the Clock Distribution to work the internal resources:
In the Figure 8-1 we can see the Reset Logic to work the internal resources:
In the following Figure we can see the SREG register to control the Counter Program:
In the following figure we can see the SREG explained, bit to bit:
The microcontroller has Instruction in Assembler to work, with ARITHMETIC and LOGIC INSTRUCTIONS, that instruction are executing on ALU unit:
Also the microcontroller has BRANCH INSTRUCTIONS:

Also the microcontroller has BIT and BIT TEST INSTRUCTIONS:

Also the microcontroller has DATA TRANSFER INSTRUCTIONS:

Also the microcontroller has MCU CONTROLS INSTRUCTIONS:

2. Programming in Native Assembly in Atmel Studio¶
The software Atmel Studio 7.0 where you can download the installer and install the software.
I create a new project:

Choose the Assembler project and write the name project:

Choose the Attiny44A microcontroller in the search area, and click and OK button to create the project:

We can see the initial code to project, but I change to Blink Led with assembler code:

Write the code to Blink Led in PA3 pin to Attiny44A:

To use the USPtiny programmer we configurate in the menu Tools -> External Tools:

Add a external tools with:
- Title: Name of tool -> AVRDUDE
- Command: Address of the tool -> C:\Avrdude\avrdude.exe
- Arguments: To program -> -C C:\Avrdude\avrdude.conf -v -p attiny44 -c usbtiny -U flash:w:”$(OutDir)Debug\$(TargetName).hex”:i

Now I build the project to create the HEX file:

The project is compiled and build the Hex file is successed:

Now we can load the HEX file with the USBtiny in the external tools:

The Hex file is loaded successful

3. Programming in Native C++ in Atmel Studio¶
When we programming with the Atmel Studio Platform the proccess to create Project in C++ is same to ASM Project, then this part we do not explain because it is repeat.
After we create the project we can program in C++ with libraries from AVR microcontrollers, it is insatalled in Native software Atmel Studio.
Then we can see the program to create a BLINK process to LED:

Choose the C++ project to create:

Choose the Attiny 44 as microcontroller:

Write the program to blink with the libraries of Atmel Studio Software:

4. Programming in Arduino IDE¶
To program in Arduino IDE the Attiny44 microcontroller, we must have the Attiny Compiler added in Arduino IDE0, and then we can learn the number pins:

We design the following program to Blink example to Attimy44A:
//****************************************************
// Ulises Gordillo Zapana - FabAcademy 2020
//****************************************************
#define pin_tx 8
#define pin_rx 7
#define pin_but 6
#define pin_buz 5
#define pin_cardio 4
#define pin_led 3
#define pin_ldr A2
#define pin_led_car 1
#define pin_pot 0
// Function SETUP
void setup() {
pinMode(pin_but,INPUT);
pinMode(pin_buz,OUTPUT);
pinMode(pin_cardio,OUTPUT);
digitalWrite(pin_cardio,HIGH);
pinMode(pin_led,OUTPUT);
pinMode(pin_led_car,OUTPUT);
}
// Function LOOP
void loop(){
digitalWrite(pin_led,HIGH);
delay(1000);
digitalWrite(pin_led,LOW);
delay(1000);
}
To program Attiny, we must add the Attiny44 resource, and choose the Attiny44 with external crystal of 20MHz

Following we choose the programmer to USBtinyISP:

Following we can program with a external programmer as USBtinyISP

And Finally the microcontroller was programmed with Arduino IDE and USBtinyISP:

5. Project with Ultrasonic Sensor and Attiny44¶
In this project, the distance from the sensor to a flat object will be measured, which will make the buzzer emit a sound.
The sensor used is the HC-SR04 and the program is as follows:
#define pin_trig 7
#define pin_echo 8
#define pin_buz 4
void setup() {
pinMode(pin_trig, OUTPUT); //pin como salida
pinMode(pin_echo, INPUT); //pin como entrada
pinMode(pin_buz, OUTPUT); //pin como salida
digitalWrite(pin_buz, HIGH);
digitalWrite(pin_trig, LOW); //Inicializamos el pin trigger con 0 logico
}
void loop(){
long t; //tiempo que demora en llegar el ECO
long d; //distancia en centimetros
digitalWrite(pin_trig, HIGH);
delayMicroseconds(10); //Enviamos un pulso de 10us
digitalWrite(pin_trig, LOW);
t = pulseIn(pin_echo, HIGH); //obtenemos el ancho del pulso
d = t/59; //escalamos el tiempo a una distancia en cm
if (d<10){
digitalWrite(pin_buz, LOW);
}
else{
digitalWrite(pin_buz, HIGH);
}
}
We can see how it works in the following video:
GROUP ASSIGNMENT¶
Compare the performance and development workflows for the following architectures, all in the blink program to compare the delay routines:
- PIC18F2550
- ESP8266
- ESP32
- Attiny44A
1. Comparing the functionality¶
Table to Blink Process in diferent architectures:
| Architecture | Frecuency | Cycle (seg) | Duty (%) |
|---|---|---|---|
| Ideal | 0.500Hz | 2.000 s | 50.0 % |
| Microchip PIC18F2550 in C | 0.508Hz | 1.966 s | 50.8 % |
| Espressif ESP8266 in C | 0.484Hz | 2.064 s | 51.5 % |
| Espressif ESP32 in C | 0.487Hz | 2.053 s | 45.4 % |
| AVR Attiny44A in C | 0.538Hz | 1.858 s | 50.8 % |
2. Testing the PIC18F2550 in C++¶
In this part I program the PIC18F2550 from Microchip Company in C++ and program with the PICKIT 3 programmer; We can download the CCS C for PIC Software in http://www.ccsinfo.com/
Execute the CCS C Software:

In the menu choose Project->Pic Wizard to create a project:

Choose the name of the project and save in a folder:

Choose the microcontroller PIC18F2550, the word frecuency to 20MHz and configuration the word bits:

Choose the Blink LED template on the C0 pin of PIC with 1000 miliseconds to work:

The program is ready to load the board:

In the menu choose Compile -> Build to compile and build the HEX file:

When the compiler build the project, it create other files as COF and HEX files, we need the HEX files to load the microcontroller PIC:

I connect the PICKit 3 programmer from Microchip and install the PICKit 3 software to program the PIC18F2550:

The software recognize the PIC and it is ready to work:

I import the Hex file to software, I went the address file:

The Hexadecimal data is load to PICKit 3 software:

I click to Write button to load the HEX data to PIC18F2550:

Now, We can see the board working with the blinking Led:

We can see the board with the signal in the Oscilloscope:

3. Testing the ESP8266 in C++¶
The ESP8266 is a SOC chip from ESPRESSIF Company, in the page https://www.espressif.com/en/products/socs/esp8266 we can learn more about it.
I will program it with Arduino IDE and I will configurate to do it.
First I download the libraries to Arduino IDE from the Development page, it is http://arduino.esp8266.com/stable/package_esp8266com_index.json

In the menu choose Tools -> Board -> Manager Board to load the profile and compiler ESP8266 board:

In the search area to write esp8266 to filter the files:

I choose the esp8266 by ESP8266 Community and install this tools to work with the Lolin Boord:

I choose the board to work with the blink program:

Open the blink example and change the ledblinking variable to 2 pin to Lolin Board:
To load the compilled file I press the RESET Button:

And finally the program is loaded:

We can see the board with the signal in the Oscilloscope:

4. Testing the ESP32 in C++¶
The ESP32 is a SOC chip from ESPRESSIF Company, in the page https://www.espressif.com/en/products/socs/esp32 we can learn more about it.
I will program it with Arduino IDE and I will configurate to do it.
First I download the libraries to Arduino IDE from the Development page, it is https://dl.espressif.com/dl/package_esp32_index.json, I copy and paste in Preferences in Arduino Menu:

In the menu choose Tools -> Board -> Manager Board to load the profile and compiler ESP8266 board:

In the search area to write esp32 to filter the files:

I choose the esp32 by Espressif Systems and install this tools to work with the boord:

Then the files were installed:

I choose the board to work with the blink program:

Open the blink example and change the ledblinking variable to 2 pin to board:

I load the program to board and it is ready to work and test:

We can see the board with the signal in the Oscilloscope:

5. Testing the Attiny44A in C++¶
The programming and loading process we can see in the individual assignment.
We can see the board with the signal in the Oscilloscope:

Designed Files¶
| Description | Files |
|---|---|
| Ultrasonic Sensor Project | Ultrasonic.ino |
| Cpp File from PIC18F2550 | Blink_18F.c |
| Header File from PIC18F2550 | Blink_18F.h |
| ASM File | Blink_44.asm |
| Arduino File | Blink_44.ino |