Thông báo

Collapse
No announcement yet.

Cùng Duyphi bắt đầu học lập trình AVR

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

  • #31
    Nguyên văn bởi mrcuongcon Xem bài viết
    Ơ, lập trình bằng assembly... Thôi cũng được bởi dù sao bác Phi cũng bỏ luồng này rồi, mình tự nghiên cứu vậy
    Bác lập dùng trình dịch C nào thế?

    Bác có thể làm cho một led chạy lần lượt từ trái qua phải rồi từ phải qua trái ( không phải là sáng dần và tắt dần)??
    Bác cho em hỏi ý nghĩa của lệnh này như thế nào:
    Lưu ý là SPE và MSTR, SPR0 là các bit của một thanh ghi thuộc thanh ghi SPCR của AVR và bit SPIF thuộc thanh ghi SPSR.
    Trong Assembly:
    ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
    out SPCR, R17
    và Trong C:
    while(!(SPSR & (1<<SPIF)) ôi, cái lệnh while ấy thật là khó hiểu.

    SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    Đây là yêu cầu của bạn.
    Dùng phần mềm CodevisionAVR để dịch.
    Tôi gửi kèm theo cả file mô phỏng của Proteus để các bạn thử.

    /************************************************** ***
    This program was produced by the
    CodeWizardAVR V2.03.4 Standard
    Automatic Program Generator
    © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project : Led
    Version :
    Date : 8/26/2008
    Author : Nguyen Minh Hieu
    Company : ANCO
    Comments:


    Chip type : ATmega16
    Program type : Application
    Clock frequency : 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    ************************************************** ***/
    //cac led noi vao PORTA, cuc duong cua led noi vao tro 330R va noi len VCC
    //doan code nay lam led sang lan luot tu phai qua trai va tu trai qua phai

    #include <mega16.h>
    #include <delay.h>

    void main(void)
    {
    unsigned char i,data;
    PORTA=0xFF; //port A co tro keo ben trong
    DDRA=0xFF; //Huong cua du lieu = xuat du lieu ra
    while (1)
    {
    data = 0x01;
    //delay_ms(500); //tat tat ca cac led
    for(i= 0;i<=8;i++) // lap lai 9 lan cho 8 led
    {

    PORTA = ~data; // xuat du lieu ra dieu khien den
    delay_ms(500); // led sang 500ms
    data <<=1; // dich sang trai 1 bit
    }
    data = 0x80; // tat cac led
    for(i = 0;i<=8;i++) // lap lai 9 lan cho 8 led
    {
    PORTA = ~data; // dao du lieu tu trang thai sang thanh tat va xuat ra dieu khien den
    delay_ms(500);
    data >>= 1; // dich bit sang phai 1 bit
    }
    };
    }
    Attached Files
    n
    ĐT: 0986 492 489

    Tham khảo:

    Comment


    • #32
      Chân thành cảm ơn anh em và bạn Minh Hieu đã quan tâm đến chuyên mục này.
      TRước hết chân thành xin lỗi anh em- vì DuyPhi còn công việc ở Cty của mình, nên 1 tuần chỉ có khoảng bốn hay năm hôm là đóng góp vào diễn đàn còn cuối tuần có nhiều việc phải đi làm, giao dịch.....nên ko thể post bài liên tục được, nên mong các bác thấu hiểu.

      Comment


      • #33
        Tóm tắt lại một số vấn đề trước khi chuyển sang chương khác!
        1- Mạch nạp:
        Hiện nay có các nhà sản xuất:
        - PNLAB- giá 100/ mạch USB-AVR




        - Tme: 180 ngàn/ mạch USB-AVR


        - Phúc Thịnh- Giá 120 ngàn:





        Đặc biệt mạch nạp miễn phí có file đính kèm tự làm rất dễ của anh DŨNG :



        Link download về tự làm:
        http://dientuvietnam.net/forums/atta...6&d=1219415233

        Ưu điểm là dùng cáp cổng COM- nhưng khuyết điểm là không tương thích với 1 số mạch trên thị trường do quy cách cáp không theo chuẩn.(góp ý)
        Last edited by sphinx; 27-08-2008, 11:11. Lý do: sửa link Picture.

        Comment


        • #34
          chọn vi điều khiển để tiến hành nghiên cứu


          Để chọn ra 1 con CHIP để nghiên cứu lý ra phải xin hội ý kiến của anh chị em, tuy nhiên để khỏi mất thời gian thì tôi sẽ dựa trên ý kiến chủ quan và tình hình khách quan CHIP hiện có bán ở TpHCM mà chọn ra nhá :
          - Chọn con ARV-- Atmega8: Bởi vì nó có tích hợp nhiều thứ như ADC, SPI,....tần số dao động của nó cũng ngang bằng với các con mạnh khác trong họ hàng AVR. Vả lại giá của nó khá rẻ, dễ làm bo mạch, và tự làm....
          - Chọn con AVR- Atmega128: Con này khá mạnh đầy đủ các tính năng và thuộc hạng cao cấp hơn trong họ hàng về nhiều mặt như số lượng PORT, số lượng ngắt,.....tuy nhiên nó không dễ dàng tự làm được vì nó chỉ có kiểu chân dán,đổi lại vì đó là chiến lược nghiên cứu lâu dài, các bác có 1 con này thì học avr dài dài vẫn còn chuyện để để mà ngâm cứu.
          Last edited by MicroDuyphi; 27-08-2008, 11:15.

          Comment


          • #35
            Để đơn giản thì việc đầu tiên tôi sẽ chọn ra 1 trong số 2 con đó để tiến hành làm.
            Tôi chọn con Atmega8

            Thông tin datasheet của nó, anh em có thể tải về tại:





            Attached Files

            Comment


            • #36
              XÂY DỰNG SƠ ĐỒ MẠCH TIẾN HÀNH THÍ NGHIỆM


              Đây là sơ đồ mạch tối thiểu cần dùng đến như sau:


              Sơ đồ này tải từ trang của Vgam.

              Comment


              • #37
                Không biết có anh em nào rảnh design nó thành 1 cái PCB mạch không nhỉ???
                Vả lại vào 1 số trang của anh em cũng không thấy cái PCB TEST nào re rẻ để mua về học. Anh em nào làm thương mại nhớ ghi lại ý kiến góp này của DuyPhi.

                Comment


                • #38
                  Em cũng vừa mới mua con atMEGA128 về,đang viết chương trình đầu tiên là ứng dụng cho bảng LED,nhưng để chuyển từ 89 sang avr cũng còn nhiều vấn đề lắm:LÀm quen với tập lệnh mới,có những cấu trúc câu lệnh mới...Em cũng ủng hộ viết bằng ASM vì thực ra lúc đầu em viết bằng C cho 89,sau 1 thời gian thấy không ổn nên em quyết định dùng ASM để hiểu biết sâu hơn và chủ động trong tất cả những ứng dụng cần tốc độ cao.
                  Thiết kế, sửa chữa PLC,HMI, Servo,biến tần, máy tính công nghiệp
                  Lập trình ứng dụng VĐK, IC logic lập trình được (PAL,GAL, FPGA...)
                  DT:098 861 4347

                  Comment


                  • #39
                    CÁc bác cho em hỏi đoạn Code này nhé:
                    Assembly Code Example(1)
                    USART_Init:
                    ; Set baud rate
                    out UBRRH, r17
                    out UBRRL, r16
                    ; Enable receiver and transmitter
                    ldi r16, (1<<RXEN)|(1<<TXEN)
                    out UCSRB,r16
                    ; Set frame format: 8data, 2stop bit
                    ldi r16, (1<<USBS)|(3<<UCSZ0)
                    out UCSRC,r16
                    ret
                    Thì 2 chỗ đánh dấu đỏ có nghĩa là gì vậy???
                    CẢm ơn các bác nhiều
                    Thiết kế, sửa chữa PLC,HMI, Servo,biến tần, máy tính công nghiệp
                    Lập trình ứng dụng VĐK, IC logic lập trình được (PAL,GAL, FPGA...)
                    DT:098 861 4347

                    Comment


                    • #40
                      Nguyên văn bởi MicroDuyphi Xem bài viết
                      chọn vi điều khiển để tiến hành nghiên cứu


                      Để chọn ra 1 con CHIP để nghiên cứu lý ra phải xin hội ý kiến của anh chị em, tuy nhiên để khỏi mất thời gian thì tôi sẽ dựa trên ý kiến chủ quan và tình hình khách quan CHIP hiện có bán ở TpHCM mà chọn ra nhá :
                      - Chọn con ARV-- Atmega8: Bởi vì nó có tích hợp nhiều thứ như ADC, SPI,....tần số dao động của nó cũng ngang bằng với các con mạnh khác trong họ hàng AVR. Vả lại giá của nó khá rẻ, dễ làm bo mạch, và tự làm....
                      - Chọn con AVR- Atmega128: Con này khá mạnh đầy đủ các tính năng và thuộc hạng cao cấp hơn trong họ hàng về nhiều mặt như số lượng PORT, số lượng ngắt,.....tuy nhiên nó không dễ dàng tự làm được vì nó chỉ có kiểu chân dán,đổi lại vì đó là chiến lược nghiên cứu lâu dài, các bác có 1 con này thì học avr dài dài vẫn còn chuyện để để mà ngâm cứu.
                      Em thấy có thể dùng ATmega32, bộ nhớ của nó đủ dùng cho hầu hết các ứng dụng, các tính năng tương đối đầy đủ trừ giao tiếp XRAM. Nó cũng 32 chân, tương tự như 89xxx
                      !e

                      Comment


                      • #41
                        ldi r16, (1<<RXEN)|(1<<TXEN)
                        Nó setbit RXEN và TXEN trong thanh ghi UCSRB (thông qua thanh ghi R16)
                        ldi r16, (1<<USBS)|(3<<UCSZ0)
                        Nó setbit USBS và UCSZ0, UCSZ1 trong thanh ghi UCSRC (thông qua thanh ghi R16)
                        !e

                        Comment


                        • #42
                          Óa, tóm lại là lập trình ASSembly cho AVR không có các lệnh set bit trực tiếp các thanh ghi thuộc nhóm I/O phải không ạ?
                          Bác có thể giải thích kĩ hơn nữa phần em đã hỏi ở trang trước không ạ?
                          Tiện thể em hỏi bác luôn : Có gì khác biệt giữa các nhóm thanh ghi:
                          Nhóm 1 gồm R0,R1; nhóm 2 gồm R1->R15; nhóm 3 gồm R16->R31; nhóm 4 gồm R28->R31. Cảm ơn bác trước nhé!

                          Comment


                          • #43
                            Nguyên văn bởi mrcuongcon Xem bài viết
                            Ơ, lập trình bằng assembly... Thôi cũng được bởi dù sao bác Phi cũng bỏ luồng này rồi, mình tự nghiên cứu vậy
                            Bác lập dùng trình dịch C nào thế?

                            Bác có thể làm cho một led chạy lần lượt từ trái qua phải rồi từ phải qua trái ( không phải là sáng dần và tắt dần)??
                            Bác cho em hỏi ý nghĩa của lệnh này như thế nào:
                            Lưu ý là SPE và MSTR, SPR0 là các bit của một thanh ghi thuộc thanh ghi SPCR của AVR và bit SPIF thuộc thanh ghi SPSR.
                            Trong Assembly:
                            ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
                            out SPCR, R17
                            và Trong C:
                            while(!(SPSR & (1<<SPIF)) ôi, cái lệnh while ấy thật là khó hiểu.

                            SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
                            Mình xin đc trả lời như sau:
                            SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); //cho SPE=1; MSTR=1; SPR0=1;
                            while(!(SPSR & (1<<SPIF)); //chờ cờ ngắt SPI (SPIF) bằng 1 (while(!SPIF)

                            Tùy theo ic AVR nào mà thanh ghi có thể nằm trong vùng định địa chỉ từng bit hay không (vùng từ 00h đến 19h). Nếu có thì ta mới có thể đặt xóa hay đọc từng bit (như ghi chú ở trên). Còn không thì ta phải tác động theo byte hoặc qua thanh ghi trung gian.
                            !e

                            Comment


                            • #44
                              Nguyên văn bởi mrcuongcon Xem bài viết
                              Óa, tóm lại là lập trình ASSembly cho AVR không có các lệnh set bit trực tiếp các thanh ghi thuộc nhóm I/O phải không ạ?
                              Bác có thể giải thích kĩ hơn nữa phần em đã hỏi ở trang trước không ạ?
                              Tiện thể em hỏi bác luôn : Có gì khác biệt giữa các nhóm thanh ghi:
                              Nhóm 1 gồm R0,R1; nhóm 2 gồm R1->R15; nhóm 3 gồm R16->R31; nhóm 4 gồm R28->R31. Cảm ơn bác trước nhé!
                              Mình thấy chúng cũng không có gì khác biệt lắm. Datasheet nói rằng nhóm 4 (R28->R31) là 3 cặp datapointer 16 bit (kí hiệu là X, Y, Z) (giống như DPTR của 8051). Chúng dc dùng để trỏ tới các vùng nhớ khác nhau (IRAM, XRAM, EEPROM, FLASH), chúng đc dùng rất linh hoạt.
                              Cả 32 thanh ghi R đều giống nhau khi xử lí byte/bit và chúng cũng đa năng như thanh ghi A của 8051 vậy. Tùy theo trình biên dịch chúng có thể đc chia ra các nhóm khác nhau. Ví dụ như CVAR: R24, R25 hay dùng cho các hàm delay, R2 đến R14 hay dùng cho cờ bít, R28->R31 là con trỏ (mảng, chuỗi), R15 dùng cho biến trong hàm (local),...
                              !e

                              Comment


                              • #45
                                Em thấy thế này:
                                LDI R2,0xff -> error
                                LDI R16,0xff -> ok
                                Vậy là sao hả bác?

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X