Thông báo

Collapse
No announcement yet.

Cần giúp đỡ về AVR

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

  • Cần giúp đỡ về AVR

    Các bác cho em cho e hỏi chút xíu.E có cái bài toán là: làm sao đếm được số xung phát ra từ con 555 trong khoảng thời gian là 10s.Rồi sau đó hiển thị kết quả này trên màn hình LCD.
    Ở đây em dùng con ATMega16,truyền dữ liệu đến LCD theo kiểu 4bit.Cổng PB là cổng ra ghép với LCD,còn chân PA0 là chân đọc số xung vào.Các bác xem sơ đồ và chương trình dưới đây của em.Mong nhận được hồi âm của các bác.Thanks nhìu!
    Attached Files
    YM :

  • #2
    Các bác xem giúp hộ em một cái với!
    YM :

    Comment


    • #3
      Chúng ta có thể chỉ cần đếm trong 1s không nhất thiết phải 10s. Tuy nhiên tôi vẫn làm theo yêu cầu của bạn là đếm đủ trong 10s.
      Chân PA0 đưa xung vào hãy chuyển sang chân ngắt INT0 để đếm cho đơn giản.
      Có rất nhiều cách để đếm xung, như dùng counter của timer, ngắt ngoài...ở đây tôi chọn ngắt ngoài.
      Đây là phần mềm dành cho bạn:

      /************************************************** ***
      This program was produced by the
      CodeWizardAVR V2.03.9 Standard
      Automatic Program Generator
      © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
      http://www.hpinfotech.com

      Project : Dem xung
      Version : 1.0
      Date : 7/16/2009
      Author : Nguyen Minh Hieu
      Company : Smartcontact.mh@gmail.com
      Comments:


      Chip type : ATmega16
      Program type : Application
      AVR Core Clock frequency: 8.000000 MHz
      Memory model : Small
      External RAM size : 0
      Data Stack size : 256
      ************************************************** ***/

      #include <mega16.h>

      // Alphanumeric LCD Module functions
      #asm
      .equ __lcd_port=0x18 ;PORTB
      #endasm
      #include <lcd.h>
      #include <stdio.h>

      unsigned long ulSo_xung=0;
      unsigned char tick = 0;
      char buff[33];



      // External Interrupt 0 service routine
      interrupt [EXT_INT0] void ext_int0_isr(void)
      {
      ulSo_xung++;
      }

      // Timer 1 overflow interrupt service routine
      interrupt [TIM1_OVF] void timer1_ovf_isr(void) // NGAT 1 GIAY
      {
      // Reinitialize Timer 1 value
      TCNT1H=0xE17B >> 8;
      TCNT1L=0xE17B & 0xff;
      // Place your code here
      tick++;
      if(tick >= 10)
      {
      #asm("cli");
      tick = 0;
      lcd_clear();
      lcd_gotoxy(0,0);
      lcd_putsf(" XUNG TRONG 10S ");
      lcd_gotoxy(0,1);
      sprintf(buff," %d%d%d%d",ulSo_xung/1000,(ulSo_xung%1000)/100,(ulSo_xung%100)/10,ulSo_xung%10);
      lcd_puts(buff);
      ulSo_xung = 0;
      #asm("sei");
      }
      }

      // Declare your global variables here

      void main(void)
      {
      // Declare your local variables here

      // Input/Output Ports initialization
      // Port A initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTA=0x00;
      DDRA=0x00;

      // Port B initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTB=0x00;
      DDRB=0x00;

      // Port C initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTC=0x00;
      DDRC=0x00;

      // Port D initialization
      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
      PORTD=0x00;
      DDRD=0x00;

      // Timer/Counter 0 initialization
      // Clock source: System Clock
      // Clock value: Timer 0 Stopped
      // Mode: Normal top=FFh
      // OC0 output: Disconnected
      TCCR0=0x00;
      TCNT0=0x00;
      OCR0=0x00;

      // Timer/Counter 1 initialization
      // Clock source: System Clock
      // Clock value: 7.813 kHz
      // Mode: Normal top=FFFFh
      // OC1A output: Discon.
      // OC1B output: Discon.
      // Noise Canceler: Off
      // Input Capture on Falling Edge
      // Timer 1 Overflow Interrupt: On
      // Input Capture Interrupt: Off
      // Compare A Match Interrupt: Off
      // Compare B Match Interrupt: Off
      TCCR1A=0x00;
      TCCR1B=0x05;
      TCNT1H=0xE1;
      TCNT1L=0x7B;
      ICR1H=0x00;
      ICR1L=0x00;
      OCR1AH=0x00;
      OCR1AL=0x00;
      OCR1BH=0x00;
      OCR1BL=0x00;

      // Timer/Counter 2 initialization
      // Clock source: System Clock
      // Clock value: Timer 2 Stopped
      // Mode: Normal top=FFh
      // OC2 output: Disconnected
      ASSR=0x00;
      TCCR2=0x00;
      TCNT2=0x00;
      OCR2=0x00;

      // External Interrupt(s) initialization
      // INT0: On
      // INT0 Mode: Rising Edge
      // INT1: Off
      // INT2: Off
      GICR|=0x40;
      MCUCR=0x03;
      MCUCSR=0x00;
      GIFR=0x40;

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

      // Analog Comparator initialization
      // Analog Comparator: Off
      // Analog Comparator Input Capture by Timer/Counter 1: Off
      ACSR=0x80;
      SFIOR=0x00;

      // LCD module initialization
      lcd_init(16);

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

      while (1)
      {


      };
      }
      n
      ĐT: 0986 492 489

      Tham khảo:

      Comment


      • #4
        Đây là code + Mô phỏng Protues của bạn.
        Attached Files
        n
        ĐT: 0986 492 489

        Tham khảo:

        Comment


        • #5
          Anh Hiếu ơi!em đã mô phỏng thử bài của anh rồi,nhưng Proteus của a dùng bản nào mà e không mở ra được.Em chỉ nạp trương trình của anh vào trong MACHTEST của em sao nó lại không thấy hiển thị gì cả.Em đã đổi chân xung vào là chân PD2/INT0 đúng không anh.Nó như thế này đây.
          Attached Files
          YM :

          Comment


          • #6
            Mình dùng Proteus 7.5.
            n
            ĐT: 0986 492 489

            Tham khảo:

            Comment


            • #7
              Nguyên văn bởi H.Hai Xem bài viết
              Các bác cho em cho e hỏi chút xíu.E có cái bài toán là: làm sao đếm được số xung phát ra từ con 555 trong khoảng thời gian là 10s.Rồi sau đó hiển thị kết quả này trên màn hình LCD.
              Ở đây em dùng con ATMega16,truyền dữ liệu đến LCD theo kiểu 4bit.Cổng PB là cổng ra ghép với LCD,còn chân PA0 là chân đọc số xung vào.Các bác xem sơ đồ và chương trình dưới đây của em.Mong nhận được hồi âm của các bác.Thanks nhìu!
              để đơn giản thì bạn nên dùng 1 timer và 1 counter.
              counter để đếm số xung của 555.
              timer dùng để định thời gian đếm. cứ mỗi lần timer tràn thì bạn đọc về giá trị counter và reset nó.(có thể sẽ bị trễ vài chu kì máy của avr).
              counter thì dùng timer1 để cho nó đếm 16 bit. và bạn cần cho ngắt tràn để kiểm soát nó, phòng trường hợp f của 555 lớn mà bạn cho nó đếm lâu quá thì sẽ bị tràn đây.
              chú ý nữa là f max của 555, vì con avr chỉ đếm được xung có tần số giới hạn thôi. hình như là fosc/2 thì phải(chỉ khi nào dùng counter thôi còn nếu dùng ngắt thì.. ko thể nào đạt được đến tần số này đâu), bạn coi kĩ phần này trong datasheet nhé.

              thân!

              Comment

              Về tác giả

              Collapse

              H.Hai Tìm hiểu thêm về H.Hai

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

              Collapse

              Đang tải...
              X