Thông báo

Collapse
No announcement yet.

Lập trình UART MỀM

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Lập trình UART MỀM

    E đang làm đề tài về ĐIều khiển thiết bị bằng tin nhắn SMS - Giao tiếp với máy tính qua RS232. (sd PIC 16F887 và Module Sim900)
    Vấn đề của e gặp phải là không gửi được lệnh từ PC xuống PIC, vì 2 chân RX và TX của PIC đã giao tiếp với Module Sim rồi. Vì mạch đã cố định nên e chịu chết.
    E có tìm hiểu và biết là có phương pháp lập trình UART mềm để xử lý trong trường hợp này. Nghĩa là sử dụng 2 chân bất kì của PIC để làm thêm 1 UART nữa. Nhưng tìm mãi mà k có tài liệu về lập trình thế này.
    Nay mong muốn ai có kinh nghiệm làm cái này rồi có thể chỉ dẫn cho e k ạ?! Hoặc có tài liệu về UART mềm thì có thể cho e xin để tham khảo.
    Rất mong nhận được sự giúp đỡ của mọi người!

  • #2
    Nguyên văn bởi dghien Xem bài viết
    E đang làm đề tài về ĐIều khiển thiết bị bằng tin nhắn SMS - Giao tiếp với máy tính qua RS232. (sd PIC 16F887 và Module Sim900)
    Vấn đề của e gặp phải là không gửi được lệnh từ PC xuống PIC, vì 2 chân RX và TX của PIC đã giao tiếp với Module Sim rồi. Vì mạch đã cố định nên e chịu chết.
    E có tìm hiểu và biết là có phương pháp lập trình UART mềm để xử lý trong trường hợp này. Nghĩa là sử dụng 2 chân bất kì của PIC để làm thêm 1 UART nữa. Nhưng tìm mãi mà k có tài liệu về lập trình thế này.
    Nay mong muốn ai có kinh nghiệm làm cái này rồi có thể chỉ dẫn cho e k ạ?! Hoặc có tài liệu về UART mềm thì có thể cho e xin để tham khảo.
    Rất mong nhận được sự giúp đỡ của mọi người!
    Đây : Đọc rồi tự hiểu !

    Code:
    #include     <pic.h>
    #include    <conio.h>
    #include    <stdio.h>
    #include    "delay.c"
    #include    "delay.h" 
    __CONFIG(PWRTEN&WDTDIS&UNPROTECT&HS&MCLRDIS);
    
    /*************************************
     *    Tunable parameters
     */
    
    /* Transmit and Receive port bits */
    #define TxData GPIO2        /* bit2 in GP port  */
    #define RxData GPIO0        /* bit0 in GP port  */    
    
    #define    XTAL            4000000    /* Crystal frequency (Hz). */
    #define    BRATE            1200    /* Baud rate. */
    #define RX_OVERSAMPLE    8        /* Amount of oversampling the receiver does. 
                                       Must be a power of two */
    
    /*
     *    Don't change anything else
     ************************************/
    
    #define TIMER_VALUE    XTAL / (4 * BRATE * RX_OVERSAMPLE)
    
    // 1 start bit + 8 data bits + 2 stop bits + safe.
    #define TRANSMIT_NUM_BITS    13    
    
    #if    (RX_OVERSAMPLE-1)&RX_OVERSAMPLE
    #error    RX_OVERSAMPLE_value must be a power of 2
    #endif
    
    // Receiver states.
    enum receiver_state {
        RS_HAVE_NOTHING,
        RS_WAIT_HALF_A_BIT,
        RS_HAVE_STARTBIT,
        RS_WAIT_FOR_STOP = RS_HAVE_STARTBIT+8
    };
    
    static unsigned char    sendbuffer;            // Where the output char is stored.
    static unsigned char    receivebuffer;        // Where the input char is stored as 
                                                  // it is received.
    static bit                 receivebufferfull;    // 1 = receivebuffer is full.
    
    
    static unsigned char    send_bitno;
    static unsigned char    receivestate;        // Initial state of the receiver (0)
    static unsigned char    skipoversamples;    // Used to skip receive samples.
    static unsigned char    rxshift;
    static bit                tx_next_bit;
    
    char data;
    /**
     * init_uart
     * 
     * Initialises the serial port:
     * 
     *     Sets up the I/O directions for the appropriate PortA pins;
     *     Sets up Timer0.
     * 
     * */
    void init_uart(void)
    {
        receivestate = RS_HAVE_NOTHING;
        skipoversamples = 1;            // check each interrupt for start bit
       receivebufferfull = 0;
    
        ANSEL =0;
        TRISIO = 0x39;                    // Set up I/O direction.
        
        /* Set up the timer. */
        T0CS = 0;                        // Set timer mode for Timer0.
        TMR0 = (2-TIMER_VALUE);            // +2 as timer stops for 2 cycles
                                        // when writing to TMR0
        T0IE = 1;                        // Enable the Timer0 interrupt.
        GIE = 1;
    }
    
    void putch(char c)
    {
        while(send_bitno)
            continue;
        tx_next_bit = 0;
        sendbuffer = c;
        send_bitno = TRANSMIT_NUM_BITS*RX_OVERSAMPLE;
    }
    
    char getch(void)
    {
        while(!receivebufferfull)
            continue;
        receivebufferfull = 0;
        return receivebuffer;
    }
    
    
    
    
    /**
     * serial_isr
     * 
     * Transmits and receives characters which have been
     * "putch"ed and "getch"ed.
     * 
     * This ISR runs BRATE * RX_OVERSAMPLE times per second.
     * 
     * */
    interrupt void serial_isr(void)
    {
        // Reset Timer0 value
        // This is added to TMR0 because there is a delay to get to the isr.
    
        TMR0 += -TIMER_VALUE + 4;    // +2 as timer stops for 2 cycles when writing 
                                    // to TMR0 +2 for tweak
        T0IF = 0;
    
        /*** RECEIVE ***/
    
        if( --skipoversamples == 0) {
            skipoversamples++;            // check next time
            switch(receivestate) {
    
            case RS_HAVE_NOTHING:
                /* Check for start bit of a received char. */
                if(!RxData){
                    skipoversamples = RX_OVERSAMPLE/2;
                    receivestate++;
                }
                break;
    
            case RS_WAIT_HALF_A_BIT:
                if(!RxData) {            // valid start bit
                    skipoversamples = RX_OVERSAMPLE;
                    receivestate++;
                } else
                    receivestate = RS_HAVE_NOTHING;
                break;
                
            // case RS_HAVE_STARTBIT: and subsequent values
            default:
                rxshift = (rxshift >> 1) | (RxData << 7);
                skipoversamples = RX_OVERSAMPLE;
                receivestate++;
                break;
    
            case RS_WAIT_FOR_STOP:
                receivebuffer = rxshift;
                receivebufferfull = 1;
                receivestate = RS_HAVE_NOTHING;
                break;
    
            }
        }
    
        
        /*** TRANSMIT ***/
        /* This will be called every RX_OVERSAMPLEth time
         * (because the RECEIVE needs to over-sample the incoming
         * data). */
    
        if(send_bitno) {
                   if((send_bitno & (RX_OVERSAMPLE-1)) == 0) {
                TxData = tx_next_bit;        // Send next bit.
                tx_next_bit = sendbuffer & 1;
                sendbuffer = (sendbuffer >> 1) | 0x80;
            }
            send_bitno--;
        }
    
    }
    
    void main()
    {
    init_uart();
    while(1)     
    {
    if(receivebufferfull){data=getch(); }
    send_bitno=1; putch(data); 
    }
    }
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      Điên đầu em mất bác queduong ạ!
      E sẽ cố đọc. Cám ơn anh nhiều ạ!!!

      Comment


      • #4
        Nguyên văn bởi dghien Xem bài viết
        Điên đầu em mất bác queduong ạ!
        E sẽ cố đọc. Cám ơn anh nhiều ạ!!!
        Bạn dùng mikroc ... thích thì viết dạng như kia vẫn chạy được ... không thích thì dùng luôn thư viện ( ngon mà chuẩn ) ... chỉ việc đánh dấu vào và khai báo ... có ngay UART mềm ... chẳng phải điên đầu .
        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

        Comment


        • #5
          Nếu viết = CCS thì đây:
          CCS, Inc. - Using Multiple RS-232 Ports on a PIC® MCU or PIC® DSC

          Comment


          • #6
            Vâng, e đang dùng CCS ạ! Cái này đúng như thầy giáo e chỉ dẫn qua! E cảm ơn a ạ! .....

            Comment


            • #7
              Không biết MiKroC có khác nhiều so với CCS k ạ? E đang dùng CCS a ạ!

              Comment


              • #8
                Nguyên văn bởi dghien Xem bài viết
                Không biết MiKroC có khác nhiều so với CCS k ạ? E đang dùng CCS a ạ!
                Đương nhiên là lập trình C thì chẳng khác nhau về giải thuật và câu cú ... còn về giao diện thì khác , mikroC có nhiều thư viện hơn , sáng sủa hơn , dễ dùng hơn , dùng thư viện nào chỉ việc đánh dấu chọn là xong, gọn gàng hơn chứ không như CCS (câu cú loằng ngoằng , khai báo vớ vẩn , thư viện thì hay có mã asm , in cờ lút này nọ )
                Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                Comment


                • #9
                  Nguyên văn bởi queduong Xem bài viết
                  Đương nhiên là lập trình C thì chẳng khác nhau về giải thuật và câu cú ... còn về giao diện thì khác , mikroC có nhiều thư viện hơn , sáng sủa hơn , dễ dùng hơn , dùng thư viện nào chỉ việc đánh dấu chọn là xong, gọn gàng hơn chứ không như CCS (câu cú loằng ngoằng , khai báo vớ vẩn , thư viện thì hay có mã asm , in cờ lút này nọ )
                  mình mới học Pic nên chưa hiểu lắm về lập trình PIc, bạn giúp mình 1 chút về lập trình uart mềm cho con pic 16f84a không?

                  Comment


                  • #10
                    Nguyên văn bởi hoanglocmdc Xem bài viết
                    mình mới học Pic nên chưa hiểu lắm về lập trình PIc, bạn giúp mình 1 chút về lập trình uart mềm cho con pic 16f84a không?
                    dùng MikroC thì đã có thư viện UART rồi , chỉ việc lấy ra sài .
                    Dùng các loại khác không có thư viện ... thì tham khảo cái code ở trên kia ( cho code rồi đó . Bài #2 )
                    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                    Comment

                    Về tác giả

                    Collapse

                    dghien Tìm hiểu thêm về dghien

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X