Thông báo

Collapse
No announcement yet.

Giao tiếp PC với AVR dùng AVRstudio

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

  • Giao tiếp PC với AVR dùng AVRstudio

    Hi!,chào các bạn,mong sớm được giúp đỡ!
    Mình đang viết một chương trình đơn giản để truyền một kí tự từ PC xuông atmega16 và lấy kí tự đó hiển thị LCD và truyền ngược lại máy tính,nhưng không hiểu sao khi mình truyền chữ "a" thì máy tính nhận lại được lad 1 kí tự khác và trên LCD lại hiển thị kí tự khác
    chương trình của mình như sau:
    #include<avr\io.h>
    #include<avr\interrupt.h>
    #include<avr\delay.h>
    #include<avr\signal.h>
    #include<D:\HamLCD.h>


    void UARTinit(void);
    unsigned char USART_Receive(void);
    unsigned char isCharAvailable();
    unsigned char receivechar();
    void sendChar(unsigned char data );


    /************************************************** **********************/

    /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>*/
    void UARTinit(void)
    {
    DDRD &=~(1<<0);//rx dau vao,tx dau ra
    DDRD |=(1<<1);
    PORTD |=(1<<1);//keo tro trong
    UCSRA=0x00;//u2x=0;
    UCSRB=(1<<TXEN)|(1<<RXEN)|(0<<RXCIE)|(0<<TXCIE)|(0 <<UCSZ2);//cho phep truyen(1<<TXEN) va nhan(1<<RXEN)
    UCSRC=(0<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0 <<USBS)|(3<<UCSZ0)|(0<<UCPOL);//che do hoat dong khong dong bo(0<UMSEL) ,khong dung che do chan le(0<<UPM0),mot bit stop(0<<USBS)
    //8 bit du lieu(3<<UCSZ0)
    UBRRH=0x00;
    UBRRL=0x67;//che do khong dong bo,16MHZ,baud=9600.
    }
    unsigned char isCharAvailable()
    {
    //Kiem tra bit RXC cua thanh ghi dieu khien va trang thai UCSRA
    //cho biet mot ki tu da duoc nhan xong hay chua
    if(UCSRA & (0x80)) return 1;//neu bo dem nhan da day RXC=1 thi isChaavaiable=1;
    else return 0; //neu bo dem nhan rong RXC=0 thi isCharavaiable=0;
    }
    unsigned char receiveChar()
    {

    //tra lai char trong thanh ghi UDR
    return UDR; //receivechar=UDR
    }
    void sendChar(unsigned char data)
    {
    int i=0;
    //de truyen du lieu voi UART dat du lieu vao trong thanh ghi UART
    UDR=data;
    //kiem tra xem ngat toan cuc da duoc cho phep chua
    if (SREG & 0x80)
    {
    //doi cho den khi du lieu truyen xong hoac bo dem bi tran
    while(!(UCSRA & 0x40) && (i<1000)) //trong khi TXC=0 va i<1000 thi tiep tuc tang i
    {
    i++;
    }
    }
    else // doi cho den khi byte duoc truyen
    while(!(UCSRA & 0x40))
    ;//trong khi TXC=0 thi khong lam gi
    //xoa TXC tuc dua TXC len 1
    UCSRA=UCSRA|0x40;

    }
    unsigned char USART_Receive(void)
    {
    // doi cho den khi du lieu duoc nhan
    while(!(UCSRA & (1<<RXC)))
    ;
    //nhan va tro lai nhan du lieu tu bo dem
    return UDR;
    }
    vao bo dem,gui du kieu


    void main(void)
    {
    unsigned char data;
    //chay cac trinh khoi tao
    UARTinit();

    khoitaoLCD();

    sei();

    for(; ; )
    {
    //bat dau giao tiep voi may tinh;

    //kiem tra de biet duoc co ki tu nao dang doi khong
    if(isCharAvailable()==1)
    {
    //neu mot ki tu moi da duoc nhan ,hien thi no

    data=receiveChar();
    In_chuoi(0x80,"nhan vao*");//hien thi len LCD
    In_kitu(0xC0,data);//hien thi len LCD
    sendChar(data);

    }

    }


    }

  • #2
    Nguyên văn bởi btbk244 Xem bài viết
    Hi!,chào các bạn,mong sớm được giúp đỡ!
    Mình đang viết một chương trình đơn giản để truyền một kí tự từ PC xuông atmega16 và lấy kí tự đó hiển thị LCD và truyền ngược lại máy tính,nhưng không hiểu sao khi mình truyền chữ "a" thì máy tính nhận lại được lad 1 kí tự
    Mình cũng bị như bạn. Hiện tượng này có lẽ là do mã gửi từ PC xuống đang ở dạng mã ASCII, cần chuyển đổi trước khi put lên LCD.

    Comment


    • #3
      Mình cũng bị như bạn. Hiện tượng này có lẽ là do mã gửi từ PC xuống đang ở dạng mã ASCII, cần chuyển đổi trước khi put lên LCD.

      Thanks vì đã góp ý proturle nhé!
      Mình sẽ sữa lại xem sao

      Comment


      • #4
        Thanks vì đã góp ý proturle nhé!
        Mình sẽ sữa lại xem sao[/QUOTE]

        Mình làm dc rồi, của mình ko phải do hàm chuyển đổi mà mình quên không để ý set lại fuse chọn clock cho vdk. Vì thế làm sai số tăng lên mặc dù đã chọn baud cho cả vdk và PC là 9600. Bạn check lại nhé.

        Comment


        • #5
          Mình làm dc rồi, của mình ko phải do hàm chuyển đổi mà mình quên không để ý set lại fuse chọn clock cho vdk. Vì thế làm sai số tăng lên mặc dù đã chọn baud cho cả vdk và PC là 9600. Bạn check lại nhé.
          mình đã thử hết tất cả các trường hợp Fuses bít cho thạch anh ngoài thế mà vẫn ko được,kí tự truyền đi và thu được không giống nhau!mệt quá,làm cái usart này mấy tuần rồi mà chưa xong.

          Comment


          • #6
            Bạn thử tải file mình gửi thử xem có được không nhé.
            Attached Files

            Comment


            • #7
              Bạn nào có giáo trình C AVR studio không, có thì gửi lên cho mình với nhé,
              (xin lỗi vì đã post vào luồng này)
              Thanks alot.
              Last edited by vandungevn; 18-08-2008, 11:46.

              Comment


              • #8
                Thanks ban Hungnp nhé,theo bạn thì lỗi truyền sai của mình là do đâu ra:ví dụ khi minh truyền :1 thì nhận dc lại là L,2 thì nhận dc lại là F,a thì nhận dc là x...
                Phần mền mình chạy bằng mô phỏng thì rất chính xác.Phần cứng mình check lại rồi cũng không sai.Phải chăng sai số là do thạch anh hoặc là do nguyên nhân nào khác.

                Comment


                • #9
                  Trong hàm khởi tạo USART của bạn mình không thấy chỗ nào sai. Mình cũng chưa thử dùng thạch anh 16MHZ để dùng khi sử dụng bộ usart để truyền dữ liệu cả nên không biết có ảnh hưởng gì không. Bạn thử thay bằng 7.3728MHz, 11.0592MHZ hoặc 14.7456MHZ xem thế nào. Với các loại thạch anh này thì sai số bằng 0% còn 16MHz là 0.2%.

                  Comment


                  • #10
                    Sáng nay mình cũng gặp một trường hợp tương tự của bạn. Khi chắc chắn chương trình không bị lỗi mình đã thay chip khác và kết quả là chíp cũ đã bị lỗi bộ UART mặc dù trước đấy vẫn bình thường.

                    Comment


                    • #11
                      thank nhìu nhé bạn Hungnp,mình đả thay bằng thạch anh 11.0592MHZ vẫn sai như thường.Chắc là phải thay con mega khac thoai
                      Last edited by btbk244; 19-08-2008, 07:07.

                      Comment


                      • #12
                        Kinh nghiệm của em là khi viết một chương trình hơi phức tạp một chút thì em luôn có một đường nối về máy tính qua cổng nối tiếp (cho dù chương trình mình không có nhu cầu giao tiếp với máy tính). Thay vì debug trên màn hình LCD em sẽ debug với chương trình HyperTerminal (các bác có thể tìm thấy ở Start-> Programs-> Accessories-> Communications-> HyperTerminal).

                        Một chương trình khá hữu dụng để monitor cổng COM em đã giới thiệu ở đây:
                        http://dientuvietnam.net/forums/showthread.php?t=13482

                        Em đã viết cả một chương trình con để monitor các biến ở trong bụng con AVR. Trên màn hình HyperTerminal muốn biết thanh ghi địa chỉ xx nào đó có giá trị mấy em chỉ việc gõ VIEW xx hoặc VIEW PORTA hay bất cứ cái gì là em biết được kết quả ngay. Các bác có hứng thú cách làm này không nhỉ?
                        Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                        Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                        Comment


                        • #13
                          Nguyên văn bởi btbk244 Xem bài viết
                          thank nhìu nhé bạn Hungnp,mình đả thay bằng thạch anh 11.0592MHZ vẫn sai như thường.Chắc là phải thay con mega khac thoai
                          Giá trị thạch anh không quá quan trọng đâu, với sai số baud 0.2% thì việc giao tiếp vẫn okie. Em vẫn dùng thạch anh 12M và 16M mà không có vấn đề gì. Có lần để tăng tốc độ xử lý chương trình em đã tăng thạch anh lên 20M (cái này gọi là overclock) mà giao tiếp tốc độ 19200 vẫn không bị ảnh hưởng gì.

                          Quan trọng là khi thay đổi thạch anh thì phải tính toán lại các thanh ghi USART cho phù hợp (mà cái này thì CodeVision đã làm giúp ta rồi).
                          Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                          Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                          Comment


                          • #14
                            Cách của nghaiha rất hay để test thiết bị, mình cũng dùng một module bằng VB để test các thiết bị của mình qua cổng 232. Cần xem gì trong VDK thì gửi lệnh và nó sẽ trả về. Công việc này cũng không mất quá nhiều thời gian nhưng bù lại sẽ tiết kiệm được thời gian trong khi viết code.

                            Gửi nghaiha,
                            Nếu dùng thạch anh 20M thì khả năng AVR bị chết có cao không? Nếu chạy với tốc độ cao thì nhiệt độ có tăng lên không? Cũng như làm OVERCLOCK với máy tính ấy, sẽ phải tản nhiệt tốt.

                            Comment


                            • #15
                              Nguyên văn bởi hungnp Xem bài viết
                              Cách của nghaiha rất hay để test thiết bị, mình cũng dùng một module bằng VB để test các thiết bị của mình qua cổng 232. Cần xem gì trong VDK thì gửi lệnh và nó sẽ trả về. Công việc này cũng không mất quá nhiều thời gian nhưng bù lại sẽ tiết kiệm được thời gian trong khi viết code.

                              Gửi nghaiha,
                              Nếu dùng thạch anh 20M thì khả năng AVR bị chết có cao không? Nếu chạy với tốc độ cao thì nhiệt độ có tăng lên không? Cũng như làm OVERCLOCK với máy tính ấy, sẽ phải tản nhiệt tốt.
                              Bác nên dùng HyperTerminal như em nói vì đây là chương trình có sẵn của Windows ta có thể dùng bất cứ lúc nào. Hiện nay có rất nhiều thiết bị trong công nghiệp và thiết bị thông tin vẫn dùng Hyper cho việc giao tiếp và settings thiết bị. Sau này sản phẩm của bác cũng dùng qua cái này thì không phải lo lắng chuyện viết chương trình đi kèm để giao tiếp thiết bị.

                              Hiện em vẫn đang chạy overclock, chưa thấy MCU bị nóng hay có triệu chứng lỗi nào. Em overclock để làm mấy hiệu ứng cho led ma trận mà. Em cũng lười nghiên cứu xem giới hạn overlock là bao nhiêu và các lỗi sẽ gặp khi overlock. Chỉ thấy nó chạy được thì cho nó chạy thôi. Có chuyên gia nào cho ý kiến thì tốt quá.
                              Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                              Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X