Selasa, 05 Agustus 2008

Mendapatkan second serial di ATMEGA32 (Soft UART)

Apabila dibutuhkan lebih dari 1 serial port, maka bisa menggunakan softuart, yaitu uart yang dibuat oleh software. pin untuk TX dan RX adalah:

TX : Pin 19 (OC1A)
RX : Pin 20 (ICP1)

Sedangkan source codenya adalah:

#include < avr/io.h>
#include < avr/interrupt.h>
#include < inttypes.h>
#include < avr/iom32.h>
#include < stdio.h>
#include < math.h>
#include < avr/pgmspace.h>
#include < avr/eeprom.h>
#include < avr/wdt.h>

#define F_OSC 11059200
#define SOFT_BAUD 9600 // Software uart baud rate

#define BIT_TIME (unsigned short)((F_OSC + SOFT_BAUD/2) / SOFT_BAUD)
#define kbhit() (srx_done)

volatile unsigned char stx_count;
unsigned char stx_data;

volatile unsigned char srx_done;
unsigned char srx_data;
unsigned char srx_mask;
unsigned char srx_tmp;

SIGNAL( SIG_INPUT_CAPTURE1 )
{
OCR1B = ICR1 + (unsigned short)(BIT_TIME * 1.5);
srx_tmp = 0;
srx_mask = 1;
TIFR = 1 << OCF1B;
if( !(SRXPIN & 1 << SRX))
TIMSK = 1 << OCIE1A^1 << OCIE1B;
}

SIGNAL( SIG_OUTPUT_COMPARE1B )
{
unsigned char in = SRXPIN;

if( srx_mask )
{
if( in & 1 << SRX )
srx_tmp |= srx_mask;
srx_mask << = 1;
OCR1B += BIT_TIME;
}
else
{
srx_done = 1;
srx_data = srx_tmp;
TIFR = 1 << ICF1;
TIMSK = 1 << TICIE1^1 << OCIE1A;
}
}

SIGNAL( SIG_OUTPUT_COMPARE1A )
{
unsigned char dout;
unsigned char count;

OCR1A += BIT_TIME;
count = stx_count;

if( count )
{
stx_count = --count;
dout = 1 << COM1A1;
if( count != 9 )
{
if( !(stx_data & 1) )
dout = 1 << COM1A1^1 << COM1A0;
stx_data >>= 1;
}
TCCR1A = dout;
}
}

void suart_init( void )
{
OCR1A = TCNT1 + 1;
TCCR1A = 1 << COM1A1^1 << COM1A0;
TCCR1B = 1 << ICNC1^1 << CS10;

TIFR = 1 << ICF1;
TIMSK = 1 << TICIE1^1 << OCIE1A;

stx_count = 0;
srx_done = 0;
STXDDR |= 1 << STX;
}

unsigned char sgetchar( void )
{
while( !srx_done );
srx_done = 0;
return srx_data;
}

void sputchar( unsigned char val )
{
while( stx_count );
stx_data = ~val;
stx_count = 10;
}

void sputs( char *txt )
{
while( *txt )
sputchar( *txt++ );
}

int main(void)
{
DDRD=0xbe;

while (1)
{
sputs(“Kirim string\r\n”);
}
}

Keterangan source code:
1. Untuk mengirimkan string, gunakan sputs();
2. Untuk mengirimkan 1 karakter, gunakan sputchar();
3. Untuk menerima data dari serial, cek dahulu apakah ada data baru dengan kbhit(), jika true berarti ada data masuk, ambil data dengan fungsi sgetchar();
4. Untuk softuart tidak ada fasilitas interupsi.

4 komentar:

Unknown mengatakan...

Salam,

Mas, saya lagi ngerjain sesuatu yang butuh software UART untuk ATMega16.. Saya sudah coba pakai beberapa contoh yang saya dapat hasil googling dan tanya2 di forum. Tapi semuanya gagal di ATMega16, sedangkan ada yang berhasil waktu dicoba di ATMega8. Bisa minta saran? Jika berkenan mohon email saya di r.satrioadi[at]gmail.com

Terima kasih banyak..

Ugly Duclin' mengatakan...

mas satrio,
untuk second serial, kemungkinan salah memilih pin OC1A dan ICP1, coba liat lg di datasheetnya. Saya coba di atmega 16 dan atmega 32 tidak ada masalah.
thanks,
riza

"BLOG FaRiEs" mengatakan...

mas itu pake bahasa c avrkan? kok saya coba di code vision gak bisa ya, ada library yang gak di kenal ya, cntohnya
#include < avr/io.h>
#include < avr/interrupt.h>
#include < inttypes.h>
#include < avr/iom32.h>
#include < avr/pgmspace.h>
#include < avr/eeprom.h>
#include < avr/wdt.h>



SIGNAL( SIG_INPUT_CAPTURE1 )
{

}

SIGNAL( SIG_OUTPUT_COMPARE1B )
{

}

SIGNAL( SIG_OUTPUT_COMPARE1A )
{

}


mohon bimbingannya mas baru pemula, terima kasih mas :)

Ugly Duclin' mengatakan...

mas, source code yg ada di saya skrg enggak bisa ke mmc yang kapasitasnya besar... skrg saya ambil dari:

http://www.dharmanitech.com/2009/01/sd-card-interfacing-with-atmega8-fat32.html

pake avrstudio bagus mas...
good luck :)