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

                    • bqviet
                      Trả lời cho Đấu tắt điện cho máy tính bảng
                      bởi bqviet
                      Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                      06-12-2025, 17:17
                    • nguyendinhvan
                      Trả lời cho Xin hỏi về mạch thu FM/AM trong catsette
                      bởi nguyendinhvan
                      Theo tôi, nó chỉ là cái Tuy- ê - nơ, hoặc là khối Trung Văn Tần, nó một phần trong cái Da đì ô thôi. Vì có thấy một chỗ có ba chân hàn, giiống như chân Cờ rít sờ tăng 455 ki nô hẹc. Còn khối Tuy ê nơ thì không nhìn thây cái Di ốt Va di cáp...
                      05-12-2025, 19:59
                    • afrendly
                      Trả lời cho Đấu tắt điện cho máy tính bảng
                      bởi afrendly
                      Có vẻ ngoài hiểu biết của mình rồi. Cuối cùng mình quyết định tìm mua 2 pin trên Shopee, giá 200K thay vào. Tuy nhận pin được 1%, sạc mãi không vào nhưng cũng mở được máy lên. Vậy cũng tạm. Cảm ơn bạn đã hỗ trợ nhé....
                      04-12-2025, 01:27
                    • nick22
                      Trả lời cho Máy điện châm ?
                      bởi nick22
                      Đúng như bạn nói, máy điện châm hiện nay trên thị trường đã khá đa dạng về mẫu mã, chức năng và giá thành.
                      01-12-2025, 13:23
                    Đang tải...
                    X