Thông báo

Collapse
No announcement yet.

AVR cho người mới bắt đầu

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Nguyên văn bởi qvibot Xem bài viết
    cho minh hoi co ai co pham mem viet code cho AVR BANG avrasm khong co the cho minh link dc khong
    minh dang thu viet bang asm
    minh xin cam on
    DAY LA MAIL CUA MINH :QUANTUGIANGNAM2005@YAHOO.COM.VN
    Dear bạn qvibot,
    bạn có thể vào:
    http://www.atmel.com/dyn/products/to...p?tool_id=2725
    để down phần mền AVR studio về là bạn có thể viết asm thoải mái(bạn down cái version 4.13,cái này bạn phải đăng kí nhưng cũng nhanh gọn thôi, chẳng mất tiền.Những cái SP1,SP2 là các bản nâng cấp nhưng mình nghĩ nếu bạn viết asm cho các ứng dụng đơn giản thì chẳng cần cũng đc). Nếu sau này bạn muốn viết C thì phải tải thêm Winavr (bạn search trên mạng là thấy ngay).Cả 2 cái này đều miễn phí cả.

    Mình nghĩ bạn là người mới bắt đầu, bạn nên tham gia vào luồng của Bác Duy Phi sẽ có nhiều điều bổ ích cho bạn:http://dientuvietnam.net/forums/showthread.php?t=16266
    Last edited by robetaynguye; 25-08-2008, 14:13.

    Comment


    • atmega 16,portc pinc.3,4,5,6 ko hoạt động được,thử nhiều con rồi vẩn vậy.tôi thử viết 1 đoạn đơn giản để kiểm tra:
      #include <mega16.h>
      #include <delay.h>
      void main(void)
      {
      DDRC=0xFF;

      while(1)

      {
      PORTC=0x00;
      delay_ms(100);
      PORTC=0xFF;
      delay_ms(100);
      }
      }
      các cao thủ chỉ giáo dùm!!!!
      |

      Comment


      • Nguyên văn bởi vinhyen Xem bài viết
        atmega 16,portc pinc.3,4,5,6 ko hoạt động được,thử nhiều con rồi vẩn vậy.tôi thử viết 1 đoạn đơn giản để kiểm tra:
        #include <mega16.h>
        #include <delay.h>
        void main(void)
        {
        DDRC=0xFF;

        while(1)

        {
        PORTC=0x00;
        delay_ms(100);
        PORTC=0xFF;
        delay_ms(100);
        }
        }
        các cao thủ chỉ giáo dùm!!!!
        Với nhiều dòng Atmega thì PortC có vài chân tích hợp chức năng JTAG, mặc định được kích hoạt, do đó nó không thể sử dụng để làm IO. Bạn Disable chức năng này đi là xong (bỏ chọn fuse JTAGEN).
        PNLab
        Mạch nạp/debug ULink2, Jlink ARM USB
        Mạch nạp AVR, PIC, 8051, MSP430 USB
        Mạch phát triển STM32, ARM9, ARM11
        more...www.pnlabvn.com

        Comment


        • mình đả làm rồi,nhưng khi chuyển qua thẻ program để nạp thì ô jtag tự động enable.không thay đổi được.

          mình làm được rồi.cảm ơn nhiều!!!!
          Last edited by sphinx; 05-09-2008, 08:16.
          |

          Comment


          • Mình đang thử cái truyền nhận sd RS485,viet bang codevision,cái vd chỉ truyền đi 1 mảng rồi nhận lại,giao tiếp giữa at16 và at8,thử truyền trực tiếp thì được(protues) nhưng mà nối con max487 vào thì nó ko nhận,bạn nào làm rồi giúp minh xem sai ở đâu với

            đây là at16:
            /************************************************** ***
            This program was produced by the
            CodeWizardAVR V1.24.6 Professional
            Automatic Program Generator
            © Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
            http://www.hpinfotech.com
            e-mail:office@hpinfotech.com

            Project :
            Version :
            Date : 8/13/2008
            Author : F4CG
            Company : F4CG
            Comments:


            Chip type : ATmega16
            Program type : Application
            Clock frequency : 12.000000 MHz
            Memory model : Small
            External SRAM size : 0
            Data Stack size : 256
            ************************************************** ***/

            #include <mega16.h>
            #include<delay.h>

            // Alphanumeric LCD Module functions
            #asm
            .equ __lcd_port=0x1B ;PORTA
            #endasm
            #include <lcd.h>
            #include <delay.h>
            #include <stdio.h>
            char buff[16];
            char a[6]={0,1,2,3,4,5};
            char b[6];
            int i;
            bit Flag;

            #define RXB8 1
            #define TXB8 0
            #define UPE 2
            #define OVR 3
            #define FE 4
            #define UDRE 5
            #define RXC 7

            #define FRAMING_ERROR (1<<FE)
            #define PARITY_ERROR (1<<UPE)
            #define DATA_OVERRUN (1<<OVR)
            #define DATA_REGISTER_EMPTY (1<<UDRE)
            #define RX_COMPLETE (1<<RXC)

            // USART Receiver buffer
            #define RX_BUFFER_SIZE 6
            char rx_buffer[RX_BUFFER_SIZE];

            #if RX_BUFFER_SIZE<256
            unsigned char rx_wr_index,rx_rd_index,rx_counter;
            #else
            unsigned int rx_wr_index,rx_rd_index,rx_counter;
            #endif

            // This flag is set on USART Receiver buffer overflow
            bit rx_buffer_overflow;

            // USART Receiver interrupt service routine
            interrupt [USART_RXC] void usart_rx_isr(void)
            {
            char status,data;
            status=UCSRA;
            data=UDR;
            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
            {
            rx_buffer[rx_wr_index]=data;
            if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
            if (++rx_counter == RX_BUFFER_SIZE)
            {
            rx_counter=0;
            rx_buffer_overflow=1;
            };
            };
            }

            #ifndef _DEBUG_TERMINAL_IO_
            // Get a character from the USART Receiver buffer
            #define _ALTERNATE_GETCHAR_
            #pragma used+
            char getchar(void)
            {
            char data;
            while (rx_counter==0);
            data=rx_buffer[rx_rd_index];
            if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
            #asm("cli")
            --rx_counter;
            #asm("sei")
            return data;
            }
            #pragma used-
            #endif

            // Standard Input/Output functions


            // Declare your global variables here
            void truyen(void)
            {
            lcd_clear();
            lcd_gotoxy(0,0);
            for(i=0;i<6;i++)
            {
            sprintf(buff,"%i",a[i]);
            lcd_puts(buff);
            delay_ms(50);
            putchar(a[i]);
            }
            Flag=1;
            PORTD.4=0;
            }
            void nhan(void)
            {
            lcd_clear();
            lcd_gotoxy(0,1);
            rx_buffer_overflow=0;
            for(i=0;i<6;i++)
            {
            b[i]=rx_buffer[i];
            }
            for(i=0;i<6;i++)
            {
            sprintf(buff,"%i",rx_buffer[i]);
            lcd_puts(buff);
            delay_ms(50);
            }
            Flag=0;
            PORTD.4=1;

            }
            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=Out Func3=In Func2=In Func1=In Func0=In
            // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T
            PORTD=0x00;
            DDRD=0x10;

            // 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: Timer 1 Stopped
            // Mode: Normal top=FFFFh
            // OC1A output: Discon.
            // OC1B output: Discon.
            // Noise Canceler: Off
            // Input Capture on Falling Edge
            // Timer 1 Overflow Interrupt: Off
            // Input Capture Interrupt: Off
            // Compare A Match Interrupt: Off
            // Compare B Match Interrupt: Off
            TCCR1A=0x00;
            TCCR1B=0x00;
            TCNT1H=0x00;
            TCNT1L=0x00;
            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: Off
            // INT1: Off
            // INT2: Off
            MCUCR=0x00;
            MCUCSR=0x00;

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

            // USART initialization
            // Communication Parameters: 8 Data, 1 Stop, No Parity
            // USART Receiver: On
            // USART Transmitter: On
            // USART Mode: Asynchronous
            // USART Baud rate: 9600
            UCSRA=0x00;
            UCSRB=0x98;
            UCSRC=0x86;
            UBRRH=0x00;
            UBRRL=0x4D;

            // 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")
            PORTD.4=1;
            lcd_putchar('>');
            truyen();
            while (1)
            {


            while(rx_buffer_overflow)
            {
            nhan();
            delay_ms(1000);
            truyen();
            delay_ms(1000);
            rx_buffer_overflow=0;
            }
            };
            }

            đây là at8:
            /************************************************** ***
            This program was produced by the
            CodeWizardAVR V1.24.6 Professional
            Automatic Program Generator
            © Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
            http://www.hpinfotech.com
            e-mail:office@hpinfotech.com

            Project :
            Version :
            Date : 8/13/2008
            Author : F4CG
            Company : F4CG
            Comments:


            Chip type : ATmega8
            Program type : Application
            Clock frequency : 12.000000 MHz
            Memory model : Small
            External SRAM size : 0
            Data Stack size : 256
            ************************************************** ***/

            #include <mega8.h>

            // Alphanumeric LCD Module functions
            #asm
            .equ __lcd_port=0x18 ;PORTB
            #endasm
            #include <lcd.h>
            #include<delay.h>
            char buff[16];
            int i;
            char b[6];

            #define RXB8 1
            #define TXB8 0
            #define UPE 2
            #define OVR 3
            #define FE 4
            #define UDRE 5
            #define RXC 7

            #define FRAMING_ERROR (1<<FE)
            #define PARITY_ERROR (1<<UPE)
            #define DATA_OVERRUN (1<<OVR)
            #define DATA_REGISTER_EMPTY (1<<UDRE)
            #define RX_COMPLETE (1<<RXC)

            // USART Receiver buffer
            #define RX_BUFFER_SIZE 6
            char rx_buffer[RX_BUFFER_SIZE];

            #if RX_BUFFER_SIZE<256
            unsigned char rx_wr_index,rx_rd_index,rx_counter;
            #else
            unsigned int rx_wr_index,rx_rd_index,rx_counter;
            #endif

            // This flag is set on USART Receiver buffer overflow
            bit rx_buffer_overflow;

            // USART Receiver interrupt service routine
            interrupt [USART_RXC] void usart_rx_isr(void)
            {
            char status,data;
            status=UCSRA;
            data=UDR;
            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
            {
            rx_buffer[rx_wr_index]=data;
            if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
            if (++rx_counter == RX_BUFFER_SIZE)
            {
            rx_counter=0;
            rx_buffer_overflow=1;
            };
            };
            }

            #ifndef _DEBUG_TERMINAL_IO_
            // Get a character from the USART Receiver buffer
            #define _ALTERNATE_GETCHAR_
            #pragma used+
            char getchar(void)
            {
            char data;
            while (rx_counter==0);
            data=rx_buffer[rx_rd_index];
            if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
            #asm("cli")
            --rx_counter;
            #asm("sei")
            return data;
            }
            #pragma used-
            #endif

            // Standard Input/Output functions
            #include <stdio.h>

            // Declare your global variables here
            void truyen()
            {
            lcd_clear();
            lcd_gotoxy(0,1);
            for(i=6;i>0;i--)
            {
            putchar(b[i]);
            lcd_putchar(b[i]+48);
            delay_ms(50);
            }
            PORTD.4=0;
            }
            void nhan()
            {
            lcd_clear();
            lcd_gotoxy(0,0);
            for(i=0;i<6;i++)
            {
            b[i]=rx_buffer[i];
            sprintf(buff,"%i",rx_buffer[i]);
            lcd_puts(buff);
            delay_ms(50);
            }
            rx_buffer_overflow=0;
            PORTD.4=1;
            }

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

            // Input/Output Ports initialization
            // 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
            // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
            // 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=Out Func3=In Func2=In Func1=In Func0=In
            // State7=T State6=T State5=T State4=0 State3=T State2=T State1=T State0=T
            PORTD=0x00;
            DDRD=0x10;

            // Timer/Counter 0 initialization
            // Clock source: System Clock
            // Clock value: Timer 0 Stopped
            TCCR0=0x00;
            TCNT0=0x00;

            // Timer/Counter 1 initialization
            // Clock source: System Clock
            // Clock value: Timer 1 Stopped
            // Mode: Normal top=FFFFh
            // OC1A output: Discon.
            // OC1B output: Discon.
            // Noise Canceler: Off
            // Input Capture on Falling Edge
            // Timer 1 Overflow Interrupt: Off
            // Input Capture Interrupt: Off
            // Compare A Match Interrupt: Off
            // Compare B Match Interrupt: Off
            TCCR1A=0x00;
            TCCR1B=0x00;
            TCNT1H=0x00;
            TCNT1L=0x00;
            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: Off
            // INT1: Off
            MCUCR=0x00;

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

            // USART initialization
            // Communication Parameters: 8 Data, 1 Stop, No Parity
            // USART Receiver: On
            // USART Transmitter: On
            // USART Mode: Asynchronous
            // USART Baud rate: 9600
            UCSRA=0x00;
            UCSRB=0x98;
            UCSRC=0x86;
            UBRRH=0x00;
            UBRRL=0x4D;

            // 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")
            PORTD.4=0;
            lcd_putchar('>');
            while (1)
            {
            delay_ms(100);
            while(rx_buffer_overflow)
            {
            nhan();
            delay_ms(1000);
            truyen();
            }
            };
            }

            Comment


            • Nguyên văn bởi vinhyen Xem bài viết
              mình đả làm rồi,nhưng khi chuyển qua thẻ program để nạp thì ô jtag tự động enable.không thay đổi được.
              Bác nạp bằng gì vậy, nếu nạp bằng trình có sẵn trong CV bản bỏ dấu tích trong ô Program Fusebit đi là xong chứ gì

              Comment


              • Có ai làm về ngắt time của AVR chưa giúp mình đoạn code này với, mình làm mãi mà không chạy được. Không biết là do đâu:
                #include <mega16.h>
                #include <delay.h>
                bit a;
                unsigned char count=0,i=0;
                interrupt [TIM1_OVF] void timer1_ovf_isr(void) //ngat xay ra sau 20ms
                {
                TCNT1H=0xF6; //giá tr? n?p l?i TCNT1L=0x3B;
                if (count>10){
                count=0;
                a=~a;
                PORTD.7=a;
                //goi ham can xu li sau 2s }
                }
                }
                void main(void){
                PORTA=0x00;
                DDRA=0x00;

                PORTB=0x00;
                DDRB=0x00;

                PORTC=0x00;
                DDRC=0x00;

                PORTD=0xFF;
                DDRD=0xFF;

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

                TCCR1B=0x03;
                TCNT1H=0xF6;
                TCNT1L=0x3B;
                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;

                ACSR=0x80;
                SFIOR=0x00;
                #asm("sei") //bat co cho phep ngat toan cuc neu khong thi khong co ngat xay ra
                while (1){
                PORTD.0=0;
                delay_ms(500);
                PORTD.0=1;
                delay_ms(500);
                }
                }


                Mục đích của mình la tạo ra 2 xung vuông có 2 tần số khác nhau tại hai chân.
                Last edited by jackychan; 20-09-2008, 11:43.

                Comment


                • Nguyên văn bởi jackychan Xem bài viết
                  Có ai làm về ngắt time của AVR chưa giúp mình đoạn code này với, mình làm mãi mà không chạy được. Không biết là do đâu:
                  #include <mega16.h>
                  #include <delay.h>
                  bit a;
                  unsigned char count=0,i=0;
                  interrupt [TIM1_OVF] void timer1_ovf_isr(void) //ngat xay ra sau 20ms
                  {
                  TCNT1H=0xF6; //giá tr? n?p l?i TCNT1L=0x3B;
                  if (count>10){
                  count=0;
                  a=~a;
                  PORTD.7=a;
                  //goi ham can xu li sau 2s }
                  }
                  }
                  void main(void){
                  PORTA=0x00;
                  DDRA=0x00;

                  PORTB=0x00;
                  DDRB=0x00;

                  PORTC=0x00;
                  DDRC=0x00;

                  PORTD=0xFF;
                  DDRD=0xFF;

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

                  TCCR1B=0x03;
                  TCNT1H=0xF6;
                  TCNT1L=0x3B;
                  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;

                  ACSR=0x80;
                  SFIOR=0x00;
                  #asm("sei") //bat co cho phep ngat toan cuc neu khong thi khong co ngat xay ra
                  while (1){
                  PORTD.0=0;
                  delay_ms(500);
                  PORTD.0=1;
                  delay_ms(500);
                  }
                  }

                  Mục đích của mình la tạo ra 2 xung vuông có 2 tần số khác nhau tại hai chân.
                  TIMSK=0 là sao nhỉ? Check lại datasheet xem.
                  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


                  • Đúng đấy, TIMSK mình kô nhâm thì là các cờ cho phép ngắt của các timer, sao lại bằng 0x00 thì ngắt gì xảy ra được?

                    Comment


                    • [IMG]D/:a1[/IMG]
                      Thanh ghi TIMSK là thanh ghi mặt nạ ngắt
                      Bít 1 – OCIEx: khi bít này được set lên bằng 1 thì cho phép ngắt so sánh
                      Bít 0 –TOIEX : Khi bít này được set lên bằng 1 thì cho phép ngắt tràn
                      Mình cũng đã thay các giá trị của thanh ghi này rồi mà vẫn không được.
                      VD TIMSK = 0x04 ;//Cho phép ngắt tràn time1

                      Comment


                      • TIMSK là thanh ghi mặt nạ.
                        Thanh ghi này có 8 bít
                        OCIT2 / TOIE2 / TICIE1 / OCIE1A / OCIE1B / TOIE1 / OCIE0 / TOIE0
                        TIOE0 //cho phép ngắt tràn time 0
                        TIOE1 //cho phép ngắt tràn time 1
                        TIMSK=0x04;// bít TOIE1 =1 //cho phép ngắt tràn time1

                        Comment


                        • Em mới bắt đầu tìm hiểu về AVR,các liền anh có thể chỉ hướng đi ngắn nhất được đúc rút từ kinh nghiệm của các anh cho em được không.
                          Em chưa biết chút xíu gì cả. Hì

                          Cư Dân Mới!!!!!!!!!
                          Sống Là Phải Chiến Đấu

                          Comment


                          • Nguyên văn bởi DTV47DH Xem bài viết
                            Em mới bắt đầu tìm hiểu về AVR,các liền anh có thể chỉ hướng đi ngắn nhất được đúc rút từ kinh nghiệm của các anh cho em được không.
                            Em chưa biết chút xíu gì cả. Hì

                            Cư Dân Mới!!!!!!!!!
                            đọc datasheet. Cài CodevisionAVR. Đọc file help và làm thử những chương trình từ dễ đến khó!

                            Comment


                            • Một vài ví dụ đơn giản cho bạn tham khao đây.
                              Attached Files
                              n
                              ĐT: 0986 492 489

                              Tham khảo:

                              Comment


                              • Thank! anh "vulongdt10".Đọc datasheet cần phải có trình tiếng anh cũng kha khá.Hì.Như anh hướng dẫn thì em đã tìm và dowload bản "CodeVisionAVR V2.03.4".Đây có phải bản anh nhắc tới không anh? Và chỉ nó đã đủ chưa anh?Em cần phải thực hiện các vd từ dễ tới khó,nhưng bi giờ em chưa biết tí tẹo tèo teo nào.Hì.Phiền anh nói cụ thể hơn cho em được không?

                                Cư Dân Mới!!!!!!!!!!!!!!1
                                Còn Nhiều Bỡ Ngỡ
                                Rất Mong Dược Sự Giúp Đỡ Của Các Liền Anh
                                Sống Là Phải Chiến Đấu

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X