Thông báo

Collapse
No announcement yet.

giúp đỡ nút ấn stop trong bài lập trình dùng atmega 16

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

  • giúp đỡ nút ấn stop trong bài lập trình dùng atmega 16

    chào mọi người.chả là em đang làm đồ án dùng atmega 16 điều khiển tay máy công nghiệp.chuơng trình thì em đã viết được rồi nhưng còn nút stop thì em chưa làm được.em cũng chỉ mới tìm hiểu qua về avr và theo em thấy thì nên dùng ngắt cho nút stop.em lần trên mạng rất nhiều nhưng vẫn chưa biết khai báo ra sao.và thêm 1 vấn đề nữa là nút stop lại kết nối với cổng B.7 .mà em tìm datasheet thì ngắt ngoài ở PORTD.nhưng PORTD em lấy làm đầu ra rồi.mong mọi người giúp đỡ nút stop này giúp em với .và thiết lập ngắt trên codevision như thế nào ạ.em vẫn chưa biết thiết lập ngắt.

    đây là code của em.



    #include <mega16.h>

    // Alphanumeric LCD Module functions
    #include <alcd.h>
    #include <delay.h>

    #define MODE PINB.5
    #define START PINB.6
    #define STOP PINB.7
    //=======CAM BIEN ======
    #define cbsp PINA.0
    #define vitri PINA.1
    #define vatden PINA.2
    #define kimloai PINA.3
    #define kho1 PINA.4
    #define kho2 PINA.5
    #define kho3 PINA.6
    #define HVGap PINA.7
    #define HVNha PINB.0
    //======DAU RA=====
    #define daysp PORTD.0
    #define luisp PORTD.1
    #define DC_tien PORTD.2
    #define DC_lui PORTD.3
    #define nang_ha PORTD.4
    #define gap_nha PORTD.5
    #define quayphai PORTD.6
    #define quaytrai PORTD.7

    // Declare your global variables here
    unsigned char i=0,j=0,x=0,y=0,z=0;
    void chayct(void);
    void gap(void);
    void main(void)
    {

    PORTA=0xC0;
    DDRA=0x00;

    PORTB=0xE1;
    DDRB=0x00;


    PORTC=0x00;
    DDRC=0x10;

    PORTD=0x00;
    DDRD=0xFF;


    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;


    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;


    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;


    MCUCR=0x00;
    MCUCSR=0x00;


    TIMSK=0x00;


    UCSRB=0x00;


    ACSR=0x80;
    SFIOR=0x00;


    ADCSRA=0x00;


    SPCR=0x00;

    TWCR=0x00;



    lcd_init(16);
    lcd_gotoxy(0,0);
    lcd_putsf("06dt2");
    lcd_gotoxy(0,1);
    lcd_putsf("TAY MAY SO 3");

    while (1)
    {
    while(!MODE)i=1;
    if(i==1)
    {

    lcd_gotoxy(0,0);
    lcd_putsf("an mode");
    delay_ms(100);
    luisp=1;
    lcd_gotoxy(0,0);
    lcd_putsf("lui sp");
    delay_ms(200);
    luisp=0;
    delay_ms(200);
    while(i==1)
    {

    quayphai=1;
    lcd_gotoxy(0,0);
    lcd_putsf("quay phai");
    while(kho1==1)
    {
    quayphai=0;
    lcd_gotoxy(0,0);
    lcd_putsf("dung quay");
    delay_ms(200);
    DC_lui=1;
    lcd_gotoxy(0,0);
    lcd_putsf("DC lui");
    while(HVGap==0)
    {
    DC_lui=0;
    lcd_gotoxy(0,0);
    lcd_putsf("dung lai");
    goto thoat;
    }
    }

    }

    thoat: i=2;
    delay_ms(200);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("bo sp vao");
    lcd_gotoxy(0,1);
    lcd_putsf("roi an start");
    }
    ////////////
    while(!START)j=1;
    if(j==1&i==2)
    {
    chayct();
    }
    if(!STOP)
    {
    daysp=0;luisp=0;DC_tien=0;DC_lui=0;
    gap_nha=0;nang_ha=0;quayphai=0;quaytrai=0;
    }

    }

    }
    void chayct()
    {
    lcd_clear();
    lcd_gotoxy(0,1);
    lcd_putsf("da an start");
    delay_ms(200);
    luisp=0;
    daysp=1;

    while(j==1)
    {

    if(cbsp==1&vitri==0)
    {
    delay_ms(200);
    luisp=0;
    daysp=1;
    delay_ms(200);
    daysp=0;
    y=0;z=0;
    }
    ////////////////////////////////////////
    if(vitri==1&vatden==0&kimloai==0)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("SP LOAI BO");
    lcd_gotoxy(0,1);
    lcd_putsf("BO VAO KHO 1");
    delay_ms(300);
    gap();
    x=1;
    }
    if(HVNha==0&x==1)
    {
    DC_tien=0;
    lcd_gotoxy(0,0);
    lcd_putsf("dung lai");
    delay_ms(300);
    gap_nha=0;
    lcd_gotoxy(0,0);
    lcd_putsf("nha sp");
    delay_ms(200);
    DC_lui=1;
    y=1;
    lcd_gotoxy(0,0);
    lcd_putsf("lui ve");
    }
    //////////////////////////////////////
    if(vatden==1&vitri==1)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("VAT DEN");
    lcd_gotoxy(0,1);
    lcd_putsf("BO VAO KHO 2");
    delay_ms(300);
    gap();
    x=2;
    }
    if(kho2==1&x==2)
    {
    quaytrai=0;
    delay_ms(300);
    gap_nha=0;
    delay_ms(300);
    quayphai=1;
    x=0;
    z=1;
    }
    //////////////////////////////////////
    if(kimloai==1&vitri==1)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("KIM LOAI");
    lcd_gotoxy(0,1);
    lcd_putsf("BO VAO KHO 3");
    delay_ms(300);
    gap();
    x=3;
    }
    if(kho3==0&x==3)
    {
    quaytrai=0;
    delay_ms(300);
    gap_nha=0;
    delay_ms(300);
    quayphai=1;
    x=0;
    z=1;
    }
    //////////////////////////////////
    if(HVNha==0&x>1)
    {
    DC_tien=0;
    lcd_gotoxy(0,0);
    lcd_putsf("dung lai");
    delay_ms(300);
    quaytrai=1;
    }
    //////////////////////////////////
    if(DC_tien==1)
    {
    DC_lui=0;
    }
    //////////////////////////////////////
    if(HVGap==0&y==1)
    {
    DC_lui=0;
    y=0;
    delay_ms(300);
    lcd_clear();
    delay_ms(200);
    lcd_gotoxy(0,1);
    lcd_putsf("moi bo sp");
    }

    if(kho1==1&z==1)
    {
    quayphai=0;
    lcd_gotoxy(0,0);
    lcd_putsf("dung quay");
    delay_ms(200);
    DC_lui=1;
    z=0;
    y=1;
    lcd_gotoxy(0,0);
    lcd_putsf("DC lui");
    }

    }

    }

    void gap(void)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("THUC HIEN GAP");
    delay_ms(400);
    nang_ha=1;
    lcd_gotoxy(0,0);
    lcd_putsf("ha tay gap");
    delay_ms(400);
    gap_nha=1;
    lcd_gotoxy(0,0);
    lcd_putsf("gap sp");
    delay_ms(400);
    luisp=1;
    delay_ms(400);
    nang_ha=0;
    lcd_gotoxy(0,0);
    lcd_putsf("nang sp");
    delay_ms(400);
    DC_tien=1;
    }




    Download avr.rar - Mup5.Com - Mobile Upload File - Free Upload File For Mobile đây là file mô phỏng của em.mong mọi người giúp đỡ

  • #2
    Bạn cũng có thể dùng ngắt timer để kiểm tra trạng thái của nút bấm.
    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
      Nguyên văn bởi queduong Xem bài viết
      Bạn cũng có thể dùng ngắt timer để kiểm tra trạng thái của nút bấm.
      oh.em cũng đang nghĩ tới trường hợp này nhưng chưa biết phải làm thế nào.nếu thế khi ấn stop mình để time thật ngắn.khi hết time thì sẽ gọi ngắt ra đúng không ạ

      Comment


      • #4
        Nguyên văn bởi binhkhe92 Xem bài viết
        oh.em cũng đang nghĩ tới trường hợp này nhưng chưa biết phải làm thế nào.nếu thế khi ấn stop mình để time thật ngắn.khi hết time thì sẽ gọi ngắt ra đúng không ạ
        Bạn tạo timer , cho chạy ngắt timer như bình thường . ( ví dụ tạo timer0 10ms , ngắt timer0 ( cứ 10ms nó ngắt 1 lần ) ... trong ngắt timer thì kiểm tra if ( bấm nút stop ) thì ... disable ngắt ... làm chương trình Stop 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


        • #5
          em hiểu rôi nhưng anh có thể hướng dẫn em cách thiết lập ngắt time0 trong codevision được không ạ.em không biết thiết lập thế nào cho chuẩn nữa.clock em dùng 8mhz.anh có thể nói rõ hơn cũng như giúp em code tham khảo đc ko ạ.cám ơn anh

          Comment


          • #6
            Nguyên văn bởi queduong Xem bài viết
            Bạn tạo timer , cho chạy ngắt timer như bình thường . ( ví dụ tạo timer0 10ms , ngắt timer0 ( cứ 10ms nó ngắt 1 lần ) ... trong ngắt timer thì kiểm tra if ( bấm nút stop ) thì ... disable ngắt ... làm chương trình Stop thôi
            em hiểu rôi nhưng anh có thể hướng dẫn em cách thiết lập ngắt time0 trong codevision được không ạ.em không biết thiết lập thế nào cho chuẩn nữa.clock em dùng 8mhz.anh có thể nói rõ hơn cũng như giúp em code tham khảo đc ko ạ.cám ơn anh

            Comment


            • #7
              interrupt [TIM0_OVF] void timer0_ovf_isr(void)
              {
              // Place your code here

              if (STOP==0)
              {
              // thiết lập đầu ra =0 ở đây
              };

              }


              thế này đúng ko ạ

              Comment


              • #8
                Mình nghĩ đáp ứng với dạng nút bấm có thể check dạng polling tức là check ở đầu vòng while. Nút bấm La dạng đáp ứng chậm (còn phải debounce). Nên avr hoàn toàn đủ nhanh để check đc. Và trong các ứng dụng thực tế người ta cũng ko bao giờ dùng ngắt với nút bấm.
                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


                • #9
                  Nguyên văn bởi binhkhe92 Xem bài viết
                  interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                  {
                  // Place your code here

                  if (STOP==0)
                  {
                  // thiết lập đầu ra =0 ở đây
                  };

                  }


                  thế này đúng ko ạ
                  người ta ít khi dùng ngắt onchange ( ngắt i/o ) trừ khi quá đặc biệt. bài của bạn có thể dùng ngắt timer ( tốc đọ kiểm tra nhanh ( theo chu kỳ ngắt ) ...
                  khi nhảy vào ngắt thì nên disable ngắt đi ( tôi không dùng codevision ) nhưng đại loại if( button ==...)asm("cli"); rồi làm tiếp công việc stop
                  với phản ứng chậm bạn cũng có thể dùng polling . Lấy ví dụ ... thay vì delay_ms(500) thì bạn viết hàm delay ra .
                  void my_delay(int thoi gian)
                  {
                  delay_ms(1);
                  if(button==...) { làm stop}
                  }

                  lúc đó khi bạn dùng my_delay(500); ... nó sẽ kiểm tra nút stop mỗi 1ms
                  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
                    Nguyên văn bởi queduong Xem bài viết
                    người ta ít khi dùng ngắt onchange ( ngắt i/o ) trừ khi quá đặc biệt. bài của bạn có thể dùng ngắt timer ( tốc đọ kiểm tra nhanh ( theo chu kỳ ngắt ) ...
                    khi nhảy vào ngắt thì nên disable ngắt đi ( tôi không dùng codevision ) nhưng đại loại if( button ==...)asm("cli"); rồi làm tiếp công việc stop
                    với phản ứng chậm bạn cũng có thể dùng polling . Lấy ví dụ ... thay vì delay_ms(500) thì bạn viết hàm delay ra .
                    void my_delay(int thoi gian)
                    {
                    delay_ms(1);
                    if(button==...) { làm stop}
                    }

                    lúc đó khi bạn dùng my_delay(500); ... nó sẽ kiểm tra nút stop mỗi 1ms
                    em chưa hiểu lắm polling.em cũng chỉ mới học avr nên còn rất kém.giúp em nốt đc ko ạ.em có thắc mắc là thiết lập thế nào để cứ 10ms thì nhảy vào ngắt.hay theo cách của anh thì em có thể dùng polling.nhưng em viết thử vào ct mà vẫn chưa đc anh ạ.theo bài của em thì nên sửa chỗ nào ạ

                    Comment


                    • #11
                      Nguyên văn bởi binhkhe92 Xem bài viết
                      em chưa hiểu lắm polling.em cũng chỉ mới học avr nên còn rất kém.giúp em nốt đc ko ạ.em có thắc mắc là thiết lập thế nào để cứ 10ms thì nhảy vào ngắt.hay theo cách của anh thì em có thể dùng polling.nhưng em viết thử vào ct mà vẫn chưa đc anh ạ.theo bài của em thì nên sửa chỗ nào ạ
                      Polling ( cuộn ) ... ví dụ bạn đặt lệnh kiểm tra trong while(1) { if(button....) } quá trình đó lặp đi lặp lại ... gọi là POLLING.

                      -- Còn làm thế nào để nó nhảy vào ngắt 10ms :
                      1) Đặt thông số giá trị timer, bộ chia ( tính ra )
                      2) Start timer
                      3) Cho phép ngắt hoặc hoạt động ngắt asm ("sei");
                      4) trong hàm ngắt thì kiểm tra button như đã đề cập !
                      5) disable ngắt ... làm stop
                      6) khi nào start thì lại enable ngắt và thực hiện như bước (2)

                      như vậy khi đã start timer mỗi lần Tràn thì xảy ra ngắt ...mà mỗi lần vào hàm ngắt thì ta kiểm tra cái việc ( button) của ta thôi ( thời gian do mình chọn ... bất kỳ ( không cứ là 10ms ) , thời gian ngắt càng nhỏ thì quá trình kiểm tra càng liên tục và ngược lạ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


                      • #12
                        Nguyên văn bởi queduong Xem bài viết
                        Polling ( cuộn ) ... ví dụ bạn đặt lệnh kiểm tra trong while(1) { if(button....) } quá trình đó lặp đi lặp lại ... gọi là POLLING.

                        -- Còn làm thế nào để nó nhảy vào ngắt 10ms :
                        1) Đặt thông số giá trị timer, bộ chia ( tính ra )
                        2) Start timer
                        3) Cho phép ngắt hoặc hoạt động ngắt asm ("sei");
                        4) trong hàm ngắt thì kiểm tra button như đã đề cập !
                        5) disable ngắt ... làm stop
                        6) khi nào start thì lại enable ngắt và thực hiện như bước (2)

                        như vậy khi đã start timer mỗi lần Tràn thì xảy ra ngắt ...mà mỗi lần vào hàm ngắt thì ta kiểm tra cái việc ( button) của ta thôi ( thời gian do mình chọn ... bất kỳ ( không cứ là 10ms ) , thời gian ngắt càng nhỏ thì quá trình kiểm tra càng liên tục và ngược lại.
                        cảm ơn anh.sau khi tìm hiểu thì em đã biết cách tính thời gian.nhưng chưa biết thiết lập trên codevision ra sao.vì thiết lập thì ra dòng interrupt void inter_.. cái gì đó.đây có phải là tính bằng tín hiệu vào chân T0 đúng không ạ.còn thiết lập bằng thời gian thì phải ra dạng như thế này phải không

                        #include <avr/io.h>
                        #include <avr/interrupt.h>
                        #include <util/delay.h>

                        int main(void){
                        DDRB=0xFF; //PORTB la output PORT
                        PORTB=0x00;

                        TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler = 8
                        TCNT0=131; //gan gia tri khoi tao cho T/C0
                        TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0
                        sei(); //set bit I cho phep ngat toan cuc

                        while (1){ //vòng lặp vô tận
                        //do nothing
                        }
                        return 0;
                        }

                        //trinh phuc vu ngat tran T/C0
                        ISR (TIMER0_OVF_vect ){
                        TCNT0=131; //gan gia tri khoi tao cho T/C0
                        PORTB^=1; //doi trang thai Bit PB0
                        }

                        Comment


                        • #13
                          cái code này ở trên hocavr.com (Bài 4 - Timer - Counter ) người ta chỉ ra rất rõ cho bạn rồi. bạn chỉ cần đọc thật kỹ và viết thử rồi thử mô phỏng là làm được mà, còn nếu cứ tổn nhiều thời gian đi hỏi thì sẽ lâu đó. anh queduong anh nói không dùng codevision rồi mà
                          chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
                          Everything should be made as simple as possible, but not simpler

                          Comment


                          • #14
                            tóm lại đây là một phần tử chả chịu đọc, chả chịu động não, chờ người ta viết dùm. 2 cái code 1 cái là viết bằn codevision, 1 cái viết bằng GCC thế mà cũng đem lên hỏi
                            |

                            Comment


                            • #15
                              Nguyên văn bởi quangminh Xem bài viết
                              tóm lại đây là một phần tử chả chịu đọc, chả chịu động não, chờ người ta viết dùm. 2 cái code 1 cái là viết bằn codevision, 1 cái viết bằng GCC thế mà cũng đem lên hỏi
                              cám ơn bác.em cứ tưởng nó viết bằng codevision cơ.em đọc thì hiểu nhưng mà thấy khác so với chương trình codevision tạo ra.để em tìm hiểu tiếp

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              • mèomướp
                                Trả lời cho Công thức điện tử
                                bởi mèomướp
                                Dạ thời thế giờ thay đổi theo hướng tích cực hơn rồi chú trung sĩ ạ. Kiến thức được chia sẻ ngày càng nhìu nên làm ăn gian dối ko còn dễ dàng như trước đâu ạ. Những thợ nhỏ rồi sẽ thành công nhân sản xuất đồ mới hết thay vì sửa chữa lặt vặt...
                                hôm nay, 21:21
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ cùng chuẩn tín hiệu thì chắc chắn là nhận ạ. Vì bản chất oled hay lcd thì đều phải có mạch chuyển đổi trên thanh gỗ rồi chuyển sang những chip xử lý hàng nghìn chân gắn trên những tab mỏng dính rồi mới ra các điểm ảnh theo hàng...
                                hôm nay, 20:31
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                Ok , thanks bác đã chỉ...
                                hôm nay, 15:06
                              • nguyendinhvan
                                Công thức điện tử
                                bởi nguyendinhvan
                                Sau bao năm nghiên cứu cái dtvn. Tôi phát hiện công thức này. Các anh em xem đúng bao nhiêu phần trăm nhé !

                                Chập thì thay. Cháy thì tháo
                                Làm thì láo. Báo thì hay
                                May thì khoe. Rủi thì bỏ
                                Thành tích nhỏ. Báo thành to
                                Làm cho có. Báo chi li
                                Sai cả li. Báo
                                ...
                                hôm nay, 00:35
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                có chắc ko b, màn lcd phải có cao áp mới sáng, màn led thì ko có, ko có cáp chuyển đổi thì lắp thế nào đc ??...
                                Hôm qua, 22:31
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ ý chú là màn oled ấy ạ. Cùng chuẩn lvds cùng độ phân giải thì cắm được ạ. Còn nó mà khác thì hơi khó vì oled các điểm ảnh nó tự phát sáng chứ ko dùng đèn nền như lcd. Cháu chỉ biết đến vậy thôi ạ. Chú muốn nghịch phải tự tìm hiểu kỹ trước khi mua thôi, khó mà ông thợ nào tư vấn vụ này...
                                Hôm qua, 22:14
                              • bactho
                                Trả lời cho Tự làm máy đo Cuộn cảm
                                bởi bactho
                                Hay đấy bạn ạ. Đây có thể hiểu là máy đo cuộn dây. Tiện đây xin cho hỏi bạn có hiểu rõ về máy nạp rôm pcb 45 của hãng thiên minh không giúp mình cách cài fw của nó với vì mình vừa được anh bạn cho nhưng lại không biết cài fw nên chưa dùng được. Nếu có thể thì bạn giúp mình với...
                                Hôm qua, 21:48
                              • yname11
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi yname11
                                màn của mình là LCD , giờ m muốn mua màn LED để thay thế (ko muốn dùng màn LCD nữa) , lên muốn hỏi xem có cáp chuyển đổi nào có thể cắm đc màn LED vào ko , tất nhiên phải có cùng số chân pin với màn cũ rồi . VD: màn cũ là lcd mỏng , 40 pin...
                                Hôm qua, 21:43
                              • bactho
                                Trả lời cho các bạn giúp mình về file HEX với!!!
                                bởi bactho
                                Bạn vào trang phuclanshop.com ,tìm đến góc kỹ thuật. Tác giả vương khánh hưng nói rất rõ về điều bạn tìm...
                                Hôm qua, 21:21
                              • mèomướp
                                Trả lời cho Xin hỏi về màn hình laptop
                                bởi mèomướp
                                Dạ màn hình lcd đều có thể lai cấy cho nhau được hết ạ. Các loại cáp, bo mạch chuyển đổi lvds rất nhìu, với dòng sony còn phải nhổ cả chip nhớ của main cũ đưa lên gỗ thì mới lắp sang máy khác đc, chưa kể các bệnh về màu... ngay cả...
                                Hôm qua, 20:43
                              Đang tải...
                              X