ATtiny13 UART Serial
ATtiny13 UART Cara Komunikasi Serial Antara ATtiny dan Komputer – Bila kita membuat sebuah projek, terkadang kita butuh metode debug.
Dengan metode debug 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 dis 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 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 terdiri dari program mengirim (TX) dan menerima (RX). Namun perlu diperhatikan bahwa program belum sama seperti program serial pada umunya.
Untuk mengirimkan data, program dapat mengirim Sring. Namun untuk membaca data, program 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)< /span> {
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] = ' ';
// 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 span> = 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 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 K Saya Ngerti. Semoga bermanfaat.
Sumber: https://habr.com/en/post/250995/