ايران ويج

نسخه‌ی کامل: ساخت پورت سریال
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام ...

من یه پروژه دارم که باید جدایی از پورت سریال میکرو یه پورت دیگه به میکرو اضافه کنم مثلا میکروی atmega32 که 1 پورت سریال داره به 2 تا یا بیشتر دسترسی داشته باشه .... :|
سلام
هردوتا پورت باید uart باشن؟
با پروتکل ارتباطی دیگه نمیشه کار کنید؟

یه مدار داخلی از max232 دارم و پیدا کنم پیوست میکنم
شاید بکمک مدار داخلی بشه یه کارهایی کرد
(۲۴-تير-۱۳۹۲, ۱۳:۳۳:۰۰)h0x00i نوشته است: [ -> ]سلام ...

من یه پروژه دارم که باید جدایی از پورت سریال میکرو یه پورت دیگه به میکرو اضافه کنم مثلا میکروی atmega32 که 1 پورت سریال داره به 2 تا یا بیشتر دسترسی داشته باشه .... :|
بیسکام این قابلیت رو دراهBiggrin
-
کلا برید میکرو هایی هستن مثل ATtiny26 که اصلا سریال ندارن یه جور تایمر دارن که کمک می کنه با سریال ارتباط برقرار کرد برید اپلیکشن نوت اونهارو بخونید خیلی کمک می کنه
(۲۴-تير-۱۳۹۲, ۱۴:۱۴:۵۸)r0b0 نوشته است: [ -> ]سلام
هردوتا پورت باید uart باشن؟
با پروتکل ارتباطی دیگه نمیشه کار کنید؟

یه مدار داخلی از max232 دارم و پیدا کنم پیوست میکنم
شاید بکمک مدار داخلی بشه یه کارهایی کرد
سلام اره باید uart باشه
فک نکنم مدار داخلی max232 بتونه کمکی کنه دوتا بافره دیگه ؟



(۲۴-تير-۱۳۹۲, ۱۴:۴۵:۰۲)behzady نوشته است: [ -> ]
(۲۴-تير-۱۳۹۲, ۱۳:۳۳:۰۰)h0x00i نوشته است: [ -> ]سلام ...

من یه پروژه دارم که باید جدایی از پورت سریال میکرو یه پورت دیگه به میکرو اضافه کنم مثلا میکروی atmega32 که 1 پورت سریال داره به 2 تا یا بیشتر دسترسی داشته باشه .... :|
بیسکام این قابلیت رو دراهBiggrin
-
کلا برید میکرو هایی هستن مثل ATtiny26 که اصلا سریال ندارن یه جور تایمر دارن که کمک می کنه با سریال ارتباط برقرار کرد برید اپلیکشن نوت اونهارو بخونید خیلی کمک می کنه

ااااا چه جوری ؟؟؟ می تونی بیشتر توضیح بدی یا کلید واژه سرچ بدی ؟
آره حامد خان ، به صورت نرم افزاری می تونی پورت open و close کنی ، روی این سیستم بسکام ندارم ، تو ذهنمم نیست ، اما یه شمارهه به پورت نسبت می دی و بعد هم قبل از استفاده open اش می کنی ، توی دستوراتش هم # داشت !
( چه راهنمایی کردم !! :) )
(۲۴-تير-۱۳۹۲, ۱۴:۴۵:۰۲)behzady نوشته است: [ -> ]برید اپلیکشن نوت اونهارو بخونید خیلی کمک می کنه
همین طور الکی سرچ کردم این اومد Biggrin
doc0952
(۲۶-تير-۱۳۹۲, ۰۰:۰۵:۲۴)salehjg نوشته است: [ -> ]
(۲۴-تير-۱۳۹۲, ۱۴:۴۵:۰۲)behzady نوشته است: [ -> ]برید اپلیکشن نوت اونهارو بخونید خیلی کمک می کنه
همین طور الکی سرچ کردم این اومد Biggrin
doc0952
Biggrin صالح جان چقدر قشنگ الکی سرچ می کنی :>

