Thông báo

Collapse
No announcement yet.

a USART trong AVR

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

  • #61
    Nguyên văn bởi mrgiang99 Xem bài viết
    Cái này trước đây tôi có làm, nhưng cơ cấu chấp hành không phải là bom mà là máy xén.

    Sensor kiểm tra ngõ vào là sensor kiểm tra hình dạng (CCD camera, limit SW, cảm biến tiệm cận da thịt....), kiểm tra nhận biết những chỗ lồi ra!

    ....Sau đó chỗ nào lồi là cắt!

    Vậy đổi cơ cấu chấp hành thành bom là bùm! Tan xác cả cô con gái và chàng trai đang xâm nhập!



    Mô phỏng Zen thì qua luồng PLC OMRON cũ rích của tôi mà down soft về!

    (Để up lên, không biết server có cho không nữa!)

    Còin password thì chờ tôi nghĩ cách đập nó ra và cắt cái khóa đó là xong!
    em cảm ơn anh!
    nhưng anh ới nhỡ phải cô bạn gái có ngực kiểu (hựu dai) thì nó cũng nhận nhầm là bạn trai thì chết
    mà phải làm sao bom chỉ nổ thằng nào dò đến cưa con gái ông thôi còn cô bé vẫn bình an vô sự, thế mới tài và cần đến kỹ sư phòng thi hành nổ chứ
    (em đùa một chút cho đỡ căng thẳng các anh server đừng khóa nhé)
    Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

    Comment


    • #62
      ah vậy thì bạn trai mắt kính của hựu dai vào thì chắc là thoát đó, nên tìm một giải thuật khác...

      Comment


      • #63
        Nguyên văn bởi hoctro89xxx Xem bài viết
        Bạn lại không đọc kỹ bài viết của tôi rồi. Trong bái viết tôi có hướng dẫn 2 cách để cho con phát thay đổi đấy thôi.
        Con M cũng vậy, chuyển thành 6 bit, bit dữ liệu cuối phải gán =0--> để các con S đang không nhận dữ liệu thì không nhận khung này - vì nó thấy bit stop thứ nhất =0. Cũng có thể thiết lập cho con M ngay từ đầu có khung là n+1 bit + 1 stop, truỳên địa chỉ thì cho bit n+1 =1, truyền dữ liệu thì cho =0.
        Nó đấy bạn
        hình nhu minh thay che dộ truyền đa xử lý chỉ có trong truyền thông vói khung dữ liệu 9bit thi phai.
        ma có thay đổi khung truyền và nhận như vậy thì các S khác sẽ báo lỗi khung dúng ko vạy'

        Comment


        • #64
          Em đang đọc về USART , nhưng thấy hơi lơ mơ về kết nối đồng bộ và khồng đồng bộ . Em hỏi mấy câu nếu gà thì anh em chỉ giáo , tại đọc tiếng Anh nên hơi lơ tơ mơ
          1- Nếu để kết nối đồng bộ thì chân XCK sẽ truyền ( nhận xung clock) . Nếu ko đồng bộ thì chân này không có tác dụng ạ .
          2- Có thể kết nối đồng bộ tối đa bao nhiêu cổng RxD TxD
          3- Nếu em chỉ cần kết nối giữa 2 MCU . nên sử dụng đồng bộ hay không đồng bộ , lợi và hại ra sao ?
          4- Thường thi với 1 số xung clock và baud rate hay có lỗi truyền ( chỉ 0.2% chẳng hạn ) . Điều này có ảnh hưởng gì đến truyền và nhận không
          5- Câu cuối : em chưa làm kết nối 2 MCU bao h , nên muốn hỏi là có thể truyền và nhận 1 byte , sau đó xử lý từng bit trong byte đc ko . Em không muốn truyền đi một ký tự . Có thể phác thảo cho em cái code để xử lý từng bit một không ạ ?
          Cuối cùng cảm ơn các bác đã đọc

          Comment


          • #65
            Mình cũng chỉ biết một chút, xin trao đổi:
            1. Đúng
            2. Tùy theo sức nhận dòng/cấp dòng của ic có RXD/TXD; khoảng cách truyền nhận, có qua bộ đệm hay không (như max232 chẳng hạn).
            3. Ứng dụng đơn giản thì nên dùng không đồng bộ, ngoài ra nó đỡ 1 chân trống (XCK). Dùng đồng bộ khi cần chống nhiễu nhiều hơn, cần chính xác hơn.
            4. Nếu dùng thạch anh không khớp với công thức tính 'baudrate' thì mới có cái sai số truyền (chẳng hạn 12MHz thay vì 11,0592MHz). Với lỗi 0,2%, tức là truyền 1000 byte may ra sai dữ liệu 2 byte, thì sẽ không ảnh hưởng gì nhiều trong những ứng dụng đơn giản; hơn nữa chỉ tốc độ 'baudrate' lớn mới dễ gây ra nhiều sai số thôi.
            5. Đã truyền nhận đc byte thì khó gì xử lí từng bit. Cái này đâu dính dáng gì đến USART, mà là ở kĩ thuật lập trình chứ!
            !e

            Comment


            • #66
              em đang làm về nhận dữ liệu từ chân RxD , Nếu trong vòng lặp while(1) mà em dùng hàm nhận dữ liệu từ RxD thì MCU có chờ đến khi nhận dữ liệu để xử lý ko nếu lệnh tiếp theo có sử dụng đến biến này
              Cái gì người khác làm được , mình cũng làm được !

              Comment


              • #67
                Hàm while(1) là vòng lặp vô tận, VĐK sẽ thực hiện chương trình từ trên xuống dưới, nếu thỏa mãn điều kiện thì nó sẽ thực hiện còn không sẽ bỏ qua để thực hiện lệnh tiếp theo. Còn về biến, nếu có giá trị mới thì sẽ cập nhật, còn ko thì vẫn sài giá trị trước đó.
                Phone: 0909319477
                Email:

                Comment


                • #68
                  Vậy nếu em muốn MCU chờ cho đến khi nhận tín hiệu từ RxD chuyển về mới thực hiện tiếp thì làm thế nào ạ . Liệu có nên ước lượng thời gian tính toán bên kia để delay_ms() 1 khoảng thời gian nhất định không . Vì bài toán xử lý của MCU cũng khá là đơn giản
                  Cái gì người khác làm được , mình cũng làm được !

                  Comment


                  • #69
                    Thử sử dụng Phương Phap này xem,bạn có thể can thiệp vào bất cứ chỗ nào trong chương trình mà không phải phụ thuộc vào một cấu trúc sẵn có:
                    ;#######################################
                    ;Model:Usart v01
                    ;Data :14 Juny 09
                    ;By :Le xuan Vinh
                    ;Mobel84)933819419
                    ;=======================================
                    ;MCU :Atmega8
                    ;Fosc :8Mhz
                    ;usart:baud[19200bps]
                    ;Txc :Trans 16Byte
                    ;Rxc :Recover 16Byte
                    ;***************************************
                    ;portd pins
                    .equ rxd =0
                    .equ txd =1
                    ;+++++++++++++++++++++++++++++++++++++++
                    .include"m8def.inc"
                    .org 0x0000
                    rjmp reset
                    .org urxcaddr
                    rjmp isr_rxc
                    .org utxcaddr
                    rjmp isr_txc
                    ;***************************************
                    isr_rxc:
                    ;---------------------------------------
                    .equ rxc_size =0x006e
                    .equ rxc_recover00=0x0070
                    .equ rxc_recover01=0x0071
                    .equ rxc_recover02=0x0072
                    .equ rxc_recover03=0x0073
                    .equ rxc_recover04=0x0074
                    .equ rxc_recover05=0x0075
                    .equ rxc_recover06=0x0076
                    .equ rxc_recover07=0x0077
                    .equ rxc_recover08=0x0078
                    .equ rxc_recover09=0x0079
                    .equ rxc_recover10=0x007a
                    .equ rxc_recover11=0x007b
                    .equ rxc_recover12=0x007c
                    .equ rxc_recover13=0x007d
                    .equ rxc_recover14=0x007e
                    .equ rxc_recover15=0x007f
                    ;---------------------------------------
                    push r16
                    in r16,sreg
                    push r16
                    push r17
                    push r18
                    push xl
                    push xh

                    lds r18,rxc_size
                    in r16,udr
                    ldi r17,'#'
                    cpse r16,r17
                    rjmp irxc_frame
                    rjmp irxc_store
                    irxc_frame:
                    cpi r18,0x00
                    breq irxc_exit
                    irxc_store:
                    ldi xh,0x00
                    ldi xl,0x70
                    add xl,r18
                    st x,r16
                    // out udr,r16
                    inc r18
                    sts rxc_size,r18
                    cpi r18,0x10
                    brne irxc_exit
                    clr r18
                    sts rxc_size,r18
                    irxc_exit:
                    pop xh
                    pop xl
                    pop r18
                    pop r17
                    pop r16
                    out sreg,r16
                    pop r16
                    reti
                    ;=======================================
                    isr_txc:
                    .equ txc_size =0x006f
                    .equ txc_send00 =0x0080
                    .equ txc_send01 =0x0081
                    .equ txc_send02 =0x0082
                    .equ txc_send03 =0x0083
                    .equ txc_send04 =0x0084
                    .equ txc_send05 =0x0085
                    .equ txc_send06 =0x0086
                    .equ txc_send07 =0x0087
                    .equ txc_send08 =0x0088
                    .equ txc_send09 =0x0089
                    .equ txc_send10 =0x008a
                    .equ txc_send11 =0x008b
                    .equ txc_send12 =0x008c
                    .equ txc_send13 =0x008d
                    .equ txc_send14 =0x008e
                    .equ txc_send15 =0x008f
                    ;---------------------------------------
                    push r16
                    in r16,sreg
                    push r16
                    push r17
                    push xl
                    push xh

                    lds r17,txc_size
                    ldi xh,0x00
                    ldi xl,0x80
                    add xl,r17
                    ld r16,x
                    out udr,r16
                    inc r17
                    sts txc_size,r17
                    cpi r17,0x10
                    brne itxc_exit
                    clr r17
                    sts txc_size,r17
                    itxc_exit:
                    pop xh
                    pop xl
                    pop r17
                    pop r16
                    out sreg,r16
                    pop r16
                    reti
                    ;***************************************
                    reset:
                    ;---------------------------------------
                    default_portx:
                    ser r16
                    out ddrb,r16
                    out ddrc,r16
                    ldi r16,0xfc
                    out ddrd,r16
                    ;---------------------------------------
                    ldi r16,low(ramend)
                    out spl,r16
                    ldi r17,high(ramend)
                    out sph,r17
                    ;---------------------------------------
                    ldi r19,~0x00
                    ldi r18,~0x00
                    ldi r17,~0x00
                    ldi r16,~0x00
                    rswait:
                    inc r16
                    brne rswait
                    inc r17
                    brne rswait
                    inc r18
                    brne rswait
                    inc r19
                    brne rswait
                    ;=======================================
                    default_usart:
                    ldi r16,(1<<rxcie)|(1<<txcie)|(1<<rxen)|(1<<txen)
                    out ucsrb,r16
                    ldi r16, (1<<ursel)|(1<<ucsz1)|(1<<ucsz0)
                    out ucsrc,r16
                    clr r17
                    out ubrrh,r17
                    ldi r16,25
                    out ubrrl,r16
                    ldi r16,'>'
                    out udr,r16
                    ;=======================================
                    default_sleep:
                    ldi r16,(1<<se)|(0<<sm2)|(0<<sm1)|(0<<sm0)
                    out mcucr,r16
                    ;=======================================
                    default_varx:

                    ldi zl,low(font_usart0*2)
                    ldi zh,high(font_usart0*2)
                    ldi yh,0x00
                    ldi yl,0x80
                    load_lpm:
                    lpm r16,z+
                    st y+,r16
                    cpi yl,0x90
                    brne load_lpm

                    ldi r16,0x00
                    sts rxc_size,r16
                    sts txc_size,r16
                    ;---------------------------------------

                    ldi r16,'>'
                    out udr,r16

                    sei
                    ;=======================================
                    void_main:
                    sleep
                    rjmp void_main
                    ;****************************************
                    font_usart0:
                    .db 13,10,"Sigle ATmega8."

                    Comment


                    • #70
                      Bác viết bằng hợp ngữ , cái này thì em ko biết em toàn viết bằng CodeVision thôi . Trình vẫn gà mà
                      Em định cho chạy 1 vòng while cho đến khi xuất hiện tín hiệu nhập đến thì kết thúc , sau đó đẩy giá trị đó về 0 như sau
                      check = 0;
                      while(1)
                      {
                      .......
                      while(!(check))// chạy vòng lặp bên trong
                      {
                      check = getchar();//nhận tín hiệu RxD
                      }
                      ....
                      check=0;// dua check= 0 để cho vòng lặp tới
                      }
                      Thế này chạy chắc là ổn nhỉ. Liệu có cần xóa bộ đêm nhận để thực hiện lệnh này ko . Em sợ nếu ko có dữ liệu đến thì MCU vẫn cho dữ liệu nhận bằng dữ liệu cũ
                      Cái gì người khác làm được , mình cũng làm được !

                      Comment


                      • #71
                        Nguyên văn bởi aprninth Xem bài viết
                        Bác viết bằng hợp ngữ , cái này thì em ko biết em toàn viết bằng CodeVision thôi . Trình vẫn gà mà
                        Em định cho chạy 1 vòng while cho đến khi xuất hiện tín hiệu nhập đến thì kết thúc , sau đó đẩy giá trị đó về 0 như sau

                        Thế này chạy chắc là ổn nhỉ. Liệu có cần xóa bộ đêm nhận để thực hiện lệnh này ko . Em sợ nếu ko có dữ liệu đến thì MCU vẫn cho dữ liệu nhận bằng dữ liệu cũ
                        Ủa, lệnh getchar() sẽ làm VDK chờ tới khi có dữ liệu trong UDR nhận mà! Đâu cần phải while(!check) làm gì nữa chứ!
                        !e

                        Comment


                        • #72
                          @ dnk0904:
                          4: về sai số 0,2% thì nó là sai số về tốc độ baud khi truyền data (công thức tính tốc độ baud này thì bạn xem kĩ trong datasheet). nó chỉ có ý nghĩa khi bạn giao tiếp với máy tính hoặc với thiết bị khác có tốc độ baud chuẩn. còn nếu bạn sử dụng 2 VDK giao tiếp với nhau mà khi tính tốc độ baud của 2 con này là bằng nhau thì sai số là 0.

                          còn khi có sai số này giả sử là 0,2% thì nó là sai số về tốc độ truyền. chỉ trên một frame data nhất định chứ ko có sai số cộng dồn. có nghĩa là với tốc độ baud chuẩn nào đó cần thời gian t để truyền hết khung data (từ bit start đến bit stop) thì thực tế thời gian để truyền hết khung truyền này sẽ bị sai lệch 0,2% của t. và sau mỗi frame thì phần nhận sẽ được set lại bằng bit start nên sẽ không có sai số cộng dồn ở đây.
                          bởi vậy cho dù có sai số thì khả năng lỗi data cũng rất là thấp chứ không phải là truyền 1000 byte thì lỗi 2byte đây nhé.
                          thân!

                          Comment


                          • #73
                            Nguyên văn bởi aprninth Xem bài viết
                            Bác viết bằng hợp ngữ , cái này thì em ko biết em toàn viết bằng CodeVision thôi . Trình vẫn gà mà
                            Em định cho chạy 1 vòng while cho đến khi xuất hiện tín hiệu nhập đến thì kết thúc , sau đó đẩy giá trị đó về 0 như sau

                            Thế này chạy chắc là ổn nhỉ. Liệu có cần xóa bộ đêm nhận để thực hiện lệnh này ko . Em sợ nếu ko có dữ liệu đến thì MCU vẫn cho dữ liệu nhận bằng dữ liệu cũ
                            khi sử dụng getchar() thì nó sẽ kiểm tra bộ đệm và lấy về một kí tự trong bộ đệm buff nếu nó khác null. nếu không thì sẽ chở ở đây. và khi lấy data về thì nó sẽ tự động trừ biến đếm data trong buff nên bạn khỏi cần quan tâm đến việc xóa bộ đệm.
                            nếu bạn muốn chương trình chạy mà không bị dừng ở lệnh getchar() này thì trước khi gọi nó bạn kiểm tra biến đếm rx_counter. đây là biến đếm số lượng data đang chứa trong buff.
                            còn chú ý nữa là khi sử dụng USART bạn cần cân nhắc giữa tốc độ baud, thời gian xử lí data trong buff và size của buff để không bị tràn buff và mất data.

                            Comment


                            • #74
                              mình cũng mới học về vi điều khiển AVR.con ATMEGA32 có USART trong datasheet của ATMEGA32 có ghi rất rõ ràng về những thắc mắc của bạn.bạn hãy vào trang ATMEL.COM.

                              Comment


                              • #75
                                vậy mình nghĩ nên truyền kiểu 9bit cũng ổn
                                còn nếu sợ vdk không nhận ra đâu là dât hay address thì nên truyền lần 3byte cho chắc
                                Tư vấn thiết kế hệ thống điện-điện tử theo yêu cầu.
                                Tel: 0903 702 417. Email: web:

                                Comment

                                Về tác giả

                                Collapse

                                Le Thi Bich Tìm hiểu thêm về Le Thi Bich

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

                                Collapse

                                Đang tải...
                                X