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

                              Đang tải...
                              X