کد:
SOFTWARE UART

The previous examples used the hardware UART. That means the compiler uses the internal UART registers and internal hardware (RxD(0) and TxD(0)) of the AVR. If you don’t have a hardware UART you can also use a software UART.



The Bascom compiler makes it easy to “create” additional UART’s. Bascom creates software UART’s on virtually every port pin.  



Remember that a software UART is not as robust as a hardware UART, thus you can get timing problems if you have lots of interrupts in your program.



For this example we use micro controller pins portc.1 and portc.2.

Connect portc.1 to TxD and portc.2 to RxD see the schematic above.



Change the $regfile and program this example:



$regfile = "m88def.dat"

$crystal = 8000000

$baud = 19200



Dim B As Byte

Waitms 100



'Open a TRANSMIT channel for output

Open "comc.1:19200,8,n,1" For Output As #1

Print #1 , "serial output"



'Now open a RECEIVE channel for input

Open "comc.2:19200,8,n,1" For Input As #2

'Since there is no relation between the input and output pin

'there is NO ECHO while keys are typed



Print #1 , "Press any alpha numerical key"



'With INKEY() we can check if there is data available

'To use it with the software UART you must provide the channel

Do

   'Store in byte

   B = Inkey(#2)

   'When the value > 0 we got something

   If B > 0 Then

      Print #1 , Chr(b)                         'Print the character

   End If

Loop

Close #2                                         'Close the channels

Close #1



End
این روشی که میشه تو بسکام این کارو کرد ولی من تو C لازم دارم ، توی این کد پورت C.1 , C.2 به عنوان TXd , RXd انتخاب شدن
نقل قول: این روشی که میشه تو بسکام این کارو کرد ولی من تو C لازم دارم ، توی این کد پورت C.1 , C.2 به عنوان TXt , RXT انتخاب شدن

خوب بایستی نرم افزاری خودت بنویسیش دیگه. ( اگر تو نت نیست ) ، یا از یه میکروی دیگه استفاده کنی.
براساس baud rate ای که انتخاب می شه ، پایه ی RX مجازی باید نمونه برداری بشه و پایه ی TX مجازی هم به همین سرعت باید آپدیت بشه.
فکر کنم یه تایمر هم درگیر کنی بد نباشه.
بیت توازن و ... هم باید دقت کنی.
اطلاعاتت که آماده شد ، در فاصله های زمانی مشخص ( بسته به baud rate )برای TX باید شیفت بدی به یه سمت.
برای RX هم دونه دونه بیت ها رو باید بخونی و بعد یکیشون کنی.

ساختارش بنظر پیچیده نمی یاد.

موفق باشی.
مرسی

:) مرسی از کمک ها کدشو نوشتم :) یکم باگ داره ردیف شد میزارم اینجا
اینم کد :)


کد:
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "mydefs.h"

#define    XTAL    11.0592e6
#define    BAUD    9600
#define F_CPU   XTAL

#define    STXD        SBIT( PORTA, PA6 )    // = OC1A
#define    STXD_DDR    SBIT( DDRA,  PA6 )
#define    SRXD_PIN    SBIT( PINA,  PA7 )    // = ICP

#define STX_SIZE    20
#define    SRX_SIZE    100

#define    uputs(x)    uputs_((u8*)(x))    // avoid char warning

#define BIT_TIME    (u16)(XTAL * 1.0 / BAUD + 0.5)

#define    TX_HIGH        (1<<COM1A1^1<<COM1A0)
#define    TX_LOW        (TX_HIGH^1<<COM1A0)
#define    TX_OUT        TCCR1A        // use compare output mode

#define ROLLOVER( x, max )    x = ++x >= max ? 0 : x
// count up and wrap around

static u8 stx_buff[STX_SIZE];
static u8 stx_in;
static u8 stx_out;
static u8 stx_data;
static u8 stx_state;

static u8 srx_buff[SRX_SIZE];
static u8 srx_in;
static u8 srx_out;
static u8 srx_data;
static u8 srx_state;


