Thông báo

Collapse
No announcement yet.

Cùng Duyphi bắt đầu học lập trình AVR

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

  • mình là beginer trong AVR ...đang tập viết chuơng trình bằng ngôn ngữ Asm...huynh nào có 1 số vd đơn giản về led đơn thi post lên cho mình tham khảo với.....thanks

    Comment


    • mình dùng con mega8535...sao viết chuơng trình bằng asm mà có lệnh gọi chuơng trình con là nó không chạy....mà cũng với chuơng trình đó , nếu viết trực tiếp ( k có lệnh rcall ) thì nó chạy ngon lành lun...kỳ quá đi...huynh nào giải thích giúp được không....

      Comment


      • Nguyên văn bởi NGHICH THIEN Xem bài viết
        mình dùng con mega8535...sao viết chuơng trình bằng asm mà có lệnh gọi chuơng trình con là nó không chạy....mà cũng với chuơng trình đó , nếu viết trực tiếp ( k có lệnh rcall ) thì nó chạy ngon lành lun...kỳ quá đi...huynh nào giải thích giúp được không....
        chắc là ctc con có vấn đề hoặc là lệnh con mega8535 ko dùng lện rcall dc
        pác thu dua dt lên xem.em cung dang lap trình bằng hợp ngữ mà,có j thì trao đổi

        Comment


        • Hỏi về lệnh chia trong AVR ?
          trong 8051 có lệnh chia:
          vd:
          mov A,#30
          mov B,#10
          div A,B
          vậy trong AVR có lệnh chia tương tự như thế không,xin chỉ giúp

          Comment


          • lệnh chia trong 8051 là
            mov A,#30
            mov B,#10
            div AB

            Comment


            • Nguyên văn bởi NGHICH THIEN Xem bài viết
              mình là beginer trong AVR ...đang tập viết chuơng trình bằng ngôn ngữ Asm...huynh nào có 1 số vd đơn giản về led đơn thi post lên cho mình tham khảo với.....thanks
              Em nên xem lại 1 số bài mà các bạn đã post ở trên, trên đó cũng có nhiều ví dụ đơn giản về led và LCD dùng asm.

              Comment


              • Đây là 1 số các ví dụ về LED:
                Code:
                /* Moving LED example
                   Chip: ATmegaS8515
                   Memory Model: SMALL
                   Data Stack Size: 128 bytes
                
                   8 LEDs are connected between the PORTC
                */
                
                // I/O register definitions for AT90S8515
                #include <mega8515.h>
                
                // quartz crystal frquency [Hz]
                #define xtal 3686400
                // moving LED frequency [Hz]
                #define fmove 2
                
                // the LED on PORTC output 0 will be on
                unsigned char led_status=0xfe;
                
                // TIMER1 overflow interrupt service routine
                // occurs every 0.5 seconds
                
                interrupt [TIM1_OVF] void timer1_overflow(void)
                {
                // preset again TIMER1
                TCNT1=0x10000-(xtal/1024/fmove);
                // move the LED
                led_status<<=1;
                led_status|=1;
                if (led_status==0xff) led_status=0xfe;
                // turn on the LED
                PORTC=led_status;
                }
                
                void main(void)
                {
                // set the I/O ports
                // all PORTC pins are outputs
                DDRC=0xff;
                // turn on the first LED
                PORTC=led_status;
                
                // Timer/Counter 1 initialization
                // Clock source: System Clock
                // Clock value: 3.600 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;
                TCNT1=0x10000-(xtal/1024/fmove);
                ICR1H=0x00;
                ICR1L=0x00;
                OCR1AH=0x00;
                OCR1AL=0x00;
                OCR1BH=0x00;
                OCR1BL=0x00;
                
                // External Interrupt(s) initialization
                // INT0: Off
                // INT1: Off
                // INT2: Off
                MCUCR=0x00;
                EMCUCR=0x00;
                
                // Timer(s)/Counter(s) Interrupt(s) initialization
                TIMSK=0x80;
                
                // global enable interrupts
                #asm
                    sei
                #endasm
                
                // the rest is done by TIMER1 overflow interrupts
                while (1);
                }

                Comment


                • Vì 1 số bạn gởi thư về hỏi tôi về chuyên mục AVR này. Thật sự thì tôi cũng như nhớ rõ là có luồng này, do đó nếu các bạn có thắc mắc thì email rõ địa chỉ để tiện việc tôi trả lời cho các bạn.

                  Tiếp theo:


                  /*********************************************
                  Project : Clignotement d'une Led
                  Date : 12/12/2003
                  Auteur : Angeliz
                  Signe particulier : Autodidacte

                  Microcontrôleur : ATmega8535
                  Quartz : 8,000000 MHz
                  Memory model : Small
                  External SRAM size : 0
                  Data Stack size : 128
                  Compilateur : CodeVisionAvr

                  Led sur bit 0 PORTB anode au 5V
                  résistance de 1K en série.
                  *********************************************/

                  #include <mega16.h>

                  #define TOIE0 0
                  #define Led PORTB.0
                  #define bit_set(var,bitno) ((var) |= 1 << (bitno))
                  #define bit_clr(var,bitno) ((var) &= ~(1 << (bitno)))


                  // Declare your local variables here
                  unsigned char cTime, cSignal;

                  // Timer 0 interruption de débordement de TCNT0
                  // Interruption toutes les 32768mS
                  // cSignal passe à 1 toute les 524mS (16*32768)
                  interrupt [TIM0_OVF] void timer0_overflow(void)
                  {
                  if(cTime++ >=15) cSignal=1;
                  }

                  void main(void)
                  {
                  PORTB=0x00; // configuration du portB à l'état haut
                  DDRB=0x01; // configuration du portB en sortie
                  TCCR0=0x05; // pas de TCNT0 à 128µS Clock value: 7,813 kHz

                  PORTA=0xFF;
                  DDRA=0xFF;

                  // Global interruption activé
                  #asm("sei")
                  bit_set(TIMSK,TOIE0); // configure TOIE0 à 1, autorise interruption
                  cSignal=0; // variable indiquant que le débordement doit être traité si 1
                  cTime=0; // variable de temps 1 unité = 32768mS

                  while (1)
                  {
                  if(cSignal)
                  {
                  cSignal=0;
                  cTime=0;
                  if(Led) Led=0; // Led ON
                  else Led=1; // Led OFF
                  }
                  }
                  }

                  Comment


                  • LCD counter!

                    /*********************************************
                    Compiler : CodeVision
                    Hardware : AVR-Ctrl (with Display)
                    Chip type : AT90S8535
                    Clock frequency : 8,000000 MHz
                    Memory model : Small
                    Internal SRAM size : 512
                    External SRAM size : 0
                    Data Stack size : 128
                    *********************************************/

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

                    // Alphanumeric LCD Module functions
                    #asm
                    .equ __lcd_port=0x1b
                    #endasm
                    #include <lcd.h>

                    // Declare your global variables here
                    unsigned int Counter = 0;

                    // Timer 0 overflow interrupt service routine
                    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                    {
                    // Place your code here
                    Counter++; // incr.

                    }


                    void main(void)
                    {
                    // Declare your local variables here
                    char text[16]; // Buffer

                    // Input/Output Ports initialization
                    // Port A
                    PORTA=0x00;
                    DDRA=0x00;

                    // Port B
                    PORTB=0x00;
                    DDRB=0x00;

                    // Port C
                    PORTC=0x00;
                    DDRC=0x00;

                    // Port D
                    PORTD=0x00;
                    DDRD=0x00;

                    // Timer/Counter 0 initialization
                    // Clock source: System Clock
                    // Clock value: 7,813 kHz
                    // Mode: Output Compare
                    // OC0 output: Disconnected
                    TCCR0=0x05;
                    TCNT0=0x00;

                    // Timer/Counter 1 initialization
                    // Clock source: System Clock
                    // Clock value: Timer 1 Stopped
                    // Mode: Output Compare
                    // OC1A output: Discon.
                    // OC1B output: Discon.
                    // Noise Canceler: Off
                    // Input Capture on Falling Edge
                    TCCR1A=0x00;
                    TCCR1B=0x00;
                    TCNT1H=0x00;
                    TCNT1L=0x00;
                    OCR1AH=0x00;
                    OCR1AL=0x00;
                    OCR1BH=0x00;
                    OCR1BL=0x00;

                    // Timer/Counter 2 initialization
                    // Clock source: System Clock
                    // Clock value: Timer 2 Stopped
                    // Mode: Output Compare
                    // OC2 output: Disconnected
                    TCCR2=0x00;
                    ASSR=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=0x01;

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

                    // LCD module initialization
                    lcd_init(16);

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

                    lcd_putsf("Displaytest");


                    while (1)
                    {
                    sprintf(text, "Counter = %i", Counter); // fill buffer
                    lcd_gotoxy(0,1); // cursor at 0,1
                    lcd_puts(text); // output text
                    lcd_gotoxy(15,0);
                    lcd_putchar(Counter/5); // display ASCII

                    };
                    }

                    Comment


                    • Giao tiếp Vi Điều Khiển với SDRAM máy tính
                      Các Sư huynh ơi! Có ai có tài liệu j về giao tiếp VĐK với SDRAM máy tính ko vậy, có thể chỉ giáo với ko. Mình đang làm đồ án, muốn mở rộng bộ nhớ RAM mà ko biết nguyên lý của SDRAM sao hết. Sắp đến hạn rồi, mong đc giúp đỡ!
                      Mail mình là: nguyenthesinh_ts@yahoo.com
                      Nguyen Sinh_ 01689.660.922

                      Comment


                      • Bạn Duy Phi giúp mình nhé !
                        mình dang bị mắc về ghi dữ liệu vào eefroom và đọc dữ liệu từ eefroom ra và không hiểu tại sao chỉ ghi hoăc
                        đọc tại địa chỉ 0x0000 và không thể ghi được vào các địa chỉ khác ( mình cho chạy thử trên ISSI 7.4)
                        chương trình ghi như sau:
                        GHI_DLIEU_VAO_EEPROM:
                        LDI R26,0X05 ;NAP DIA CHI BYTE THAP = 0X05
                        LDI R27,0X00 ;NAP DIA CHI BYTE CAO = 0X00
                        LDI R16,0X02 ;GIA TRI GHI = 0X02
                        EEPROM_GHI:
                        SBIC EECR,EEWE ;CHO CHO BIT EEWE VE 0
                        RJMP EEPROM_GHI
                        CLI ;CAM CAC NGAT

                        OUT EEARH,R27 ;DUA DIA CHI BYTE CAO VAO EEAR
                        OUT EEARL,R26 ;DUA DIA CHI BYTE THAP VAO EEAR


                        OUT EEDR,R16 ;GHI GIA TRI VAO EEDR

                        SBI EECR,EEMWE ;SET BIT EEMWE LEN1
                        SBI EECR,EEWE ;SET EEWE LEN 1 DE BAT DAU CHO GHI EEPROM
                        SEI ;CHO PHEP CAC NGAT TRO LAI HOAT DONG
                        RET
                        khi mình kiểm tra trên issi trong eefroom chỉ thấy tại địa chỉ 0x0000 ghi giá trị 0x002 trong khi mình đang cho
                        ghi tại địa chỉ 0x0005 . và đọc ra cũng chỉ đọc tại địa chỉ đó và mình cho thay đổi các kiểu địa chỉ cũng vậy mình không hiểu tại sao hay chương trình mình viết sai hay do tại issi vì mình chưa làm mạch thực tế
                        Bạn giúp mình với !
                        Mong hồi âm . Cảm ơn bạn rất nhiều

                        Comment


                        • Mình đang viết cho ATMEGA 32

                          Comment


                          • Các loại AVR đều giống nhau về cách ghi/doc EEPROM, chỉ khác dung lượng. Tại sao bạn không làm mạch thử?

                            Comment


                            • Cho hỏi, nạp atmega8 bằng av910, khi chọn Xtal có 2 chế độ giống nhau: Nhưng chế độ 1 nạp ko sao, nhưng nếu chọn chế độ 2 thì không nạp được nữa. Tuy nhiên 2 chế độ này họ viết y như nhau là sao?

                              Comment


                              • mấy bác nói thêm về GLCD thêm đi,trong codevision avr chi chon line đến 40 là hết mà dùng GLCD là 128x64 nên khi chọn line ko đủ và ai có kinh nghiệm thì chỉ giáo cho mình nhé

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X