Lompat ke konten Lompat ke sidebar Lompat ke footer

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:

ATtiny13 Serial, ATtiny13 UART, ATtiny13 Arduino IDE, AVR ATtiny13, ATtiny13 Serial Communication, ATtiny13 Schematics, ATtiny13 Serial Schematics, ATtiny13 FTDI
Rangkaian ATtiny13 Serial

Setelah rangkaian selesai, silahkan buka serial monitor pada arduino, lalu lakukan pengujian kode program.


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 Kini Saya Ngerti. Semoga bermanfaat.



Sumber: https://habr.com/en/post/250995/

Posting Komentar untuk "ATtiny13 UART Komunikasi Serial Arduino"