Thông báo

Collapse
No announcement yet.

ATmega8 không delay được như mô phỏng???

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

  • ATmega8 không delay được như mô phỏng???

    Em mới học AVR, khởi đầu bằng em ATmega8, nhưng hiện đang gặp rắc rối khi dùng delay. Em viết code tạo xung trễ với 1 xung cho trước (100Hz) bằng AVRstudio, build, mô phỏng với proteus thì OK. Nhưng nạp vào ATmega8 thật (dùng STK500) thì không chạy như mô phỏng.
    Đây là code của em:
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/delay.h>
    int main(void)
    {
    DDRC|=(1<<1)|(1<<3); //hai chan nay de tao xung
    MCUCR|=(1<<ISC01); //bao ngat canh xuong chan INT0 (xung vao dat len chan nay)
    GICR|=(1<<INT0); //cho phép ngat INT0
    sei(); //65620 cho phep ngat VDK
    while(1){}
    return 0;}
    ISR(INT0_vect)
    { PORTC=0;
    _delay_us(4000); //tao tre 4000us
    PORTC|=(1<<1)|(1<<3);
    _delay_us(400);
    PORTC=0;
    _delay_us(400);
    PORTC|=(1<<1)|(1<<3);
    _delay_us(400);
    PORTC=0; //tao chum 2 xung 400us
    }
    Kết quả mô phỏng proteus:
    Click image for larger version

Name:	MO PHONG.png
Views:	2
Size:	478.1 KB
ID:	1421753
    Thực tế kiểm tra = oscilloscope không như mong muốn, xung tạo ra không trễ tí nào so với xung vào:
    Click image for larger version

