Laporan Akhir Modul 3 Percobaan 1 Praktikum Mikroprosesor dan Mikrokontroler






1. Prosedur [kembali]

    Langkah-langkah percobaan :

a. Tentukan percobaan dan kondisi yang akan dilakukan (Kondisi 6)

b. Siapakan alat dan bahan yang akan digunakan

c. Rangkai Rangkaian pada Board sesuai gambar percobaan 1 dengan komponen 4 push button, 2 Mikrokontroler STM32F103C8, 4 Resistor 220 Ohm, 4 LED  hubungkan menggunakan jumper. 

d. Buatlah program  pada software STM32Cube IDE dengan konfigurasi Pin Input dan Output berdasarkan pada Pin GPIO STM32 yang telah dirangkai di simulasi sebelumnya.

e. Kemudian, buatlah program untuk menghasilkan Output LED sesuai kondisi yang telah ditentukan.

f.  Hubungkan Laptop dengan STM32F103C8 dengan STlink 

g. Run Program, dan lihat output yang dihasilkan ketika push button ditekan



2. Hardware dan Diagram Blok [kembali]
        A. Hardware
            1. STM32F103C8



            2. Push Button



            3. LED




            4. Jumper

            5. Resistor



            6. Laptop


        B. Software
            1. STM32Cube IDE


       C. Blok Diagram




3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
           A. Rangkaian Simulasi

            B. Rangkaian Percobaan


            C. Prinsip Kerja
  • Pertama, sistem memulai dengan inisialisasi HAL (Hardware Abstraction Layer) untuk mengatur semua fungsi dasar dari perangkat keras. Kemudian, sistem clock dikonfigurasi agar semua modul bekerja secara sinkron sesuai frekuensi yang diinginkan. Selanjutnya, GPIO diinisialisasi untuk mengatur pin yang digunakan dalam komunikasi dan kontrol perangkat.

    Setelah itu, salah satu pin dikonfigurasi sebagai input untuk membaca status tombol, dan pin lain dikonfigurasi sebagai output untuk mengontrol LED. Di dalam loop utama, mikrokontroler terus membaca status tombol. Jika tombol ditekan, maka LED akan dinyalakan dan mikrokontroler dapat mengirimkan sinyal melalui UART ke mikrokontroler kedua, menandakan bahwa tombol ditekan. Jika tombol tidak ditekan, LED akan dimatikan dan mikrokontroler juga dapat mengirimkan sinyal status tersebut ke mikrokontroler kedua.

    Setiap pembacaan tombol dan pengiriman sinyal melalui UART disertai dengan delay selama 100 ms untuk menghindari bouncing tombol dan mengatur timing komunikasi. Mikrokontroler penerima yang juga terhubung melalui UART akan membaca data dari UART, kemudian mengontrol LED-nya sendiri sesuai dengan data yang diterima, misalnya jika menerima sinyal tombol ditekan maka LED menyala, dan sebaliknya. Dengan demikian, kedua mikrokontroler berkomunikasi secara serial menggunakan protokol UART untuk menyinkronkan status tombol dan LED di kedua sistem.

    
        

4. Flowchart dan Listing Program [kembali]
        A. Flowchart



        B. Listing Program  

Pada Tx
#include "main.h" UART_HandleTypeDef huart1; uint8_t buttonStates[4] = {'0', '0', '0', '0'}; uint8_t charToTransmit[5]; int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { buttonStates[0] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) ? '1' : '0'; buttonStates[1] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_SET) ? '1' : '0'; buttonStates[2] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == GPIO_PIN_SET) ? '1' : '0'; buttonStates[3] = (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4) == GPIO_PIN_SET) ? '1' : '0'; HAL_UART_Transmit(&huart1, buttonStates, 4, 100); HAL_Delay(100); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
Error_Handler();
}
}
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)    
{ Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void Error_Handler(void) { __disable_irq(); while (1) { } } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { } #endif


Pada Rx
#include "main.h" UART_HandleTypeDef huart1; uint8_t receivedData[4];
void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { if(HAL_UART_Receive(&huart1, receivedData, 4, 100) == HAL_OK) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, (receivedData[0] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, (receivedData[1] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, (receivedData[2] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, (receivedData[3] == '0') ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_UART_Transmit(&huart1, receivedData, 4, 100); } HAL_Delay(50); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler();    

} } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void Error_Handler(void) { __disable_irq(); while (1) { } }

    

5. Analisa [kembali]
       

1. Bagaimana protokol komunikasi UART pada kedua STM32F103C8?
Jawab:
        
Protokol UART (Universal Asynchronous Receiver Transmitter) memungkinkan dua mikrokontroler STM32 untuk saling berkomunikasi secara serial tanpa menggunakan sinyal clock eksternal. Komunikasi ini berlangsung melalui pin TX dan RX, di mana TX dari STM32 pertama dihubungkan ke RX STM32 kedua, dan sebaliknya. Protokol ini bersifat asinkron dan full duplex, yang memungkinkan data dikirim dan diterima secara bersamaan. Dalam praktiknya, pengaturan seperti baud rate, bit data, parity, dan stop bit harus disesuaikan pada kedua perangkat agar komunikasi berjalan lancar dan data tidak mengalami gangguan atau kesalahan.

Implementasi komunikasi UART antar STM32 dilakukan dengan menginisialisasi modul UART menggunakan library HAL atau tool seperti STM32CubeMX. Pada STM32 pengirim, data dibaca dari input (misalnya tombol), kemudian dikirim melalui UART, sementara STM32 penerima membaca data dari UART dan menggunakannya untuk mengontrol output (seperti LED).

6. Video Demo [kembali]



7. Download file [kembali]

Komentar

Postingan populer dari blog ini

KONTROL TANK AIR

Bsf

Modul 1 : Gerbang Logika Dasar & Monostable Multivibrator