ATtiny13 UART Komunikasi Serial Arduino
ATtiny13 UART Komunikasi Serial Arduino
ATtiny13 UART Cara Komunikasi Serial Antara ATtiny dan Komputer - Bila kita membuat sebuah projek, terkadang kita butuh metode debug.
Dengan metode debug ini kita akan mengirimkan data ke serial, sehingga kita dapat melihat respon dari program yang kita buat pada serial monitor.
ATtiny umumnya tidak memiliki komunikasi serial, layaknya seperti Arduino Uno. Pada arduino uno dapat kita lihat pada pin 0 dan 1 yang merupakan pin TX dan RX.
Untuk mengakali komunikasi serial pada avr ATtiny13, kita akan memanfaatkan USI (Universial Serial Interface). Dengan USI kita dapat berkomunikasi antara attiny arduino ide.
A. ATtiny13 Serial Schematics
Sebelum anda menggunakan rangkaian dibawah, perlu diperhatikan disini kita menggunakan dua rangkaian.
Rangkaian untuk memprogram ATtiny13 dan Rangkaian untuk komunikasi serial.
Untuk dapat memprogram ATtiny13 Arduino IDE, anda dapat membaca pada artikel Cara Burn Bootloader dan Program ATtiny13 Dengan Arduino. Kode program anda dapat melihat kode program dibawah.
Setelah anda memprogram ATtiny13 dengan kode program dibawah, selanjutnya kita akan menguji ATtiny13 untuk komunikasi via serial.
Pada tutorial ini saya menggunakan modul FTDI. Selain modul itu, anda dapat menggunakan modul yang lain seperti CH340 atau sejenisnya.
Lalu hubungkan pin antara FTDI dan ATtiny13 seperti pada gambar berikut:
![]() |
Rangkaian ATtiny13 Serial |
B. ATtiny13 Serial Progam Code
Progam ini terdiri dari program mengirim (TX) dan menerima (RX). Namun perlu diperhatikan bahwa program ini belum sama seperti program serial pada umunya.
Untuk mengirimkan data, program ini dapat mengirim Sring. Namun untuk membaca data, program ini hanya mampu menerima integer.
Pengembangan masih perlu dilakukan. Berikut adalah program arduino ide attiny.
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile uint8_t uart; uint8_t temp; volatile uint8_t count; volatile uint8_t start; volatile uint8_t c; volatile uint8_t uart_data; volatile uint8_t Rece_bit; volatile uint8_t rec; volatile uint8_t usart_r; volatile uint8_t baudSpeed; ISR(INT0_vect) { rec = 1;// Interrupt is purely to determine the start bit when receiving, // rarely used, you can hang something else here } ISR(TIM0_COMPA_vect) { TIMSK0 = 0x00; TCCR0B = 0x00; // Single Timer, used to form a clear gap OCR0A = 0; // between bits, both when receiving and when transmitting c = 1; TCNT0 = 0; TIMSK0 = 0x04; TCCR0B = 0x02; // The value "reset on match" is loaded each time from the variable OCR0A = baudSpeed; // You can quickly change the UART speeds Rece_bit = 1; } int send (uint8_t data) { if (count >= 8) { PORTB |= (1 << 4); start = 0; temp = 0; c = 0; count = 0; TIMSK0 = 0; TCCR0B = 0; OCR0A = 0; goto nah; } if (c == 1) { if (start == 0) { temp = 0x80; start = 1; count--; goto razvet; } temp = data; temp = temp >> count; temp = temp << 7; razvet: switch (temp) { case 0x80 : PORTB &= ~(1 << 4); break; case 0x00 : PORTB |= (1 << 4); break; } count++; c = 0; } nah:; } void mySerial_print(char *text) { while (*text) { UART_trans(*text++); } } void mySerial_println(char *text) { while (*text) { UART_trans(*text++); } UART_trans('\n'); } void itoa(uint16_t n, char s[]) { uint8_t i = 0; do { s[i++] = n % 10 + '0'; } while ((n /= 10) > 0); s[i] = '\0'; // Reversing uint8_t j; char c; for (i = 0, j = strlen(s) - 1; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } } void send_num(char *text, uint16_t n) { char s[6]; itoa((uint16_t)n, s); mySerial_print(text); mySerial_print(s); } int UART_trans(uint8_t data) { uint8_t f; data = ~data; baudSpeed = 123; TIMSK0 = 0x04; TCCR0B = 0x02; for (f = 0; f < 10; f++) { while (c == 0); send(data); } start = 0; temp = 0; c = 0; count = 0; TIMSK0 = 0; TCCR0B = 0; OCR0A = 0; baudSpeed = 0; } int UART_receiv(void) { uint8_t a; usart_r = 0; MCUCR = 0x02; // INT0 Interrupt GIMSK = 0x40; // INT0 Interrupt while (rec == 0); // Wait until the start bit happens MCUCR = 0; // INT0 Interrupt GIMSK = 0; // INT0 Interrupt baudSpeed = 123; TIMSK0 = 0x04; TCCR0B = 0x02; rec = 0; TCNT0 = 0xDC; for (a = 0; a < 9; a++) { while (Rece_bit == 0); if (bit_is_set(PINB, 1)) { usart_r |= (1 << 7); } else { usart_r &= ~(1 << 7); } usart_r = usart_r >> 1; Rece_bit = 0; } } int main(void) { DDRB &= ~(1 << 1); // set to RX (INPUT) DDRB |= (1 << 4); // set to TX (OUTPUT) asm("sei"); while (1) { UART_receiv(); // Receive a byte first _delay_ms(10); // Pause for clarity UART_trans(usart_r); // Send back to serial //mySerial_println("123"); } }
UART_receive()digunakan untuk menerima data. UART_trans() digunakan untuk mengirim data. Kedua fungsi ini hanya menerima dan mengirim 1 karakter.
Untuk mengirim data String, gunakan fungsi mySerial_print() atau mySerial_println().
Gunakan Serial Monitor untuk melihat respon dari komunikasi serial attiny13a arduino ide.
C. ATtiny13 Datasheet
Jika anda butuh datasheet ATtiny13, anda dapat membaca datasheetnya berikut:
Semoga artikel ATtiny13 UART Cara Komunikasi Serial Antara ATtiny dan Komputer dapat membantu projek anda.
Terima kasih telah berkunjung pada website Chip Piko. Semoga bermanfaat.
Sumber: https://habr.com/en/post/250995/
Posting Komentar untuk "ATtiny13 UART Komunikasi Serial Arduino"