Thông báo

Collapse
No announcement yet.

Giúp e viết timer AVR khoảng thời gian là 5p trên codevision với!!

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

  • Giúp e viết timer AVR khoảng thời gian là 5p trên codevision với!!

    E nhận được đề tài nội dung là hẹn giờ cứ 5 phút thì vdk báo 1 lần mỗi lần báo như vậy thì 2 led 7 đoạn sẽ tang lên 1 đơn vị cùng lúc đó buzzer sẽ kêu theo số lần mà led 7 đoạn hiển thị.ai gợi ý giúp e cách xài timer với,e coi mãi mà vẫn ko hiều cách viết timer như thế nào cả.đa số là hẹn timer1 khoang tg theo us,hay ms còn khoảng 5p thì khá lâu ko biết nên xài ds1307 ko vậy a/c?

  • #2
    bạn khỏi cần
    gợi ýL
    sử dụng ngắt timer - ví dụ timer 16 bit nha
    sử dụng thạch anh 1mhz
    1 lệnh là 1us
    vậy 16 bit timer đếm lên đến 65536us nhưng ta chỉ lấy 50000 cho chẵn
    vậy 1 lần tràn là 50000us = 50ms
    vậy 1s cần 20 lần tràn
    vậy 1 phút cần 50*60 = 3000 lần tràn
    vậy 5 phút = 15 ngàn lần tràn

    code như sau:
    khai bao bien su dung
    int demsolantran = 0
    char dem - bien nay de dem so de hien thi led 7 doan

    void ngat_timer()
    {
    xoa co bao ngat
    demsolantran++
    if ( demsolantran == 15000)
    {
    dem ++
    }

    }


    void hienthi7doan()
    {
    ban tu hieu cai gi duoc viet trong nay nha
    }

    void buzz_keu()
    {
    ban tu hieu cai gi duoc viet trong nay nha
    }



    void main()
    {
    khoi tao timer


    while(1)
    {
    hienthiled7doan()
    buzzer()
    }



    }
    Be quan. Plz contact through email:

    Comment


    • #3
      b giúp mìh chỗ viết cái xóa cờ báo ngắt với set timer 1 ,cái timer 1 mình viết theo khai báo trong codevision ko biết đúng ko nua

      int demsolantran = 0
      char dem - bien nay de dem so de hien thi led 7 doan

      void ngat_timer()
      {
      xoa co bao ngat
      demsolantran++
      if ( demsolantran == 15000)
      {
      dem ++
      }

      }


      void hienthi7doan()
      {
      ban tu hieu cai gi duoc viet trong nay nha
      }

      void buzz_keu()
      {
      ban tu hieu cai gi duoc viet trong nay nha
      }



      void main()
      {
      TCCR1A=0x00;
      TCCR1B=0x01;
      TCNT1H=0x00;
      TCNT1L=0x00;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;//khoi tao timer 1


      while(1)
      {
      ngat_timer()
      buzzer()
      hienthiled7doan()

      }



      }

      Comment


      • #4
        b giúp mìh chỗ viết cái xóa cờ báo ngắt với set timer 1 ,cái timer 1 mình viết theo khai báo trong codevision ko biết đúng ko nua

        int demsolantran = 0
        char dem - bien nay de dem so de hien thi led 7 doan

        void ngat_timer()
        {
        xoa co bao ngat
        demsolantran++
        if ( demsolantran == 15000)
        {
        dem ++
        }

        }


        void hienthi7doan()
        {
        ban tu hieu cai gi duoc viet trong nay nha
        }

        void buzz_keu()
        {
        ban tu hieu cai gi duoc viet trong nay nha
        }



        void main()
        {
        TCCR1A=0x00;
        TCCR1B=0x01;
        TCNT1H=0x00;
        TCNT1L=0x00;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0x00;
        OCR1BH=0x00;
        OCR1BL=0x00;//khoi tao timer 1



        while(1)
        {
        ngat_timer()
        buzzer()
        hienthiled7doan()

        }



        }



        hix thông cảm cho mình,mới học AVR nên vẫn còn mập mờ nhiều chỗ

        Comment


        • #5
          trong while(1) không gọi ngắt
          ngắt tự thực thi khi xảy ra

          xem trong datasheet bit cờ của timer 1
          rồi trong chương trình con phục vụ ngắt xóa nó đi
          Be quan. Plz contact through email:

          Comment


          • #6
            Bài 4 - Timer - Counter

            cái này cho banddoxxjc kỹ cách khởi tạo và thiết lập
            Be quan. Plz contact through email:

            Comment


            • #7
              ai đã từng đi dạy bên dân lập sẽ " luôn luôn thấu hiểu"
              Be quan. Plz contact through email:

              Comment


              • #8
                E có 2 điều băn khoăn ở đây
                thứ nhất là sao ta ko chọn giá trị Top là 50000/1 lệnh tốn 1us
                =>1 tràn tốn 50ms
                =>1s=20 tràn
                =>1p=1200 tràn chỗ này bác Lenh Ho viết nhầm ,
                =>5p là 6000 lần tràn
                như vậy nên đặt giá trị Top=50000=C350 h,giá trị sẽ được gán cho thanh OCR1 để TCNT1 so sánh
                như vậy lúc khai báo là như thế này đúng ko ah
                TCCR1A=0x00;
                TCCR1B=0x01;
                TCNT1H=0x00;
                TCNT1L=0x00;
                ICR1H=0x00;
                ICR1L=0x00;
                OCR1AH=0xc3;
                OCR1AL=0x50;

                OCR1BH=0x00;
                OCR1BL=0x00;


                TIMSK=0X10; //SET NGAT KHI OCR1A=TCNT1

                nếu ban đầu ko khai báo OCR1AL VÀ OCR1AH thì TCNT1 sẽ chỉ so sánh tới giá trị Top ffff phải ko a?

                thứ 2 là set cờ ngắt về TOV1=0 đúng ko ak? và trong while(1) không gọi ngắt
                ngắt tự thực thi khi xảy ra. theo e ý bác là ko dem chtrinh2 ngat_timer vào while(1) đúng ko ah,thỉ cái đoạn
                ngat_timer mình sẽ gọi ở đâu ,trong void main ha bác.
                Last edited by phunguyen_91; 10-05-2012, 16:59.

                Comment


                • #9
                  e đã viết xong code mà sao làm mô phỏng proteus nó chỉ báo 5 phút dau tien thôi,5 phut thu 2 ko báo ai biết giúp giùm e với code phía dưới và file mô phỏng
                  dem 5phut.zip

                  #include <mega16.h>
                  #include <delay.h>
                  #define buzzer PINA.3
                  #define chuc PINA.1 //cho phep hien thi led 7doan hang chuc
                  #define donvi PINA.2 ////cho phep hien thi led 7doan don vi
                  #define hienthi PORTC // tin hieu ra led 7 doan xuat ra tu port C
                  #define led13 PINA.4 //cong noi voi led cho led sang khi dem den 5 phut lan thu 15
                  char led[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x0 9};

                  long int demtran;
                  int solan5phut=0;
                  int m=0; //m la bien dem cho buzzzer


                  // Timer1 overflow interrupt service routine
                  interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                  {
                  TCNT1=0 ;
                  demtran++;
                  if (demtran==4577)//tran den lan thu 4577 tuong ung voi 5phut troi qua
                  {
                  solan5phut++;
                  if (solan5phut==13) //den lan thu 13 dem 5 phut thi den se chay ko lam gi ca
                  while(1)
                  {
                  led13=1 ;
                  }


                  for(m=0;m<=solan5phut;m++)
                  { buzzer=1;
                  delay_ms(2000);}

                  }

                  }

                  // Declare your global variables here

                  void main(void)
                  {
                  //A out A1 chuc.A2 don vi.A3 buzzer
                  PORTA=0x00;
                  DDRA=0xFF;

                  //B in B1 dieu khien tu xa
                  PORTB=0x00;
                  DDRB=0x00;

                  //C out //dieu khien led
                  PORTC=0x00;
                  DDRC=0xFF;
                  //D out
                  PORTD=0x00;
                  DDRD=0xFF;

                  // timer 0 noconnect
                  TCCR0=0x00;
                  TCNT0=0x00;
                  OCR0=0x00;

                  // Timer/Counter 1 initialization
                  // Clock source: System Clock
                  // Clock value: 1000.000 kHz
                  // Mode: Normal top=0xFFFF
                  // OC1A output: Discon.
                  // OC1B output: Discon.
                  // Noise Canceler: Off
                  // Input Capture on Falling Edge
                  // Timer1 Overflow Interrupt: On
                  // Input Capture Interrupt: Off
                  // Compare A Match Interrupt: Off
                  // Compare B Match Interrupt: Off
                  //--------------
                  TCCR1A=0x00;
                  TCCR1B=0x01;
                  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;

                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=0x04;
                  //-------------

                  UCSRB=0x00;

                  ACSR=0x80;
                  SFIOR=0x00;


                  ADCSRA=0x00;


                  SPCR=0x00;

                  TWCR=0x00;

                  // Global enable interrupts
                  #asm("sei")

                  while (1)
                  {
                  switch(solan5phut)
                  { case 0 : {donvi=1;
                  hienthi=led[0] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;
                  case 1: {donvi=1;
                  hienthi=led[1] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;
                  case(2): {donvi=1;
                  hienthi=led[2] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;
                  case(3): {donvi=1;
                  hienthi=led[3] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;

                  case(4): {donvi=1;
                  hienthi=led[4] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;

                  case(5): {donvi=1;
                  hienthi=led[5] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;
                  case(6): {donvi=1;
                  hienthi=led[6] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;
                  case(7): {donvi=1;
                  hienthi=led[7] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;
                  case(8): {donvi=1;
                  hienthi=led[8] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;

                  case(9): {donvi=1;
                  hienthi=led[9] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[0] ;
                  delay_ms(1); }
                  break;

                  case(10): {donvi=1;
                  hienthi=led[0] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[1] ;
                  delay_ms(1); }
                  break;

                  case(11): {donvi=1;
                  hienthi=led[1] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[1] ;
                  delay_ms(1); }
                  break;

                  case(12): {donvi=1;
                  hienthi=led[2] ;
                  delay_ms(1);
                  chuc=1;
                  hienthi=led[1] ;
                  delay_ms(1); }
                  break;


                  }
                  }
                  }

                  Comment


                  • #10
                    em chưa hiểu về ngắt
                    trong trình biên dịch - khi viết chuơng trình ngắt ta ko gọi nó ở while(1)
                    nó tự động chạy đến để thực thi khi có ngắt xảy ra

                    xong rồi thì nó quay trở lại

                    bạn cần p biệt được hàm bình thường và hàm ngắt
                    Be quan. Plz contact through email:

                    Comment


                    • #11
                      theo như code làm ở trên e viết chương trình ngắt và ch trình trong while( 1 )là độc lập với nhau mà chỉ ko biết có thể gọi solan5phut trong đoạn chương trình ngắt như bên dưới để làm biến cho chương trình trong while(1) để luôn hiển thị "số lần" 5 phút mà AVR đếm lên led 7 đoạn dung ko?

                      // Timer1 overflow interrupt service routine
                      interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                      {
                      TCNT1=0 ;
                      demtran++;
                      if (demtran==4577)//tran den lan thu 4577 tuong ung voi 5phut troi qua
                      {
                      solan5phut++;
                      if (solan5phut==13) //den lan thu 13 dem 5 phut thi den se chay ko lam gi ca
                      while(1)
                      {
                      led13=1 ;
                      }


                      mình cũng thac mac chỗ này bác Lenh Ho giải thích lun giùm mình dc ko

                      Comment


                      • #12
                        Nguyên văn bởi binhminhdem Xem bài viết
                        theo như code làm ở trên e viết chương trình ngắt và ch trình trong while( 1 )là độc lập với nhau mà chỉ ko biết có thể gọi solan5phut trong đoạn chương trình ngắt như bên dưới để làm biến cho chương trình trong while(1) để luôn hiển thị "số lần" 5 phút mà AVR đếm lên led 7 đoạn dung ko?

                        // Timer1 overflow interrupt service routine
                        interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                        {
                        TCNT1=0 ;
                        demtran++;
                        if (demtran==4577)//tran den lan thu 4577 tuong ung voi 5phut troi qua
                        {
                        solan5phut++;
                        demtran = 0; - bạn phải gán để nó đếm lại cho lần sau chứ
                        if (solan5phut==13) //den lan thu 13 dem 5 phut thi den se chay
                        led = 1 ; cho led sang luon o day

                        }
                        while(1)
                        {
                        led13=1 ; --- ko can cai nay - tức chẳng cần làm gì - ta cứ để nó chạy chơi vậy -- đến khi nào timer tràn thì tự động quay về ngắt và tăng demtran len 1 đơn vi ( nhìn lên ngắt tui giải thích tiếp)


                        }


                        mình cũng thac mac chỗ này bác Lenh Ho giải thích lun giùm mình dc ko
                        có gì cứ hỏi - tui trả lời bằng cách sửa code của bạn đó
                        Be quan. Plz contact through email:

                        Comment


                        • #13
                          Nguyên văn bởi phunguyen_91 Xem bài viết
                          e đã viết xong code mà sao làm mô phỏng proteus nó chỉ báo 5 phút dau tien thôi,5 phut thu 2 ko báo ai biết giúp giùm e với code phía dưới và file mô phỏng
                          [ATTACH]44833[/ATTACH]

                          #include <mega16.h>
                          #include <delay.h>
                          #define buzzer PINA.3
                          #define chuc PINA.1 //cho phep hien thi led 7doan hang chuc
                          #define donvi PINA.2 ////cho phep hien thi led 7doan don vi
                          #define hienthi PORTC // tin hieu ra led 7 doan xuat ra tu port C
                          #define led13 PINA.4 //cong noi voi led cho led sang khi dem den 5 phut lan thu 15
                          char led[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x0 9};

                          long int demtran;
                          int solan5phut=0;
                          int m=0; //m la bien dem cho buzzzer


                          // Timer1 overflow interrupt service routine
                          interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                          {
                          TCNT1=0 ;
                          demtran++;
                          if (demtran==4577)//tran den lan thu 4577 tuong ung voi 5phut troi qua
                          {
                          solan5phut++;
                          demtran = 0; bạn gán = 0 cho lần sau nữa chứ
                          if (solan5phut==13) //den lan thu 13 dem 5 phut thi den se chay ko lam gi ca
                          {
                          led13=1 ;
                          for(m=0;m<=solan5phut;m++)
                          { buzzer=1;
                          delay_ms(2000);}
                          }

                          }

                          // Declare your global variables here
                          int solan5phut = 0;


                          void main(void)
                          {
                          //A out A1 chuc.A2 don vi.A3 buzzer
                          PORTA=0x00;
                          DDRA=0xFF;

                          //B in B1 dieu khien tu xa
                          PORTB=0x00;
                          DDRB=0x00;

                          //C out //dieu khien led
                          PORTC=0x00;
                          DDRC=0xFF;
                          //D out
                          PORTD=0x00;
                          DDRD=0xFF;

                          // timer 0 noconnect
                          TCCR0=0x00;
                          TCNT0=0x00;
                          OCR0=0x00;

                          // Timer/Counter 1 initialization
                          // Clock source: System Clock
                          // Clock value: 1000.000 kHz
                          // Mode: Normal top=0xFFFF
                          // OC1A output: Discon.
                          // OC1B output: Discon.
                          // Noise Canceler: Off
                          // Input Capture on Falling Edge
                          // Timer1 Overflow Interrupt: On
                          // Input Capture Interrupt: Off
                          // Compare A Match Interrupt: Off
                          // Compare B Match Interrupt: Off
                          //--------------
                          TCCR1A=0x00;
                          TCCR1B=0x01;
                          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;

                          // Timer(s)/Counter(s) Interrupt(s) initialization
                          TIMSK=0x04;
                          //-------------

                          UCSRB=0x00;

                          ACSR=0x80;
                          SFIOR=0x00;


                          ADCSRA=0x00;


                          SPCR=0x00;

                          TWCR=0x00;

                          // Global enable interrupts
                          #asm("sei")

                          while (1)
                          {
                          switch(solan5phut)
                          { case 0 : {donvi=1;
                          hienthi=led[0] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;
                          case 1: {donvi=1;
                          hienthi=led[1] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;
                          case(2): {donvi=1;
                          hienthi=led[2] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;
                          case(3): {donvi=1;
                          hienthi=led[3] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;

                          case(4): {donvi=1;
                          hienthi=led[4] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;

                          case(5): {donvi=1;
                          hienthi=led[5] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;
                          case(6): {donvi=1;
                          hienthi=led[6] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;
                          case(7): {donvi=1;
                          hienthi=led[7] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;
                          case(8): {donvi=1;
                          hienthi=led[8] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;

                          case(9): {donvi=1;
                          hienthi=led[9] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[0] ;
                          delay_ms(1); }
                          break;

                          case(10): {donvi=1;
                          hienthi=led[0] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[1] ;
                          delay_ms(1); }
                          break;

                          case(11): {donvi=1;
                          hienthi=led[1] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[1] ;
                          delay_ms(1); }
                          break;

                          case(12): {donvi=1;
                          hienthi=led[2] ;
                          delay_ms(1);
                          chuc=1;
                          hienthi=led[1] ;
                          delay_ms(1); }
                          break;


                          }
                          }
                          }
                          của bạn đây
                          Be quan. Plz contact through email:

                          Comment


                          • #14
                            E cảm ơn Bác Lenh Ho nhiều lắm .căn bản ở đây là e chưa set bientran để lần sau xài tiếp nên chương trình chỉ hiện có mỗi số 01.thành thật biết ơn bác nhiều lắm.

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X