void suart_init( void )
{
    OCR1A = BIT_TIME - 1;
    TCCR1A = TX_HIGH;            // set OC1A high, T1 mode 4
    TCCR1B = 1<<ICNC1^1<<WGM12^1<<CS10;    // noise canceler, 1-0 transition,
    // CLK/1, T1 mode 4 (CTC)
    TCCR1C = 1<<FOC1A;
    stx_state = 0;
    stx_in = 0;
    stx_out = 0;
    srx_in = 0;
    srx_out = 0;
    STXD_DDR = 1;                // output enable
    TIFR1 = 1<<ICF1;            // clear pending interrupt
    TIMSK1 = 1<<ICIE1^1<<OCIE1A;        // enable tx and wait for start
}


u8 kbhit( void )            // check, if rx buffer not empty
{
    return srx_out ^ vu8(srx_in);
}


u8 ugetchar( void )            // wait until byte received
{
    u8 data;

    while( !kbhit());                 // until at least one byte in
    data = srx_buff[srx_out];        // get byte
    ROLLOVER( srx_out, SRX_SIZE );
    return data;
}


void uputchar( u8 c )            // transmit byte
{
    u8 i = stx_in;

    ROLLOVER( i, STX_SIZE );
    stx_buff[stx_in] = ~c;        // complement for stop bit after data
    while( i == vu8(stx_out));        // until at least one byte free
    // stx_out modified by interrupt !
    stx_in = i;
}


void uputs_( u8 *s )            // transmit string from SRAM
{
    while( *s )
    uputchar( *s++ );
}

/******************************    Interrupts *******************************/

ISR( TIM1_CAPT_vect )                // start detection
{
    s16 i = ICR1 - BIT_TIME / 2;            // scan at 0.5 bit time

    OPTR18                    // avoid disoptimization
    if( i < 0 )
    i += BIT_TIME;                // wrap around
    OCR1B = i;
    srx_state = 10;
    TIFR1 = 1<<OCF1B;                // clear pending interrupt
    if( SRXD_PIN == 0 )                // still low
    TIMSK1 = 1<<OCIE1A^1<<OCIE1B;        // wait for first bit
}


ISR( TIM1_COMPB_vect )                // receive data bits
{
    u8 i;

    switch( --srx_state ){

        case 9:  if( SRXD_PIN == 0 )        // start bit valid
        return;
        break;

        default: i = srx_data >> 1;                  // LSB first
        if( SRXD_PIN == 1 )
        i |= 0x80;            // data bit = 1
        srx_data = i;
        return;

        case 0:  if( SRXD_PIN == 1 ){        // stop bit valid
        i = srx_in;
        ROLLOVER( i, SRX_SIZE );
        if( i != srx_out ){        // no buffer overflow
        srx_buff[srx_in] = srx_data;
        srx_in = i;            // advance in pointer
    }
}
TIFR1 = 1<<ICF1;            // clear pending interrupt
  }
  TIMSK1 = 1<<ICIE1^1<<OCIE1A;            // enable next start
}


ISR( TIM1_COMPA_vect )                // transmit data bits
{
  if( stx_state ){
    stx_state--;
    TX_OUT = TX_HIGH;
    if( stx_data & 1 )                // lsb first
      TX_OUT = TX_LOW;
    stx_data >>= 1;
    return;
  }
  if( stx_in != stx_out ){            // next byte to sent
    stx_data = stx_buff[stx_out];
    ROLLOVER( stx_out, STX_SIZE );
    stx_state = 9;                // 8 data bits + stop
    TX_OUT = TX_LOW;                // start bit
  }
}


void init( void )
{
    DDRA = 0;
    DDRB = 0;
    PORTA = 0xFF;
    PORTB = 0xFF;
    suart_init();
}


int main( void )
{
    init();
    sei();
    uputs( "Hallo world/n" );
    for(;;){
        PORTB = 0x00;
        _delay_ms( 505 );
        PORTB = 0xff;
        while( kbhit() )
        uputchar( ugetchar());
    }
}