Thông báo

Collapse
No announcement yet.

có ai nói rõ cho tui hai AVR truyền và nhân dữ liệu ntn vậy

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

  • có ai nói rõ cho tui hai AVR truyền và nhân dữ liệu ntn vậy

    có ai bít AVR nhận một chuỗi byte như thế nào không? có phải đồng bộ hóa thời jan truyền và nhận giữa hai AVR không:tức là khi AVR thứ nhất truyền 5 byte tới AVR thứ hai, thì con AVR thứ nhất truyền liên tiếp 5 byte và con AVR thứ hai nhận 5 byte.Vậy hai con AVR trên truyền và nhận dữ liệu như thế nào vậy. Mong các pac jup t voj.
    t thực hiện truyền và nhận từng byte một thì ok nhưng khi truyền nhận nhiều byte thì không dc.
    và thêm nữa: với tốc độ truyền thông 9600 có phải là cứ mỗi giây là truyền dược 9600 bit,nếu như vậy giả sử ta truyền 11bit (1start,8bit data,2bit stop) thì cần 11/9600 giay đúng không.và như vậy có phải dợi đủ thời gian đó thì mới truyền byte tiếp theo không.và giữa các lần đưa dliệu vào bộ đệm truyền có phải trễ khoảng thời gian nào không vây?
    Last edited by xuanlam163; 25-02-2009, 23:03.

  • #2
    Nguyên văn bởi xuanlam163 Xem bài viết
    có ai bít AVR nhận một chuỗi byte như thế nào không? có phải đồng bộ hóa thời jan truyền và nhận giữa hai AVR không:tức là khi AVR thứ nhất truyền 5 byte tới AVR thứ hai, thì con AVR thứ nhất truyền liên tiếp 5 byte và con AVR thứ hai nhận 5 byte.Vậy hai con AVR trên truyền và nhận dữ liệu như thế nào vậy. Mong các pac jup t voj.
    t thực hiện truyền và nhận từng byte một thì ok nhưng khi truyền nhận nhiều byte thì không dc.
    và thêm nữa: với tốc độ truyền thông 9600 có phải là cứ mỗi giây là truyền dược 9600 bit,nếu như vậy giả sử ta truyền 11bit (1start,8bit data,2bit stop) thì cần 11/9600 giay đúng không.và như vậy có phải dợi đủ thời gian đó thì mới truyền byte tiếp theo không.và giữa các lần đưa dliệu vào bộ đệm truyền có phải trễ khoảng thời gian nào không vây?
    tôi không biết bạn đang dùng chế độ vòng lặp hay chế độ ngắt để truyền nhận thành ra tôi chỉ lưu ý bạn những điểm sau:
    -ở chế độ truyền để truyền được nhiều byte mà không bị lỗi thì bạn phải quan tâm tới bộ đệm truyền: mỗi khi có thông báo bộ đệm truyền rỗng(BIT UDRE=1) thì bạn gởi vào bộ đệm truyền 1 byte. cứ làm thế cho đến khi hết số byte cần truyền.
    -ở chế độ nhận:bạn cần quan tâm tới bộ đệm nhận.mỗi khi có thông báo bộ đệm nhận đầy(BIT RXC=1) tức là nó đã nhận xong 1 byte bạn chỉ việc lấy byte đó cất vào ram để xử lý.
    - tốc độ baud chính là người ta muốn tạo ra cái chuẩn để đồng bộ giữa bên phát và bên thu(tốc độ baud hai bên phải giống nhau và phải trong khoảng cho phép)
    - chế độ truyền nhận:5bit,6bit,7bit,8bit hay 9bit thì cũng phải set 2 bên giống nhau.
    thân chào bạn!

    Comment


    • #3
      Nguyên văn bởi hotuanhai Xem bài viết
      tôi không biết bạn đang dùng chế độ vòng lặp hay chế độ ngắt để truyền nhận thành ra tôi chỉ lưu ý bạn những điểm sau:
      -ở chế độ truyền để truyền được nhiều byte mà không bị lỗi thì bạn phải quan tâm tới bộ đệm truyền: mỗi khi có thông báo bộ đệm truyền rỗng(BIT UDRE=1) thì bạn gởi vào bộ đệm truyền 1 byte. cứ làm thế cho đến khi hết số byte cần truyền.
      -ở chế độ nhận:bạn cần quan tâm tới bộ đệm nhận.mỗi khi có thông báo bộ đệm nhận đầy(BIT RXC=1) tức là nó đã nhận xong 1 byte bạn chỉ việc lấy byte đó cất vào ram để xử lý.
      - tốc độ baud chính là người ta muốn tạo ra cái chuẩn để đồng bộ giữa bên phát và bên thu(tốc độ baud hai bên phải giống nhau và phải trong khoảng cho phép)
      - chế độ truyền nhận:5bit,6bit,7bit,8bit hay 9bit thì cũng phải set 2 bên giống nhau.
      thân chào bạn!
      ở đây truyền dliệu dùng pp dò còn nhận dùng pp ngắt nhận.giả sử tốc độ 9600,truyền đi 5 byte lên tiêp(như file gửi kèm)mà trong datasheet của AT8 nói là bộ nhận chỉ có 2 thanh ghi nhận và có thể dùng thêm thanh ghi dịch(file kèm theo).như vậy khi AVR thứ hai nhận dlệu có bị tràn không vậy,bởi vì có đến 5 byte vào bộ đệm liên tiếp.nếu như vậy thì doạn code nhận dliệu ntn vây?mog pac jup t với.
      Attached Files

      Comment


      • #4
        như vậy khi AVR thứ hai nhận dlệu có bị tràn không vậy,bởi vì có đến 5 byte vào bộ đệm liên tiếp
        Bác chú ý về tốc độ baud và phần cứng nhận của AT8.

        - Phần cứng nhận AT8 có 1 thanh ghi dịch nhận và thanh ghi dữ liệu nhận UDR: khi nhận đủ 8 bit (1 byte) thì thanh ghi dịch nhận mới chuyển 1 byte sang UDR để user đọc.

        - Nếu dùng tốc độ baud 115 200 -> 115 200bits/s -> 14 400bytes/s -> truyền 1 byte mất 69.5us.

        Với tốc độ của AT8 thì thời gian để nhận 1 byte ở tốc độ baud 115 200 là quá đủ để bác viết chương trình nhận dữ liệu từ thanh ghi UDR trước khi có byte khác được nhận đè nên.

        Đây là thiển ý của em mong các bác chỉ giáo thêm.
        ----------------------
        Bể học là mênh mông!

        Comment


        • #5
          Nguyên văn bởi hai_abc Xem bài viết
          Bác chú ý về tốc độ baud và phần cứng nhận của AT8.

          - Phần cứng nhận AT8 có 1 thanh ghi dịch nhận và thanh ghi dữ liệu nhận UDR: khi nhận đủ 8 bit (1 byte) thì thanh ghi dịch nhận mới chuyển 1 byte sang UDR để user đọc.

          - Nếu dùng tốc độ baud 115 200 -> 115 200bits/s -> 14 400bytes/s -> truyền 1 byte mất 69.5us.

          Với tốc độ của AT8 thì thời gian để nhận 1 byte ở tốc độ baud 115 200 là quá đủ để bác viết chương trình nhận dữ liệu từ thanh ghi UDR trước khi có byte khác được nhận đè nên.

          Đây là thiển ý của em mong các bác chỉ giáo thêm.
          -như vậy là ta tính thời gian truyền là ko tính dến các bit: start,p,stop ah?
          -và nếu như truyền với toc độ 9600->truyền mỗi byte mất 833,33us,như vậy cứ cách khoảng đó thời jan là bit RXC=1 đúng ko vậy?
          -và ct cua t xử lý trong ngắt chỉ dc phép xử lý trong khoảng thời jan <= khoảng thời jan để bộ dệm nhận nhận dc một byte uh?
          mong các pác jup đỡ

          Comment


          • #6
            bạn lưu ý thanh ghi UDR thực chất là 2 thanh ghi độc lập về mặt vật lý:
            - khi bạn gõ lệnh: OUT UDR,Rn AVR hiểu là bạn đưa data vào thanh ghi truyền
            - khi bạn gõ lệnh: IN Rn,UDR AVR hiểu là bạn lấy data từ thanh ghi nhận.
            do đó , trong chương trình ngắt nhận data:sau lệnh"IN Rn,UDR " thì bộ đệm nhận dữ liệu của avr trống và có thể nhận byte tiếp theo.
            làm cái thí dụ nho nhỏ để bạn thấy khi bên truyền có truyền liên tục thì bên nhận vẫn nhận được liên tục mà ko bị tràn dữ liệu:giả sử tốc dộ truyền 9600 baud
            theo qt tam suất:
            9600 bit -------->1000ms
            0001 bit --------->? ms
            nếu làm tròn thì truyền 1 bit mất 0,1ms=100us
            trong khi chu kỳ máy là 0,125us (nếu dùng thạch anh 8Mhz)
            như vậy nếu dùng ngắt nhận khi khi avr trỏ tới lệnh "IN Rn,UDR " chỉ mất vài chu kỳ máy nên ko có trể xảy ra.cứ như thế bạn sẽ tính dược cho các tốc độ baud khác.
            sau đây là chương trình ngắt nhận
            UART_RXC:
            IN TEMPM,SREG
            IN REC_TEMP,UDR

            ST Y+,REC_TEMP
            DEC RX_COUNT
            BRNE RXC_EXIT
            LDI YH,HIGH(REC_BEGIN);vùng ram chứa dữ liệu nhận
            LDI YL,LOW(REC_BEGIN)
            LDI RX_COUNT,BYTE_TRANS;số byte truyền nhận
            RXC_EXIT:
            OUT SREG,TEMPM
            RETI
            Last edited by hotuanhai; 01-03-2009, 03:22.

            Comment


            • #7
              Nguyên văn bởi hotuanhai Xem bài viết
              bạn lưu ý thanh ghi UDR thực chất là 2 thanh ghi độc lập về mặt mật lý:
              - khi bạn gõ lệnh: OUT UDR,Rn AVR hiểu là bạn đưa data vào thanh ghi truyền
              - khi bạn gõ lệnh: IN Rn,UDR AVR hiểu là bạn lấy data từ thanh ghi nhận.
              do đó , trong chương trình ngắt nhận data:sau lệnh"IN Rn,UDR " thì bộ đệm nhận dữ liệu của avr trống và có thể nhận byte tiếp theo.
              OK.cảm pác,t giai quyết dc vấn đề này rồi.
              Pác cho t hỏi ve ngắt một chút:
              + giả sử ta sử dụng hai ngắt UART và ngắt INT1 (tích cục ở sườn lên),và ko cho phép ngắt trong ngắt.Ví dụ như ct đang xử lý ngắt USART thì ở bên ngoài ta tác động vào chân INT1 của AVR (tạo ra ngắt ngoài). Như vậy thì khi ct xử lý ngắt USART xog thì có xảy ra ngắt INT1 ko (bit INT1 có đc set lên 1 ko?)
              + Lý do t hỏi vậy là trước t có thử nghiệm dùng hai ngắt INT1 và INT0 (ko cho phép ngắt trong ngắt). khi chay ct t cho ngắt INT0 thực hiện và cũng tác động luôn sau đó vào chân INT1,thì thấy khi xử lý xog ngắt INT0 nó lại tạo ra ngắt INT1.
              t chẳng hiểu là AVR nó như vậy hay là do phần mềm mình viết sai nữa. Nhưng chắc là cho MCU của nó làm đấy nhỉ.Có phải ko hả pác?

              Comment


              • #8
                Nguyên văn bởi xuanlam163 Xem bài viết
                OK.cảm pác,t giai quyết dc vấn đề này rồi.
                Pác cho t hỏi ve ngắt một chút:
                + giả sử ta sử dụng hai ngắt UART và ngắt INT1 (tích cục ở sườn lên),và ko cho phép ngắt trong ngắt.Ví dụ như ct đang xử lý ngắt USART thì ở bên ngoài ta tác động vào chân INT1 của AVR (tạo ra ngắt ngoài). Như vậy thì khi ct xử lý ngắt USART xog thì có xảy ra ngắt INT1 ko (bit INT1 có đc set lên 1 ko?)
                + Lý do t hỏi vậy là trước t có thử nghiệm dùng hai ngắt INT1 và INT0 (ko cho phép ngắt trong ngắt). khi chay ct t cho ngắt INT0 thực hiện và cũng tác động luôn sau đó vào chân INT1,thì thấy khi xử lý xog ngắt INT0 nó lại tạo ra ngắt INT1.
                t chẳng hiểu là AVR nó như vậy hay là do phần mềm mình viết sai nữa. Nhưng chắc là cho MCU của nó làm đấy nhỉ.Có phải ko hả pác?
                bạn hỏi và tự giải đáp luôn rồi còn gì!

                Comment


                • #9
                  Nguyên văn bởi hotuanhai Xem bài viết
                  bạn hỏi và tự giải đáp luôn rồi còn gì!
                  thế đúng là do MCU của nó làm uh?
                  và nếu như vậy thì các bit cờ của tất cả các ngắt đều làm như vậy uh? và trong khoảng thời gian ngắt thì có thể nhiều bit cò của các ngắt có thể dc set lên 1 khi nó đc tác động gây ra ngắt HAY chỉ đc phép một bit cờ dc set len 1 khi nắt tương ứng đó dc tác động.
                  Pac nói rõ cho t nhe.

                  Comment


                  • #10
                    Nguyên văn bởi xuanlam163 Xem bài viết
                    OK.cảm pác,t giai quyết dc vấn đề này rồi.
                    Pác cho t hỏi ve ngắt một chút:
                    + giả sử ta sử dụng hai ngắt UART và ngắt INT1 (tích cục ở sườn lên),và ko cho phép ngắt trong ngắt.Ví dụ như ct đang xử lý ngắt USART thì ở bên ngoài ta tác động vào chân INT1 của AVR (tạo ra ngắt ngoài). Như vậy thì khi ct xử lý ngắt USART xog thì có xảy ra ngắt INT1 ko (bit INT1 có đc set lên 1 ko?)
                    + Lý do t hỏi vậy là trước t có thử nghiệm dùng hai ngắt INT1 và INT0 (ko cho phép ngắt trong ngắt). khi chay ct t cho ngắt INT0 thực hiện và cũng tác động luôn sau đó vào chân INT1,thì thấy khi xử lý xog ngắt INT0 nó lại tạo ra ngắt INT1.
                    t chẳng hiểu là AVR nó như vậy hay là do phần mềm mình viết sai nữa. Nhưng chắc là cho MCU của nó làm đấy nhỉ.Có phải ko hả pác?
                    trong AVR không co thanh ghi điều khiển ưu tiên ngắt
                    mà các ngắt được ưu tiên theo địa chỉ ngắt, ngắt có địa chỉ thấp hơn dược ưu tiên hơn
                    vậy nếu đang xử lý ngắt UART mà sảy ra ngắt INT1 và địa chỉ ngắt INT1 mà thấp hơn địa chỉ ngắt UART thì nó sẽ cất con tro chương trình vả thực hiện ngắt INT1 và sau đó mới quay trở lại
                    tuy nhiên nếu bạn không muốn INT1 được ưu tiên thì khi có ngắt UART bạn phải xóa ngắt toàn cục cli và khi sư lý xong thì khôi phục lại


                    UART_RXC:
                    in r0,SREG
                    cli
                    .............................
                    sei
                    out SREG,r0
                    RETI
                    Điện thoại:
                    email:

                    Comment


                    • #11
                      Hình như khi xảy ra 1 ngắt (chẳng hạn UART) thì p.cứng sẽ tự động xoá cờ ngắt chung (CLI). Do đó, nếu có ngắt ưu tiên hơn (chẳng hạn INT0) thì nó chỉ set đặt cờ INTF0 chứ o cp ngắt xảy ra. Sau khi chạy xong ngắt UART, nó sẽ chạy tiếp ngắt INT0.
                      Với baudrate bình thường, dùng ngắt nhận, có hoặc o có bộ đệm nhận; mình thấy các VDK đều có thể truyền/nhận cả mảng[] (dc bao nhiêu phần tử thì chưa rõ, chắc phải tính toán như ở trên); nhưng cũng với điều kiện là o xảy ra ngắt trong ngắt.
                      !e

                      Comment


                      • #12
                        Nguyên văn bởi zemen Xem bài viết
                        Hình như khi xảy ra 1 ngắt (chẳng hạn UART) thì p.cứng sẽ tự động xoá cờ ngắt chung (CLI). Do đó, nếu có ngắt ưu tiên hơn (chẳng hạn INT0) thì nó chỉ set đặt cờ INTF0 chứ o cp ngắt xảy ra. Sau khi chạy xong ngắt UART, nó sẽ chạy tiếp ngắt INT0.
                        Với baudrate bình thường, dùng ngắt nhận, có hoặc o có bộ đệm nhận; mình thấy các VDK đều có thể truyền/nhận cả mảng[] (dc bao nhiêu phần tử thì chưa rõ, chắc phải tính toán như ở trên); nhưng cũng với điều kiện là o xảy ra ngắt trong ngắt.
                        vâng đúng khi ct nhay vào trong trình ngắt thì phần cứng sẽ xóa cờ I trong sreg,khi gặp lẹnh reti thì nó tự động cho I=1.nếu muốn dùng ngắt trong ngắt thì khi vào ct ngắt ta phải set bit I lên 1.
                        Nhưng vấn đề là khi ta sử dụng >1 ngắt trong ct và ko sử dụng ngắt trong ngắt.như bài trên e lấy vdụ đó:khi ta nhận nhiều byte liên tiếp.với ngắt nhận khi có ngắt thì nó nhảy vào ct ngắt và nhận cho đủ số byte nó nhận,nhưng tại thời điểm này lại có một cờ yêu cầu ngắt dc set(gia sử cờ INTF1).Nhưng do lý do nào đó mà nó nhận dc một byte và byte tiếp theo ko kịp vào bộ đệm nhận thì nó se thoat khỏi trình ngắt nhận và tiếp tục xảy ra ct ngắt INT1.trong thòi gian xảy ra ngắt INT1 thì lại có>1byte vào bộ đệm nhận,như vậy khi nó xử lý xog ngắt INT1 thì lại vào ngắt nhận,khi đó dliệu nhận sẽ bị tràn và có lỗi. Như vậy t có thể cấm ko cho ngắt INT1 khi vào ct ngắt nhận(bằng cách cho bít INT1=0) và cho phép ngắt INT1 khi nó đẫ nhận đủ số byte nhận dc ko vậy? và nếu như vậy thì bất kể chân INT1 có bị tác động (khi INT1=0) thì bit cờ INTF1 cũng khong dc set len 1 đúng ko vậy?

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X