Name:	THUC TE.png
Views:	2
Size:	859.5 KB
ID:	1421755
    Em không hiểu tại sao cái tạo trễ 4000us "_delay_us(4000);" không làm việc trong khi các "_delay_us(400);" sau đó vẫn bình thường. Kính mong các cao nhân quan tâm giúp đỡ, em đang rất cần, xin đội ơn!!!
    Attached Files
    Last edited by tuecamphu1; 06-07-2014, 03:46.

  • #2
    Kiểm tra thạch anh, dao động có chuẩn không, trình dịch delay có chính xác không . Muốn đồng bộ thì :
    Nhận ngắt ngoài
    disable ngắt
    Delay
    Enable nhận tiếp
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      mở makefile kiểm tra dòng F_CPU=1000000 chưa
      nhóm điện tử facebook

      Comment


      • #4
        Cái fuse bit có ảnh hưởng ko bác nhỉ? Khéo lại chọn dao dộng nội nên kết quả ko như mong muốn!

        Comment


        • #5
          Nguyên văn bởi kkkk Xem bài viết
          Cái fuse bit có ảnh hưởng ko bác nhỉ? Khéo lại chọn dao dộng nội nên kết quả ko như mong muốn!
          Đương nhiên Fuse sai ( nhất là ở cái chọn dao động, bộ chia ) thì kết quả sẽ sai
          Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

          Comment


          • #6
            Mong các bác nói rõ hơn, cái dòng trên cùng (#define F_CPU 1000000UL) bỏ nó đi, em chưa có động đến fusebit, mua về thế nào để nguyên như vậy, kiểm tra lại thì nó là dao dộng nội 1MHz:
            Click image for larger version

Name:	FUSE bit.png
Views:	1
Size:	319.3 KB
ID:	1396798
            Nói như bác kkkk:
            Cái fuse bit có ảnh hưởng ko bác nhỉ? Khéo lại chọn dao dộng nội nên kết quả ko như mong muốn!
            thì em không dùng được dao động nội sao? tài liệu nào nói thế?
            Muốn đạt được mục đích trên (tạo xung trễ so với 1 xung vào cho trước, độ trễ có thể điều khiển được) xin các bác gợi ý một số code để em nghiên cứu.
            em hơi gà, mong các pro thông cảm!
            Last edited by tuecamphu1; 10-07-2014, 08:45.

            Comment


            • #7
              Nguyên văn bởi tuecamphu1 Xem bài viết
              Mong các bác nói rõ hơn, cái dòng trên cùng (#define F_CPU 1000000UL) bỏ nó đi, em chưa có động đến fusebit, mua về thế nào để nguyên như vậy, kiểm tra lại thì nó là dao dộng nội 1MHz:
              [ATTACH=CONFIG]88572[/ATTACH]
              Nói như bác kkkk:

              thì em không dùng được dao động nội sao? tài liệu nào nói thế?
              Muốn đạt được mục đích trên (tạo xung trễ so với 1 xung vào cho trước, độ trễ có thể điều khiển được) xin các bác gợi ý một số code để em nghiên cứu.
              em hơi gà, mong các pro thông cảm!

              - Nội với ngoại thì cũng cần phải khai báo tần số của thạch anh ( hay tần số giao động nội ) ... để trình dịch nó lấy số Dao động đó nó tính cái Delay cho nó chuẩn.

              - Sau đó dùng thạch anh bên ngoài thì fuse bit là thạch anh bên ngoài, dùng thạch anh bên ngoài tần số cao ( từ 8 Mhz ) thì phải khai báo là tần số cao ( đánh dấu vào CKOPT), dùng thấp thì khai báo thấp trong mục SUT_CKEL.
              Dùng dao động nội thì phải fuse bit là sử dụng dao động nội ( Lưu ý dao động nội tối đa atmega8 nó chỉ có 8Mhz thôi - 8 Mhz cũng là rất nhanh rồi) Khai báo lên tận 10 Mhz ... nó lấy đâu mà bù vào ===> chạy bằng niềm tin.

              Nạp bằng AVR Studio thì quá dễ trong việc fuse bit chọn dao động rồi ... Kéo cái ô lựa SUT_CKEL cho nó xổ xuống bên trong có 1 đống lựa chọn là dùng Thạch anh bên ngoài hay dao động nội bên trong ( với các tần số ). Chọn xong thì ấn Program để nó nạp vào chip thế là FUSE xong.
              Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

              Comment


              • #8
                - Nội với ngoại thì cũng cần phải khai báo tần số của thạch anh ( hay tần số giao động nội ) ... để trình dịch nó lấy số Dao động đó nó tính cái Delay cho nó chuẩn.

                - Sau đó dùng thạch anh bên ngoài thì fuse bit là thạch anh bên ngoài, dùng thạch anh bên ngoài tần số cao ( từ 8 Mhz ) thì phải khai báo là tần số cao ( đánh dấu vào CKOPT), dùng thấp thì khai báo thấp trong mục SUT_CKEL.
                Dùng dao động nội thì phải fuse bit là sử dụng dao động nội ( Lưu ý dao động nội tối đa atmega8 nó chỉ có 8Mhz thôi - 8 Mhz cũng là rất nhanh rồi) Khai báo lên tận 10 Mhz ... nó lấy đâu mà bù vào ===> chạy bằng niềm tin.

                Nạp bằng AVR Studio thì quá dễ trong việc fuse bit chọn dao động rồi ... Kéo cái ô lựa SUT_CKEL cho nó xổ xuống bên trong có 1 đống lựa chọn là dùng Thạch anh bên ngoài hay dao động nội bên trong ( với các tần số ). Chọn xong thì ấn Program để nó nạp vào chip thế là FUSE xong.
                Cái này bác quá đúng! em Mega8 trên được chọn dao động nội RC 1MHz, vấn đề là cái "_delay_us(4000)" sẽ được trình dịch tính là trễ 4000us = 4ms = 0,004s không làm việc trong khi mấy cái "_delay_us(400);" sau đó vẫn bình thường (chùm xung đã được tạo ra) mới bực.
                Hơn nữa, cứ cho là"_delay_us(4000)" vô dụng thì cái ngắt ngoài cũng không đúng theo yêu cầu, em đặt ngắt cạnh xuống của chân INT0 nhưng trên osilloscope cái chùm xung xuất hiện ngay khi có cạnh lên (cái này phóng to osillo nhìn rõ). Nghi hàng fake, em nạp vô 3,4 em Mega8 rồi vẫn vậy, bực không tả nổi. Mong các pro tiếp tục cho ý kiến!!!
                Last edited by tuecamphu1; 10-07-2014, 14:34.

                Comment


                • #9
                  Nguyên văn bởi tuecamphu1 Xem bài viết
                  Cái này bác quá đúng! em Mega8 trên được chọn dao động nội RC 1MHz, vấn đề là cái "_delay_us(4000)" sẽ được trình dịch tính là trễ 4000us = 4ms = 0,004s không làm việc trong khi mấy cái "_delay_us(400);" sau đó vẫn bình thường (chùm xung đã được tạo ra) mới bực.
                  Hơn nữa, cứ cho là"_delay_us(4000)" vô dụng thì cái ngắt ngoài cũng không đúng theo yêu cầu, em đặt ngắt cạnh xuống của chân INT0 nhưng trên osilloscope cái chùm xung xuất hiện ngay khi có cạnh lên (cái này phóng to osillo nhìn rõ). Nghi hàng fake, em nạp vô 3,4 em Mega8 rồi vẫn vậy, bực không tả nổi. Mong các pro tiếp tục cho ý kiến!!!
                  Là do cậu trình kém, làm fuse sai, clock CPU sai thì ... sai tất ( Tất cả hoạt động của con chip cũng nhờ vào cái xung clock nó mới hoạt động được , nó mới dịch bit vào các địa chỉ thanh ghi được , con trỏ mới nhảy chỗ này sang chỗ kia được, ngắt trong hay ngắt ngoài thì cũng vẫn phải qua kiểm duyệt của Clock. Clock có chạy đúng thì thằng CPU mới biết đường mà kiểm tra đã có ngắt hay chưa), nguyên nhân của chip treo, chạy loạn khi ứng dụng thực tế vào môi trường nhiễu, khắc nghiệt cũng là do bộ clock mất ổn định, nhiễu clock, chồng chéo làm CPU xử lý sai ... gây treo .... Tóm lại là Clock rất quan trọng chứ không phải phếch phác gì đâu ... có mấy cái tính năng đơn giản mà đã không chạy ( thì fake nó bán cho hổ, trình dịch mà kém thì chẳng ai buồn dùng như thế mấy mà sập tiệm ), fake của nó cũng đến 99% là vẫn chạy đầy đủ tính năng và có phải là fake hay không thì còn phải dựa vào yếu tố kiểm tra, tra cứu, kiểm định ( lô, mã, chất lượng .v..v ) chứ không chạy đổi cho hàng fake thì có khi oan cho nó ( cần phải kiểm tra lại chính mình trước đã ).

                  --- Có oscilloscope rồi thì cách kiểm tra quá dễ còn gì ... thử on/off 1 chân, set fuse chuẩn xem nó có delay đúng không đã ... fuse Clock chưa set được thì viết chương trình nó sẽ vẫn cứ sai thôi !
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    Là do cậu trình kém, làm fuse sai, clock CPU sai thì ... sai tất ( Tất cả hoạt động của con chip cũng nhờ vào cái xung clock nó mới hoạt động được , nó mới dịch bit vào các địa chỉ thanh ghi được , con trỏ mới nhảy chỗ này sang chỗ kia được, ngắt trong hay ngắt ngoài thì cũng vẫn phải qua kiểm duyệt của Clock. Clock có chạy đúng thì thằng CPU mới biết đường mà kiểm tra đã có ngắt hay chưa), nguyên nhân của chip treo, chạy loạn khi ứng dụng thực tế vào môi trường nhiễu, khắc nghiệt cũng là do bộ clock mất ổn định, nhiễu clock, chồng chéo làm CPU xử lý sai ... gây treo .... Tóm lại là Clock rất quan trọng chứ không phải phếch phác gì đâu ... có mấy cái tính năng đơn giản mà đã không chạy ( thì fake nó bán cho hổ, trình dịch mà kém thì chẳng ai buồn dùng như thế mấy mà sập tiệm ), fake của nó cũng đến 99% là vẫn chạy đầy đủ tính năng và có phải là fake hay không thì còn phải dựa vào yếu tố kiểm tra, tra cứu, kiểm định ( lô, mã, chất lượng .v..v ) chứ không chạy đổi cho hàng fake thì có khi oan cho nó ( cần phải kiểm tra lại chính mình trước đã ).

                    --- Có oscilloscope rồi thì cách kiểm tra quá dễ còn gì ... thử on/off 1 chân, set fuse chuẩn xem nó có delay đúng không đã ... fuse Clock chưa set được thì viết chương trình nó sẽ vẫn cứ sai thôi !
                    Cảm ơn các bác đã cho ý kiến! Nghi fake đúng là oan, nhưng sai fuse cũng chẳng phải. Cuối cùng là tại thằng oscilloscope (hoặc tại chưa đặt đúng mode osc- hiện em đang ngâm cứu). Hôm qua mượn một em osc khác về kiểm tra thấy y như mô phỏng, quả là mất thời gian thật! Bác nào rơi vào trường hợp như em thì thì lưu ý!!!

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X