Thông báo

Collapse
No announcement yet.

lập trình hợp ngữ

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

  • lập trình hợp ngữ

    có bác nào lập trình cho AVR bằng hợp ngữ ko vậy,cho t hỏi tí chút
    các bác kt cho t đoạn code này nha:
    .EQU slave=0x01
    .EQU chot_kenh=7
    .EQU chot_sdv=6
    .EQU chot_dv=7
    .EQU chot_chuc=6
    .EQU chot_tram=5
    .EQU chot_ngin=4
    .EQU hsb_doi=0x21
    .EQU so_chia=0x0A
    .EQU enable_TX=4
    .EQU led_error=7
    .EQU led_auto=4
    .EQU rx_error=0xfe
    ;register
    .DEF tam =r16
    .DEF tam1 =r17
    .DEF auto =r18
    .DEF so_du =r4
    .DEF kenh_do =r5
    .DEF hs_nhan=r6
    .NOLIST
    .INCLUDE "C:\Documents and Settings\XUAN LAM\Desktop\thu\AVR studio\m16def.inc"
    .INCLUDE iodefs.asm
    .LIST
    .CSEG
    .org 0x00
    jmp RESET
    jmp USART_RX


    RESET:
    ldi tam, HIGHT(RAMEND) ;
    out SPH, tam ;
    out ZH, tam
    ldi tam, LOW(RAMEND) ;
    out SPL, tam ;
    out ZL, tam
    inc ZL
    st Z+, tam ;chua dia chi slave
    ldi tam, hsb_doi
    mov hs_nhan, tam
    ;khoi tao cong
    ;PB0-3 la cac cong vao 3 trang thai
    ;PB4-7 la cac cong ra so o muc high
    ldi tam, (1<<DDB4)|(1<<DDB5)|(1<<DDB6)|(1<<DDB7)
    out DDRB, tam
    ldi tam, (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7)
    out PORTB, tam
    ;PD4_7 LA CAC DAU RA SO O MUC HIGH
    ldi tam, (1<<DDD4)|(1<<DDD5)|(1<<DDD6)|(1<<DDD7)
    out DDRD, tam
    ldi tam, (1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7)
    out PORTD, tam
    ;PC LA CAC DAU RA SO;
    ;PC4_7=1
    ser tam
    out DDRC, tam
    ldi tam, (1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7)
    out PORTC, tam
    ;khoi tao USART nhan voi:
    ;tu pc truyen 8bit,parity le,1bit stop,khi pc truyen di chi thi bit thu7=1
    ;du lieu kenh =0, truyen lien tiep 2 byte ma ASSCI
    ;pc nhan : 8bit du lieu, p le, 1bit stop, nhan lien tuc 7 byte dang ma ASCCI]
    ;VDK nhan : khoi tao nhan 7bit , p le, 2bit stop, su dung che do da xu ly: MPCM=1
    ;VDK truyen: khoi tao truyen 8bit du lieu, p le, 1bit stop, bit thu7=0
    ; truyen7 byte lien tiep: 1byte dia chi slave, 1byte kenh do, 5byte du lieu do.
    ; tat ca duoi dang ma ASCCI
    ;khai bao toc do truyen 9600, dat che do da xu ly
    ldi tam, 0x33 ;
    out UBRRL, tam ;toc do 9600 o tan so thach anh 8MHz
    ldi tam, (1<<MCPM) ;
    out UCSRA, tam ;dat che do da xu ly
    rcall setup_RXn ;goi ctc khoi tao USART_TX
    sei
    main:
    cpi auto, 0x09
    brsh automatic
    rcall setup_TX
    sbic PORTB, led_error
    rjmp start_TX
    ldi tam, slave
    sbi tam, 0b00110000
    lsl tam
    out UDR, tam
    loop1:
    sbis UCSRA, UDRE
    rjmp loop1
    ldi tam, rx_error
    out UDR, tam
    rjmp exit
    start_RX:
    cbi PORTB, led_auto
    ldi tam1, 7
    loop2: ld tam,-Z
    sbi tam, 0b00110000
    lsl tam
    out UDR
    loop3: sbrs UCSRA, UDREN
    rjmp loop3
    dec tam1
    brne loop2
    exit:
    sbi PORTB, led_error
    cbi PORTD, enable_TX
    rcall setup_RX
    rjmp main
    automatic:
    sbi PORTB, led_auto
    rjmp main
    ;ctc khoi tao bo nhan satup_RX
    setup_RX:
    push tam
    ldi tam, (1<<MPCM)
    out UCSRA, tam
    ldi tam, (1<<RXCIE)|(1<<RXEN)
    out UCSRB, tam
    ldi tam, (1<<URSEL)|(1<<UPM1)|(1<<UPM0)|(1<<USBS)|(1<<UCSZ1 )
    out UCSRC, tam
    pop tam
    ret
    ;ctc khoi tao bo truyen setup_TX
    setup_TX:
    push tam
    ldi tam, (1<<TXEN)
    out UCSRB, tam
    ldi tam, (1<<URSEL)|(1<<UPM1)|(1<<UPM0)|(1<<USBS)|(3<<UCSZ0 )
    out UCSRC, tam
    pop tam
    ret
    ;trinh phuc vu ngat USART,RXC
    USART_RX:
    push tam1
    push tam
    in SREG, tam
    push tam
    in tam1, UCSRA
    in tam, UDR
    sbis UCSRA, MPCM
    rjmp data_RX
    andi tam1, (1<<FE)|(1<<DOR)|(1<<PE)
    breq no_error
    exit_RX:
    pop tam
    out SREG, tam
    pop tam
    pop tam1
    reti
    no_error:
    cbi tam, 0b00110000
    cpi tam, slave
    breq sdata_RX
    rjmp exit_RX
    sdata_RX:
    in tam, UCSRA
    cbi tam, 0b00000001
    out UCSRA, tam
    in tam, ADCSRA
    cbi tam, 0b110010000 ;ghi cac bi ADN=0,ADSC=0,ADIF=0
    out ADCSRA, tam
    in tam, GIFR
    cbi tam, 0b01000000
    out GIFR, tam ;ghi cac bit INT0=0,INTF0=0
    out GICR, tam
    rjmp exit_RX
    data_RX:
    andi tam1, (1<<FE)|(1<<DOR)|(1<<PE)
    breq data_no_error
    cbi PORTB, led_error
    sbi PORTD, enable_TX
    rjmp exit_RX
    data_no_error:
    cbi tam, 0b00110000
    mov auto, tam
    cpi tam, 0x09
    brsh exit_RX
    mov kenh_do, tam
    sbi PORTD, enable_TX
    rjmp exit_RX

    sao nó cứ báo lỗi hoài vậy. báo lỗi là 'string expected'
    các bác kt ho nha, t chẳng tìm thấy lỗi chỗ nào

  • #2
    - Chỗ include thiếu dấu .INCLUDE iodefs.asm
    - Bạn nên để các khai báo .equ hay .def sau .cseg
    - Bạn nên trình bày rõ ràng hơn, ký hiệu các label, khoảng cách giữa các hàm,... Để mọi người dễ đọc và góp ý.
    Mồm chó vó ngựa

    Comment


    • #3
      lập trình hợp ngữ

      Nguyên văn bởi yankazaz Xem bài viết
      - Chỗ include thiếu dấu .INCLUDE iodefs.asm
      - Bạn nên để các khai báo .equ hay .def sau .cseg
      - Bạn nên trình bày rõ ràng hơn, ký hiệu các label, khoảng cách giữa các hàm,... Để mọi người dễ đọc và góp ý.
      hình như chỗ đó đã co rồi mà.b xem lại đi
      mà các khai báo label m khai báo ở đó cũng được mà.m đã thử với một đoạn code khác vẫn chạy ngon lành mà.
      mà m đã viết các nhãn và các lệnh rất rõ rồi đấy,chẳng hiểu làm sao khi post lên nó lại khó nhìn như vậy nữa
      Last edited by lytau; 13-11-2008, 10:18.

      Comment


      • #4
        Thử xem chỗ này:

        .EQU slave=0x01
        .EQU chot_kenh=7
        .EQU chot_sdv=6
        .EQU chot_dv=7
        .EQU chot_chuc=6
        .EQU chot_tram=5
        .EQU chot_ngin=4
        .EQU hsb_doi=0x21
        .EQU so_chia=0x0A
        .EQU enable_TX=4
        .EQU led_error=7
        .EQU led_auto=4
        .EQU rx_error=0xfe
        ;register
        .DEF tam =r16
        .DEF tam1 =r17
        .DEF auto =r18
        .DEF so_du =r4
        .DEF kenh_do =r5
        .DEF hs_nhan=r6
        .NOLIST
        .INCLUDE "C:\Documents and Settings\XUAN LAM\Desktop\thu\AVR studio\m16def.inc"
        .INCLUDE iodefs.asm
        .LIST
        .CSEG
        .org 0x00
        jmp RESET
        jmp USART_RX
        Tôi chỉ nói là "nên" thôi, thường thì tôi thấy như thế, sau include người ta mới khai báo các biến, và tôi cũng làm theo như vậy chứ chưa thử sắp xếp như bạn bao giờ cả.
        Bạn viết lệnh không dùng tab, không dùng cách, không dùng các dấu comment hợp lý thì tôi cũng chỉ góp ý cho đẹp với cả dễ nhìn thôi. Cũng chỉ là máy móc như viết bài toán, dấu bằng phải thẳng hàng thôi chứ có ảnh hưởng gì đâu .
        Mồm chó vó ngựa

        Comment


        • #5
          .INCLUDE "C:\Documents and Settings\XUAN LAM\Desktop\thu\AVR studio\m16def.inc"
          .INCLUDE iodefs.asm
          sau include là 2 dấu ngoặc kép.
          trong avr studio bạn set đường dẫn đến file include(phần asemler option)

          Comment


          • #6
            em cũng biết CT bằng asm mà em trình bày ...đẹp hơn bác nhiều, dễ nhìn 1 tí...sau này dễ kiểm soát hơn.

            Comment


            • #7
              lập trình hợp ngữ

              Nguyên văn bởi yankazaz Xem bài viết
              Thử xem chỗ này:



              Tôi chỉ nói là "nên" thôi, thường thì tôi thấy như thế, sau include người ta mới khai báo các biến, và tôi cũng làm theo như vậy chứ chưa thử sắp xếp như bạn bao giờ cả.
              Bạn viết lệnh không dùng tab, không dùng cách, không dùng các dấu comment hợp lý thì tôi cũng chỉ góp ý cho đẹp với cả dễ nhìn thôi. Cũng chỉ là máy móc như viết bài toán, dấu bằng phải thẳng hàng thôi chứ có ảnh hưởng gì đâu .
              cám ơn các pác nha
              t thử đc ròi.lý do sai chỉ là do cac h h thanh ghi IO t nhầm, và đặc biệt là do pc của t hôm đó nó 'ốm' nên ko kt lỗi được

              Comment


              • #8
                các pác có ai biết trên pc mình có thể thiết lập truyền khung dữ liệu 9 bit ko vậy. chỉ cho t với. t làm pc là master và truyền nhận với các slave (AVR), và các slave dùng ở chế độ đa xử lý,khung 9bit

                Comment


                • #9
                  Nguyên văn bởi HiMas88 Xem bài viết
                  em cũng biết CT bằng asm mà em trình bày ...đẹp hơn bác nhiều, dễ nhìn 1 tí...sau này dễ kiểm soát hơn.
                  pác có biết dùng AVR studio ko chỉ cho t một chút
                  ko hiểu làm sao khi t can thiệp vào các cờ ngắt thì lúc nó ngắt song thì trở về thực hiện tiếp lệnh tại thời điểm gây ngắt, lúc thì nó lại trở về địa chỉ gây ngắt rồi lại gây ngắt như lúc trước ngay,mặc dù cờ ngắt đó đã bị xoá.
                  pác đã gặp t/hợp nào như vậy chưa

                  Comment


                  • #10
                    Nguyên văn bởi lytau Xem bài viết
                    pác có biết dùng AVR studio ko chỉ cho t một chút
                    ko hiểu làm sao khi t can thiệp vào các cờ ngắt thì lúc nó ngắt song thì trở về thực hiện tiếp lệnh tại thời điểm gây ngắt, lúc thì nó lại trở về địa chỉ gây ngắt rồi lại gây ngắt như lúc trước ngay,mặc dù cờ ngắt đó đã bị xoá.
                    pác đã gặp t/hợp nào như vậy chưa
                    làm ơn đưa đoạn code lên nói dong dài thế ai mà hiểu được!

                    Comment


                    • #11
                      Nguyên văn bởi DONAGMON
                      ;trinh phuc vu ngat USART,RXC
                      USART_RX:
                      push tam1
                      push tam
                      in SREG, tam
                      push tam
                      in tam1, UCSRA
                      in tam, UDR
                      sbis UCSRA, MPCM
                      rjmp data_RX
                      andi tam1, (1<<FE)|(1<<DOR)|(1<<PE)
                      breq no_error
                      exit_RX:
                      pop tam
                      out SREG, tam
                      pop tam
                      pop tam1
                      reti
                      no_error:
                      cbi tam, 0b00110000
                      cpi tam, slave
                      breq sdata_RX
                      rjmp exit_RX
                      sdata_RX:
                      in tam, UCSRA
                      cbi tam, 0b00000001
                      out UCSRA, tam
                      in tam, ADCSRA
                      cbi tam, 0b110010000 ;ghi cac bi ADN=0,ADSC=0,ADIF=0
                      out ADCSRA, tam
                      in tam, GIFR
                      cbi tam, 0b01000000
                      out GIFR, tam ;ghi cac bit INT0=0,INTF0=0
                      out GICR, tam
                      rjmp exit_RX
                      data_RX:
                      andi tam1, (1<<FE)|(1<<DOR)|(1<<PE)
                      breq data_no_error
                      cbi PORTB, led_error
                      sbi PORTD, enable_TX
                      rjmp exit_RX
                      data_no_error:
                      cbi tam, 0b00110000
                      mov auto, tam
                      cpi tam, 0x09
                      brsh exit_RX
                      mov kenh_do, tam
                      sbi PORTD, enable_TX
                      rjmp exit_RX


                      Toi tu hoi neu dung MPCM ma phai kiem tra de xem do la data hay add
                      neu toi dung mot (bit nho) khac thay cho MPCM
                      Khi nhan byte dau tien neu MPCM (bit nho) =1 thi kiem tra address neu dung voi address cua slave thi xoa MPCM(bit nho) . neu MPCM =0 thi nhan data. Khi nao nhan du so byte thi set MPCM( bit nho) de cho nhan mot khung truyen khac.
                      doi voi cac slave ma nhan byte dau tien kiem tra MPCM =1 ma dia chi khong dung voi dia chi slave cua no thi no khong xoa co MPCM tuc co nghia la tat ca cac byte data ke tiep thi cac slave deu nhan vao va kiem tra .

                      vay MPCM co tac dung gi neu toi khong su dung MPCM la dung mot bit khac de nho thi chuong trinh cung chay giong nhu vay thoi.
                      Co bac nao ranh ve MPCM thi chi giup toi voi. toi doc datasheet thay no noi khac. la khi slave duoc dinh dia chi ta xoa MPCM di thi cac du lieu ke tiep duoc doc vao cho toi khi du so du lieu dinh truoc thi set lai MPCM . con doi voi cac slave khong duoc dinh dia chi thi no se bo qua tat ca cac du lieu cho toi khi dia chi duoc truyen khac.
                      Mong cac pac giup do. toi po tay roi.
                      theo m thi khi MPCM=1 nếu byte nhận vào đúng địa chỉ thì xóa bit MPCM và bắt đầu nhận dliệu (byte có bit trươc bit stop là 1) và bắt đầu nhận các byte dữ liệu(có bit trước bit stop là 0).còn các slave khác khi mà bit MPCM=1 thì sẽ ko tạo ra ngắt truyền thông khi các byte dữ liệu gửi đến.
                      vậy MPCM là bít quyết định các slave có tạo ra ngắt hay ko khi có các byte dliệu truyền tới

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X