Thông báo

Collapse
No announcement yet.

UART của AVR cho beginer

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

  • UART của AVR cho beginer

    Chào các cao thủ AVR, em mới tìm hiểu về UART, nhưng còn nhiều mơ hồ. Em sử dụng CodeVision và con AT32. Trong việc truyền dữ liệu thì dùng hàm putchar() nhưng mình nhập kí tự vô thì lào sao biết kí tự đó cho dữ liệu 8bit như thế nào? VD em muốn chuyễn 8bit: 01010101 thì nhập kí tự gì, có bảng mã nào ko
    Em thự tập ở nhà là nối chân Tx vô Rx để nó vừa truyền vừa nhận dữ liệu rùi xuất ra 1 PORT khác, đọc 8bit của chân đó, nhưng ko biết kết quả ra có đúng ko
    Mong các bác hướng dẫn em

  • #2
    Bạn tham khảo trong bảng mã ASCII

    Comment


    • #3
      Vậy nếu theo bảng mã ASCII thì em ko thể nào gửi byte lớn hơn 7F được ah, vậy làm sao đây các sư huynh....Help me

      Comment


      • #4
        Nguyên văn bởi tycool Xem bài viết
        Chào các cao thủ AVR, em mới tìm hiểu về UART, nhưng còn nhiều mơ hồ. Em sử dụng CodeVision và con AT32. Trong việc truyền dữ liệu thì dùng hàm putchar() nhưng mình nhập kí tự vô thì lào sao biết kí tự đó cho dữ liệu 8bit như thế nào? VD em muốn chuyễn 8bit: 01010101 thì nhập kí tự gì, có bảng mã nào ko
        Em thự tập ở nhà là nối chân Tx vô Rx để nó vừa truyền vừa nhận dữ liệu rùi xuất ra 1 PORT khác, đọc 8bit của chân đó, nhưng ko biết kết quả ra có đúng ko
        Mong các bác hướng dẫn em
        Có lẽ mình sẽ viết thế này để bạn đỡ bỡ ngỡ với việc truyền và nhận qua cổng COM.
        1. Chiều từ VĐK lên PC
        Mỗi lần bạn ấn lệnh putchar là bạn gửi một byte (8bit) lên PC. Byte này có giá trị từ 0 đến 255 theo chuẩn cơ số nhị phân.
        Tại đầu thu (tức là PC), bạn sẽ nhận được một giá trị theo cơ số nhị phân y hệt như đã gửi. Ví dụ bạn gửi số 155 (cơ số 10) thì tại đầu thu PC bạn cũng nhận được 155 (cơ số 10). Tuy vậy với cái giá trị đó thì bạn có thể biểu diễn thành một kí tự nào đó theo mã Ascii. Giá trị 155 ko nằm trong dải ascii thì nó chẳng ra cái kí tự gì.
        2. Chiều từ PC xuống VĐK
        Giả sử bạn truyền một kí tự là "A" lớn xuống VĐK. Trước tiên chữ A này sẽ chuyển đổi ra dạng nhị phân theo chuẩn ascii thành 65 (cơ số 10). Giá trị 65 này sẽ được gửi đi. Tại VĐK thì bộ xử lí chỉ biết đó là 65 chứ chẳng quan tâm nó là chữ "A" hay là cái chữ gì.
        Một bài toán nhỏ như sau: trên PC bạn nhấn chữ "A" thì ở VĐK đèn sẽ sáng, nhấn phím "B" thì đèn tắt. Vậy ta sẽ có một biến trung gian tg dạng byte làm nhiệm vụ:
        tg = getchar(); //lấy giá trị từ bộ UART
        if (tg==65) //neu tg nhan được giá trị là 65
        {
        Den =1;
        }
        if (tg==66)
        {
        Den=0;
        }
        Một cách khác, thay vì nhấn chữ "A" (là 65) bạn nhấn hai số "6" và "5" sau đó bạn gửi xuống VĐK, thì khi đó VĐK có nhận là 65 hay ko?
        Trả lời : KO
        Vì: số 6 sẽ được PC xử lí thành giá trị 54 (cơ số 10 theo chuẩn ascii) gửi xuống VĐK
        số 5 được PC xử lí thành 53 (cơ số 10) gửi xuống VĐK.
        Vậy tại VĐK bạn nhận được 2 byte có giá trị lần lượt là 54 và 53.

        Một bài toán khác, trong mã ascii các số 0-9 có giá trị từ 48-57 (cơ số 10). Làm thế nào để chuyển một byte có giá trị là 8 (hoặc nhỏ hơn 48) xuống VĐK?

        Kết luận:
        Giá trị một byte chuyển qua chuyển lại giữa VĐK và PC là độc lập với mã ascii. Nó có dải từ 0-255. Khi bạn nhận được và biểu diễn nó thành kí tự nào đó, hay bật tắt cái gì đó là quyền của bạn. Cũng như khi lên PC bạn thích biểu diễn nó thành kí tự latinh (a,bc,....) thì nó thành a,b,c,...
        GTH sản xuất mạch in PCB 1 mặt:
        -phủ xanh: 40.000 đ/dm2
        -không phủ xanh: 30.000 đ/dm2
        -Cung cấp mực cảm quang để làm mạch in
        email:

        Comment


        • #5
          Nguyên văn bởi tycool Xem bài viết
          Vậy nếu theo bảng mã ASCII thì em ko thể nào gửi byte lớn hơn 7F được ah, vậy làm sao đây các sư huynh....Help me
          byte nào lớn hơn 7F ?
          bảng mã ASCII là bảng mã chuẩn rồi mà.

          Comment


          • #6
            to iamchenjen
            Bác xem trong bảng mã ASCII, kí tự của nút DEL đó, mã HẼ nó là 7f đó, tui muốn nạp 8F thì sao hả bác

            Comment


            • #7
              có nhiều cách:
              Ví dụ truyền ký tự 'a':
              'a'(kiểu char)=0x61(hệ 16)=97(hệ 10)
              vì vậy các câu lệnh sau là như nhau:
              putchar('a');
              putchar(97);
              putchar(0x61);
              - nếu truyền một byte mà giá trị của byte đó không phải là một ký tự thì sử dụng cách thứ 2,3.

              Comment


              • #8
                Nguyên văn bởi hungnp Xem bài viết
                có nhiều cách:
                Ví dụ truyền ký tự 'a':
                'a'(kiểu char)=0x61(hệ 16)=97(hệ 10)
                vì vậy các câu lệnh sau là như nhau:
                putchar('a');
                putchar(97);
                putchar(0x61);
                - nếu truyền một byte mà giá trị của byte đó không phải là một ký tự thì sử dụng cách thứ 2,3.
                Chuẩn ko cần chỉnh!!!!!!!!!!!!!!!!
                GTH sản xuất mạch in PCB 1 mặt:
                -phủ xanh: 40.000 đ/dm2
                -không phủ xanh: 30.000 đ/dm2
                -Cung cấp mực cảm quang để làm mạch in
                email:

                Comment


                • #9
                  Nguyên văn bởi tycool Xem bài viết
                  to iamchenjen
                  Bác xem trong bảng mã ASCII, kí tự của nút DEL đó, mã HẼ nó là 7f đó, tui muốn nạp 8F thì sao hả bác
                  Mỗi ký tự là 1 byte rồi, muốn gửi hơn thì chia ra làm nhiều byte.
                  Thường thì lưu vào 1 mảng rồi lập trình xử lý mảng đó.

                  Comment


                  • #10
                    Nguyên văn bởi tycool Xem bài viết
                    VD em muốn chuyễn 8bit: 01010101 thì nhập kí tự gì, có bảng mã nào ko
                    Em thự tập ở nhà là nối chân Tx vô Rx để nó vừa truyền vừa nhận dữ liệu rùi xuất ra 1 PORT khác, đọc 8bit của chân đó, nhưng ko biết kết quả ra có đúng ko
                    Mong các bác hướng dẫn em
                    Bạn có thể dùng bảng mã ASCII , ngoài ra có thể putchar theo kiểu hex hoặc kiểu bin .putchar(0xFE) hoặc putchar(0b01010101) cũng đc . Để nhận biết thì bạn có thể gửi kí tự nhận đc lên máy tính để xem , hoặc hiển thi qua LCD , Nếu muốn hiện qua port 8 bit thì cũng ok.
                    Thực tế putchar trong code vision với kí tự trong ngoặc dạng char(8bit) thì VĐK sẽ đặt lên thanh ghi đệm 1 byte tương ứng , nó ko quan tâm tới việc kí tự đó là gì . Bạn có thể xử lý từng bit hoặc theo cả kí tự nếu muốn

                    Comment


                    • #11
                      Nguyên văn bởi tycool Xem bài viết
                      Vậy nếu theo bảng mã ASCII thì em ko thể nào gửi byte lớn hơn 7F được ah, vậy làm sao đây các sư huynh....Help me
                      Bảng mã ascii là thể hiện cua 1 byte (8 bit) tức là có 256 ký tự từ 0 đến 255. Bảng trên chỉ là 1/2 bảng mã ascii mà thôi.
                      1 ký tự đại diện cho 1 con số. Bạn mún bek nó hệ 16 hay hệ 10 hay nhị phân thì tuỳ bạn. Mún chuyển đổi bạn dùng cái máy tính trong pc chọn loại máy nâng cao rôi chuyên đổi qua lại giưa các hệ số.
                      255 hay 0xff là giá trị max cua 1 byte.
                      Nếu bạn mún gởi 1 byte mà mún số lớn hơn nưa thì bill gate củng bó tay. Hjhj

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X