Thông báo

Collapse
No announcement yet.

Bộ nhớ chương trình, bộ nhớ dữ liệu, ngăn xếp, cơ chế ngắt và SFR của 8051

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

  • #16
    bộ nhớ nội 8951

    các bạn giúp mình với : có sự khác nhau như thế nào giửa bộ nhớ chương trình và bộ nhớ dữ liệu vậy. trong tài liệu nói 8951 có 4kb bộ nhớ nội nhưng lại có 128b Ram nội (tại ô nhớ cao nhất là 7Fh) vậy khi ta viết chương trình làm sao ta đo được nó có dung lượng là bao nhiêu để nạp vào 4kb của 8951, mặc khác khi viết chương trình, nếu như ta đã dùng hết tất cãc các ô nhớ từ 00H đến 7FH mà vẫn chưa đủ giờ phải làm sao? các bạn hiểu ý mình mà phải ko, mình còn mơ hồ lắm, dân nghiệp dư mà. mong các bạn chỉ giáo cám ơn nhiều.

    Comment


    • #17
      Phần mềm biên dịch sẽ báo cho bạn biết dung lượng chương trình bạn viết là bao nhiêu byte khi chương trình của bạn được viết đúng. Nó tạo ra một file .hex đồng thời thông báo dung lượng.
      Bộ nhớ chương trình dành để lưu mã chương trình, các hằng số không thay đổi trong suốt thời gian tồn tại của chương trình
      Bộ nhớ dữ liệu dùng để chứa các biến, giá trị của nó có thể thay đổi
      8051 sử dụng kiến trúc VonNeuman, nghĩa là có bộ nhớ dữ liệu và bộ nhớ chương trình phân biệt. Kiến trúc này cho phép quá trình đọc lệnh và dữ liệu nhanh hơn so với kiến trúc Harverd.
      Nếu chương trình của bạn cần dùng nhiều RAM hơn, bạn phải nghĩ tới việc mở rộng bộ nhớ RAM ngoài.

      Comment


      • #18
        Nhờ qanhep giúp mình câu này với
        Mình có lập trình cho 8052 hết hơn 200 byte IRAM. Khi biên dịch bằng Keil c thì nó không chịu, như vậy là sao nhỉ? Keil C gây lỗi hay là cấu trúc 8052 chỉ cho phép dùng 128 byte làm biến, các byte cao chỉ dùng làm ngăn xếp?
        !e

        Comment


        • #19
          Chào zemen!
          Bạn nên đưa một đoạn chương trình nhỏ có đoạn lỗi đó để mọi người cùng xem.
          8052 có 256 byte RAM. Theo mình đọc, thằng Keil C dành các byte thấp để lưu biến, hết vùng dành cho biến này nó mới lưu ngăn xếp. Như vậy với chương trình sử dụng khoảng 200byte, thì mấy chục byte còn lại làm ngăn xếp vẫn ok vì ngăn xếp định địa chỉ gián tiếp.

          Comment


          • #20
            Nguyên văn bởi qanhep Xem bài viết
            Chào zemen!
            Bạn nên đưa một đoạn chương trình nhỏ có đoạn lỗi đó để mọi người cùng xem.
            8052 có 256 byte RAM. Theo mình đọc, thằng Keil C dành các byte thấp để lưu biến, hết vùng dành cho biến này nó mới lưu ngăn xếp. Như vậy với chương trình sử dụng khoảng 200byte, thì mấy chục byte còn lại làm ngăn xếp vẫn ok vì ngăn xếp định địa chỉ gián tiếp.
            Á a, tớ hiểu rồi, khai báo như vầy: unsigned char mang[200]; keil C không chịu vì 8952 chỉ có 128 byte thấp có thể định địa chỉ trực tiếp. Tớ phải chia ra làm 2 phần:
            unsigned char mang1[128];
            unsigned char idata mang2[72];
            trong đó mang2 được lưu trong vùng idata, tức là vùng 128 byte cao.
            Xử lí 2 mảng liền cũng bất tiện thật, nhưng đành chịu vậy chứ sao. Không biết với những IC có EEPROM như AT89S8252,53 (2k) thì có thể dùng EEPROM thay IRAM trong trường hợp như trên dc không nữa.
            !e

            Comment


            • #21
              Em có 1 câu hỏi về rom. Em dang làm đề tài có liên quan đến rom ngoài của 8051 trong đó có phần load ảnh đen trắng từ máy tính vào rom. Vậy cách load ntn mong các bác chỉ giáo cụ thể đc ko, vì em mới học vđk nên vẫn còn hơi bỡ ngỡ.:d

              Comment


              • #22
                Nguyên văn bởi chimgokien Xem bài viết
                Em có 1 câu hỏi về rom. Em dang làm đề tài có liên quan đến rom ngoài của 8051 trong đó có phần load ảnh đen trắng từ máy tính vào rom. Vậy cách load ntn mong các bác chỉ giáo cụ thể đc ko, vì em mới học vđk nên vẫn còn hơi bỡ ngỡ.:d
                Chỉ có một cách là bạn đổi ra file nhị phân hoặc file hex rồi nạp vào rom thôi.
                AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                Xem thêm tại Online Store ---> Click here
                Mob: 0982.083.106

                Comment


                • #23
                  8051 dành một vùng 128 byte từ địa chỉ 80H-0FFH cho các thanh ghi chức năng đặc biệt SFRs. Tuy nhiên, thực tế chỉ một số trong số vùng địa chỉ này được sử dụng. Một điều lưu ý là những địa chỉ còn lại không được phép ghi đọc lên nó. Những địa chỉ này có thể được sử dụng trong một số vi điều khiển sau này.
                  tại sao trong vùng 128 byte của các thanh ghi đặc biệt SFR lại có các thanh ghi không được ghi đọc lên đó

                  Comment


                  • #24
                    8051 dành một vùng 128 byte từ địa chỉ 80H-0FFH cho các thanh ghi chức năng đặc biệt SFRs. Tuy nhiên, thực tế chỉ một số trong số vùng địa chỉ này được sử dụng. Một điều lưu ý là những địa chỉ còn lại không được phép ghi đọc lên nó. Những địa chỉ này có thể được sử dụng trong một số vi điều khiển sau này.
                    tại sao trong vùng 128 byte của các thanh ghi đặc biệt SFR lại có các thanh ghi không được ghi đọc lên đó?

                    Comment


                    • #25
                      Có bác nào có chương trình chuyển ảnh bitmap sang file hex khong.

                      Comment


                      • #26
                        Xin mọi người chỉ giúp: Tôi không biết nhiều về asm nên khi tôi gặp doan CT sau:
                        ORG 0000H
                        LJMP MAIN
                        ORG 000BH
                        LJMP T0ISR
                        ORG 001BH
                        LJMP T1ISR
                        ORG 0030H
                        MAIN: MOV TMOD,#12H
                        MOV TH0,#-71
                        SETB TR0
                        SETB TF1
                        MOV IE,#8AH
                        SJMP $
                        T0ISR: CPL P1.7
                        RETI
                        T1ISR: CLR TR1
                        MOV TH1,#HIGH(-1000)
                        MOV TL1,#LOW(-1000)
                        SETB TR1
                        CPL P1.6
                        RETI
                        END

                        Viết về sử dụng 2 ngắt đồng thời: timer0 và timer1. Tôi chuyển về C như sau:

                        #include <8051.H>
                        #include <stdio.h>


                        void timer0_isr (void) interrupt 1 using 1 {
                        asm" CPL P1.7";
                        }

                        void timer1_isr (void) interrupt 3 using 2 {
                        TR1 =0;
                        TH1 = 0xF8; // reload timer 1 with 0D8F0H. Time=10 mS
                        TL1 = 0xF0;
                        TR1 = 1;
                        asm" CPL P1.6";
                        }

                        void main()
                        {
                        TMOD = 0x12; // timer 0 : 8 bit , timer 1 : 16 bit
                        TH0 = 0xF6; // reload timer 0 with F6H. Time=10 uS.
                        TR0 = 1; // run timer 0
                        IE = 0x8A; // set bit EA => Timer0+Timer1 enable
                        TF1 = 1;

                        }

                        Khi tôi chuyển sang file HEX và nạp vào phần mềm TS control Emulator 8051 thì thấy 2 chương trình trên chạy khác nhau:
                        -CT asm chạy nhanh(ít mã máy phụ rồi vào ngay CT chính) và đúng ý đồ 2 ngắt đều hoạt động.
                        -CT bằng C cũng chạy nhưng khác ở chỗ: ngắt timer1 chỉ hoạt động lần đầu tiên sau đó nó chạy nhưng không tự nạp lại giá trị TH1, TL1. Nó đạt FFFF rồi về từ 0000(Lẽ ra là giá trị TH1, TL1). Cờ TF1 có báo(=1) nhưng tại sao nó không ngắt ?
                        Nhờ các bạn chỉ chỗ nào cần sửa. Cám ơn.

                        Comment


                        • #27
                          Xin nói thêm: Về lưu đồ 2 chương trình là giống nhau, nhưng số liệu có khác nhau (tần số khác...nên số liệu nạp khác). Xin thông cảm.

                          Comment


                          • #28
                            chương trình của bạn ko chạy là đúng rùi .
                            Mỗi lần vào chương trình ngắt cho Timer 1 "TR1=O" //Tức bạn ko cho timer 1 chạy còn gì .
                            TF1 của bạn được set lến 1 là trong câu lệnh hàm main:
                            "SETB TF1" //trong code asem

                            Và:
                            "void main()
                            {
                            TMOD = 0x12; // timer 0 : 8 bit , timer 1 : 16 bit
                            TH0 = 0xF6; // reload timer 0 with F6H. Time=10 uS.
                            TR0 = 1; // run timer 0
                            IE = 0x8A; // set bit EA => Timer0+Timer1 enable
                            TF1 = 1; //cái này set bit TF1 chứ ko cần chạy ngắt Timer 1
                            }
                            mà hàm ngắt Timer1 của bạn cũng ko chạy được:
                            "
                            void timer1_isr (void) interrupt 3 using 2 {
                            TR1 =0; //Thế này thì ngắt Timer 1 bị tắt rùi làm sao chạy?
                            TH1 = 0xF8; // reload timer 1 with 0D8F0H. Time=10 mS
                            TL1 = 0xF0;
                            TR1 = 1;
                            asm" CPL P1.6";
                            }

                            chương trình của bạn có thể viết như sau:

                            #include <8051.H>
                            #include <stdio.h>
                            void timer0_isr (void) interrupt 1 using 1
                            {
                            P1_7=~P1_7;
                            }

                            void timer1_isr (void) interrupt 3 using 2 {
                            P1_6=~P1_6;
                            }

                            void main()
                            {
                            IE = 0x8A; // set bit EA => Timer0+Timer1 enable
                            TMOD = 0x12; // timer 0 : 8 bit , timer 1 : 16 bit
                            TH0 = 0xF6; // reload timer 0 with F6H. Time=10 uS.
                            TR0 = 1; // run timer 0

                            //INIT FOR TIMER 1
                            TH1 = 0xF8;
                            TL1 = 0xF0;
                            TR1 = 1; //RUN TIMER 1

                            }
                            Last edited by TDH-BN; 16-04-2007, 11:37.
                            Học thầy không tày học bạn ...

                            Comment


                            • #29
                              Chào bạn TDH-BN và các bạn,
                              Tôi vừa thử CT bạn sửa giúp. Tôi dùng SDCC để dịch và chuyển sang HEX file. Nó không chịu lệnh P1_6=~P1_6...Tôi thay bằng lệnh ; để thử CT đã. Cái này giải quyết sau chắc do khai báo chưa đủ...
                              Sau đó tôi dùng TS 8051 để chạy mô phỏng. Kết quả chưa vui: Nó chỉ nạp TH1, TL1 lần đầu thôi. Sau đó vẫn lại từ 0x0000, có nghĩa ngắt timer1 chưa hoạt động. Viết bằng ASM hay thật, C có dễ hơn chút ít nhưng cũng khó cho người tự học như tôi...
                              Các Bạn xem lại giúp tôi nhé. Rất cảm ơn.

                              Comment


                              • #30
                                Cám ơn các anh đã cho em biết thêm nhiều kiến thức
                                nhờ đó mà giúp ít cho tụi em được nâng cao kiến thức
                                em mong các anh hãy viết thêm nhiều bài viết hay nữa nhá

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X