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

                    • nhathung1101
                      Trả lời cho Trình điều khiển bước rời rạc
                      bởi nhathung1101
                      "Chú ấy" ở bên Quảng Đông đấy. Đang bị "rã rời" rồi, nên đừng hướng vào con đường tội lỗi nữa....
                      hôm nay, 23:26
                    • nhathung1101
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi nhathung1101
                      Loa Tầu nó đáp ứng được tiếng VN, vì mấy câu hát kiểu "oăng oẳng như sủa" Nhật nó không có. Nó chỉ hát kiểu "đục đục chạc chạc" thôi.
                      Nếu thấy loa Tầu hay, thì gỡ cái mác SONY gắn vào là xong. Còn cái loa Nhật thì vứt luôn, chỉnh làm quái gì.
                      ...
                      hôm nay, 23:17
                    • since0501
                      Trả lời cho Pin Li-FePO4 (pin sắt) rất dể hỏng! Các biện pháp ngăn ngừa.
                      bởi since0501
                      Mình đào mộ xíu, cho mình hỏi là pin của bác vẫn ok chứ? Mình vừa đóng khối pin 16 cell 40135 thì khi chạy điện áp nó sụt so với khi nghỉ như video mình dẫn link, vậy cho mình hỏi là dung lượng pin sẽ tính khi áp nghỉ hay áp đang hoạt động, và pin sụt áp như vậy là bình thường hay pin kém?
                      ht...
                      hôm nay, 17:56
                    • mèomướp
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi mèomướp
                      Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                      Hôm qua, 13:11
                    • tuyennhan
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi tuyennhan
                      Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                      Hôm qua, 09:25
                    • tuyennhan
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi tuyennhan
                      Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                      Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                      Hôm qua, 09:10
                    • Ng.Phuong.5
                      Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                      bởi Ng.Phuong.5
                      Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                      Mấy con...
                      09-01-2025, 19:44
                    • viettinh
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi viettinh
                      Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                      Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                      09-01-2025, 18:12
                    • nguyendinhvan
                      Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                      bởi nguyendinhvan
                      Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                      Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                      Cách đơn giản...
                      09-01-2025, 00:04
                    • mèomướp
                      Trả lời cho Sửa bộ nguồn DC 60V 45A
                      bởi mèomướp
                      Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                      08-01-2025, 19:02
                    Đang tải...
                    X