Thông báo

Collapse
No announcement yet.

Phan IT xin giới thiệu các ví dụ cơ bản về AVR !

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

  • Phan IT xin giới thiệu các ví dụ cơ bản về AVR !

    Chào các bạn Phan IT xin giới thiệu các ví dụ cơ bản về AVR. Tôi sẽ đưa lên luồng này các ví dụ cơ bản mà AVR làm việc với, mỗi ví dụ sẽ có sơ đồ mạch điện, code chương trình bằng C hoặc assemble hoặc cả hai:
    - Led đơn.
    - Nhiều Leds đơn.
    - Led 7 đoạn.
    - Led ma trận.
    - Ngắt ngoài.
    - Ngắt timer.
    - USART.
    - Analog Comparator.
    - 74HC595.
    - LCD16x2.
    - DS1820.
    - DS18B20.
    - 24C04.
    - 25C64.
    - ADC.
    ....
    Các ví dụ này rất hữu ích cho các bạn mới tìm hiểu về AVR, các bạn tiết kiệm được rất nhiều thời gian để học tập và phát triển ứng dụng của mình.
    Tất cả các ví dụ này tôi đã chạy thử thành công (có hình ảnh minh họa).
    Nếu các bạn muốn tìm hiểu chi tiết hơn nữa xin mời tham khảo website của tôi: http://www.phanit.com tìm trong mục Học tập.


    Hôm nay xin giới thiệu bài đầu tiên:
    - Giao tiếp ATtiny2313 với led đơn. Đây là ví dụ đơn giản nhất, ATtiny sẽ điều khiển 1 led nhấp nháy bằng cách delay. Thay đổi thời gian nhấp nháy bằng ham delay.
    Chương trình điều khiển viết bằng Assemble và C.
    Attached Files
    0912666017

  • #2
    Ví dụ ATtiny2313 giao tiếp với 8 leds đơn.
    - Điều khiển 8 led sáng dần từ LSB bit đến MSB bit.
    - Chương trình điều khiển bằng Assemble và C.
    Attached Files
    0912666017

    Comment


    • #3
      Ví dụ ATtiny2313 với ngắt ngoài.
      - Một keypad đượi nối với ngắt ngoài, mỗi khi nhấn keypad sẽ tạo ra một ngắt, ngắt này được thể hiện qua việc làm thay đổi trạng thái một led đơn.
      - Chương trình điều khiển bằng C.
      Attached Files
      0912666017

      Comment


      • #4
        Ví dụ ATtiny2313 với ngắt timer.
        - ATtiny2313 phát sinh ngắt timer sau mỗi khoảng thời gian xác định, ngắt này được thể hiện qua làm nhấp nháy một led.
        - Chương trình viết bằng C.
        Attached Files
        0912666017

        Comment


        • #5
          Ví dụ ATtiny2313 với ngắt timer comparator.
          - ATtiny2313 sẽ đếm sự kiện led D1 nhấp nháy, đến một giá trị xác định xẽ phát sinh một ngắt, ngắt này được thể hiện qua việc nhấp nháy led D2.
          - Chương trình được viết bằng C.
          Attached Files
          0912666017

          Comment


          • #6
            Ví dụ ATtiny2313 với ngắt Analog comparator.
            - ATtiny2313 sẽ so sánh điện áp đặt vào chân AIN1 với điện áp Volt reference 2.7V. Khi điện áp đặt vào AIN1 nhỏ hơn 2.7V sẽ phát sinh một ngắt, ngắt này được thể hiện ra bằng cách làm sáng led D1.
            - Chương trình viết bằng C.
            Attached Files
            0912666017

            Comment


            • #7
              Ví dụ ATtiny2313 với USART.
              - ATtiny2313 giao tiếp với PC qua MAX232, theo phương pháp polling (không dùng ngắt). Đầu PC truyền nhận data bằng phần mềm Hyperterminal (có sẵn của Window).
              - Trên giao diện của Hyperterminal bạn gõ ký tự vào, ký tự đó được PC gửi qua cổng COM tới ATtiny2313, ATtiny2313 nhận ký tự đó và gửi lại màn hành Hyperterminal.
              - Chương trình viết bằng C và Assemble. Các bạn có thể modify mở rộng thêm các tính năng khác cho ví dụ.
              Attached Files
              0912666017

              Comment


              • #8
                mình xin đóng góp về đo nhiệt độ và có cảnh báo

                // trong phần này có file thư viện lib_adc.h
                // do nhiet do LM35
                //cai dat nhiet do canh bao
                // viết bằng chương trình AVR Studio

                #include <avr/io.h>
                #include <avr/interrupt.h>
                #include <inttypes.h>
                #include <avr/eeprom.h>
                #include "lib_adc.h"
                #include <stdlib.h>

                #define led PORTD
                #define setbit(port,pin) port|=1<<pin
                #define clrbit(port,pin) port&=~(1<<pin)
                #define check(port,pin) port&(1<<pin)
                #define up PINA1
                #define down PINA2
                #define enter PINA3

                unsigned int t,t1;
                unsigned char i,y,so[4],x,mau[10],qua_nhiet=0;
                unsigned char num[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };//anode comon
                unsigned char qua_nhiet_eeprom EEMEM;
                unsigned char add_eeprom EEMEM=0;

                void port_init()
                {
                DDRA=0xf1;
                PORTA=0xfe;

                DDRB=0xff;
                PORTB=0xff;

                DDRC=0xff;
                PORTC=0xff;

                DDRD=0xff;
                PORTD=0xff;
                }

                void giaima(unsigned char c, unsigned char c1)
                {
                so[0]=c/10;
                so[1]=c%10;
                so[2]=c1/10;
                so[3]=c1%10;
                }

                void laymau()
                {
                mau[9]=mau[8];
                mau[8]=mau[7];
                mau[7]=mau[6];
                mau[6]=mau[5];
                mau[5]=mau[4];
                mau[4]=mau[3];
                mau[3]=mau[2];
                mau[2]=mau[1];
                mau[1]=mau[0];
                mau[0]=x;
                }

                void check_temp()
                {
                if(x>qua_nhiet)
                {
                clrbit(PORTB,0);
                }
                else
                setbit(PORTB,0);
                }

                int main(void)
                {
                port_init();
                init_adc();
                TCCR0=2;
                TCNT0=0;
                TIMSK=1;

                sei();
                qua_nhiet=eeprom_read_byte(&add_eeprom);

                while(1)
                {
                x=read_adc(0);
                x>>=1;
                laymau();
                x=(mau[0]+mau[1]+mau[2]+mau[3]+mau[4]+mau[5]+mau[6]+mau[7]+mau[8]+mau[9])/10;
                check_temp();

                if(!(check(PINA,up)))
                {
                for(t1=0;t1<50000;t1++)
                {
                if(!(check(PINA,up)))
                {
                qua_nhiet++;
                if(qua_nhiet>100)
                qua_nhiet=0;

                eeprom_write_byte(&add_eeprom,qua_nhiet);
                giaima(x,qua_nhiet);
                while(!(check(PINA,up)));
                }
                }
                //while(!(check(PINA,up)));
                }

                if(!(check(PINA,down)))
                {
                for(t1=0;t1<50000;t1++)
                {
                if(!(check(PINA,down)))
                {
                --qua_nhiet;
                if(qua_nhiet>=255)
                qua_nhiet=99;
                eeprom_write_byte(&add_eeprom,qua_nhiet);
                giaima(x,qua_nhiet);
                while(!(check(PINA,down)));

                }
                }

                //while(!(check(PINA,down)));
                }

                giaima(x,qua_nhiet);
                }
                return 0;
                }

                ISR(TIMER0_OVF_vect)
                {
                i=0x01;
                PORTD=i;
                for(y=0;y<4;y++)
                {
                PORTD=i;
                PORTC=num[so[y]];
                for(t=0;t<100;t++);
                PORTD=0;
                i<<=1;
                }
                }
                Attached Files

                Comment


                • #9
                  File thư viện lib_adc.h

                  // initialization adc
                  // codevision

                  #define avcc_external (1<<REFS0)
                  #define aref_internal (1<<REFS0)|(1<<REFS1) //2.56v internal
                  #define aref (0<<REFS0)|(0<<REFS1)

                  void init_adc();
                  unsigned int read_adc(unsigned char channel);

                  //================================================== ========================
                  void init_adc()
                  {
                  ADMUX = aref|(0<<ADLAR);
                  /*
                  cho phep ngat
                  che do chia 128
                  co phep ADC
                  */
                  ADCSRA = (1<<ADEN)|3;

                  }
                  //================================================== ========================

                  unsigned int read_adc(unsigned char channel)
                  {
                  unsigned int result;

                  ADMUX |= channel;
                  ADCSRA |= (1<<ADSC);
                  while(!(ADCSRA&(1<<ADIF)));
                  result = ADC;

                  return result;
                  }

                  //chúc các bạn vui.

                  Comment


                  • #10
                    em ủng hộ luồng này hết mình, em sẽ post bài... hì hì cả nhà ơi đóng góp đi nào

                    Comment


                    • #11
                      Hoan hô anh em tham gia luồng này.

                      Ví dụ ATmega8 với 1 led đơn.
                      - ATmega8 điều khiển led nhấp nháy bằng hàm delay.
                      - Chương trình điều khiển viết bằng C và Assemble.
                      Attached Files
                      0912666017

                      Comment


                      • #12
                        Ví dụ ATmega8 giao tiếp với 8 led đơn.
                        - ATmega8 điều khiển 8 led đơn sáng dần từ LSB bit đến MSB bit
                        - Chương trình điều khiển viết bằng C avf Assemble
                        Ví dụ này có thể mở rộng ra với nhiều port và thêm phần công suất để làm bảng quảng cáo led cố định (bảng vẫy).
                        Attached Files
                        0912666017

                        Comment


                        • #13
                          Ví dụ ATmega8 với ngắt timer.
                          - ATmega8 phát sinh ngắt sau mỗi khoảng thời gian xác định, ngắt này được thể hiện qua việc làm nhấp nháy 1 led đơn. Thay đổi thời gian phát sinh ngắt sẽ làm thay đổi tần suất nhấp nháy.
                          - Chương trình viết bằng C và Assemble
                          Attached Files
                          0912666017

                          Comment


                          • #14
                            Ví dụ ATmega8 với ngát ngoài.
                            - ATmega8 có INT0 nối với một keypad, mỗi khi keypad này được ấn ATmega8 sẽ phát sinh một ngắt ngoài, ngắt này được thể hiện qua việc làm thay đôit trạng thái 1 led đơn.
                            - Chương trình được viết bằng C và Assemble
                            Ví dụ có thể được mở rộng ra để làm việc với các phím bấm
                            Attached Files
                            0912666017

                            Comment


                            • #15
                              Ví dụ ATmega8 với USART.
                              - ATmega8 giao tiếp với PC bằng USART. ATmega8 làm việc ở chế độ polling, phía máy tính dùng chương trình Hyperterminal để truyền nhận số liệu. Mỗi khi gõ bàn phím thì một ký tự được Hyper gửi đến cổng COM sang ATmega8, ATmega8 nhạn ký tự này và gửi ngược trở lại máy tính và hiển thị tại hyper.
                              - Chương trình điều khiển viết bằng C
                              Attached Files
                              0912666017

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X