Saturday, May 28, 2011

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.

No comments:

Post a Comment

Terima kasih atas komentar yang anda sampaikan , sehingga dapat menambah wawasan saya sebagai penulis dan membuat blog ini semakin berguna banyak orang