من هرچی میگردم مطلب برای ارتباط سریال دو میکرو پیدا نمیکنم! همش ارتباط میکرو و کامپیوتر . . . (منم که هنوز مشکل پورت دارم!)
برای ارتباط دو میکرو چیکار کنم؟ فرقش با ارتباط با کامپیوتر رو میخوام. فقط پایه های فرستنده و گیرنده رو مستقیم به هم وصل کنم حله؟ دیگه چیزی اون وسط نمیخواد ؟
بالاخره امروز مبدل usb به com خریدم!!
16 تومن! خوبه؟! 9 تومنی هم داشت گفت این 16 بهتره! نویز گیر داره! منم که مشکل اساسیم همین نویزه! فکر کنم بخاطر رطوبت اینجاس ...
آقا من الان اینو چیکارش کنم ؟ اولا max232 که فعلا ندارم!
وسط بازار دوباره بی پولی خوردم برگشتم!
باید برم مادگیش رو بخرم؟یا نه؟! اگه مادگی باشه حتما یه رشته سیم بیرون میده دیگه!؟ چطوری تشخیص بدم کدوم پینه؟
درکل لطفا بگین چیکار کنم دستم به پین هاش برسه؟
(سوال پست قبل هم هست ....)
سلام.
اتصال دو میکرو به هم هیچ تفاوتی با اتصال میکرو به کامپیوتر نداره.
شما پایه TXD میکرو اول رو به RXD میکرو دوم و پایه RXD میکرو اول رو به TXD میکرو دوم مستقیماً (بدون نیاز به هیچ آیسی و ...) وصل کن و ....
بیا اینج
اhttp://forum.iranled.com/showthread.php?tid=13896
دوست عزیزمون درست میگن ولی ارتباط دو میکرو روشهای گوناگونی داره
i 2 c تو وایر
سریال
baud$ : برای تعیین نرخ سرعت اطلاعات
Print : برای ارسال اطلاعات به خروجی سریال
Inkey : متنظر می ماند تا اطلاعاتی از پایه سریال دریافت کند .
INPUTBIN : خواندن اطلاعات ورودی سریال به صورت باینری
و یه عالمه دستور دیگه
به عنوان مثال :
کد php:
$regfile = "m8def.dat"
$crystal = 1000000
baud = 19200
config portb = output
dim w as byte
do
w=inkey()
portb = w
loop
میکرو مورد استفاده رو مشخص کردیم
تعیین فرکانس کریستال ( مهمه چون نرخ اطلاعات با این تنظیم می شه )
تعیین نرخ اطالاعات سریال با باوود 19200
تعیین پورت b به عنوان خروجی
تعیین متغیر w به صورت 8 بیتی . 0 - 255
ابتدای حلقه
منتظ بمان تا زمانی اطلاعاتی از پایه سریال دریافت شود و اطلاعات دریافتی رو در متغییر W بریز
پورت B رابرابر متغییر W ( اطلاعات دریافتی ) کن .
انتهای حلقه
و به این صورت اطلاعات دریافتی از پورت سریال بر روی پورت B قرار گرفته و پایه های متناظر با اطلاعات دریافت شده یک و یا صفر می شوند .
برای اطلاعات بیشتر کتاب یه نفر رو بخون !
من کدویژن کار می کنم !!!!
اینو ببینید !
کد:
#include <mega32.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
delay_ms(1000);
putchar('#');
delay_ms(1000);
putchar('A');
}
کد:
#include <mega32.h>
int n = 0;
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if (data == '#')
{
n = 1;
}
else if (data == 'A')
{
n = 2;
}
else
{
n = 0;
}
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0xFF;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
// Global enable interrupts
#asm("sei")
while (1)
{
if (n == 1)
{
PORTA.0 = 1;
}
else if (n == 2)
{
PORTA.1 = 1;
}
};
}
اولی فرستنده بود دومی گیرنده! پایه txd اولی رو به پایه rxd دومی وصل کردم. از ترس نویز rxd اولی و txd دومی رو هم به زمین وصل کردم!
این کار درسته ؟! یعنی لازمه ؟!
بهر حال کار نمیکنه ! اولی دو تا کارکتر با فاصله زمانی 1 ثانیه میفرسته و دومی باید به ترتیب دو تا ال ای دی رو روشن کنه ! ولی نمیشه !!
تو رو خدا کمک کنید !
من تو تابع وقفه اونجا که با یه شرط مقدار n رو تغییر داده بودم رو پاک کردم بجاش n رو برابر 1 کردم. در اینصورت به محض اینکه یه کاراکتر فرستاده بشه باید پایه صفر پورت A خروجی بشه. ولی نمیشه ! انگار وقفه به کار نمی افته !
قسمت USART کدویزاد reciever و وقفه مربوط به اون رو فعال کردم. فقط همین ! مشکل چیه ؟!
مرد عنکبوتی نوشته است:از ترس نویز rxd اولی و txd دومی رو هم به زمین وصل کردم! این کار درسته ؟! یعنی لازمه ؟!
لازم نیست !
فرستنده رو زمین کردی !!! ( مواظب باش میکرو رو خراب نکنی ! )
درست نشد ! یه کد فرستنده گیرنده ساده میدین ؟ خواهش میکنم ... التماس . ... . . . . !! !
مهندس بیا بسکام !
اونطوری در خدمتیم !
درست شد! نمی دونم چرا ! امروز دوباره پروگرمشون کردم درست شد!! دیروز بیخود موقع پروگرم ارور می داد! 10 بار کلید پروگرم رو میزدم تا یه بارش عمل کنه! خب الان که مشکلی نداره افتادم تو خط ارتباطات ... !
ببینم تا قبل برگشتنم به دانشگاه می تونم برای بچه یه کنترل از راه دور بذارم گم نشه ! فعلا تنها مشکل بی پولیه! دوستان مایه دار هم یکم هوای ما فقیر فقرا رو داشته باشن اینقدر تلفات ندیم!
نگفتین چیکار کنم دستم به پین های پورت کام برسه ؟ اگه بشه تصویر بذارید ممنون میشم.