Thông báo

Collapse
No announcement yet.

Cho mình hỏi về các hàm printf trong AVR Studio

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

  • Cho mình hỏi về các hàm printf trong AVR Studio

    Mình đang gặp một vấn đề với hàm "printf()" trong AVR studio. Mình muốn in chữ "hello" lên terminal nhưng làm hoài ko được. Mình quen lập trình bên Code vision có việc nên chuyển qua làm bên AVR Studio nhưng mà ko ngờ khó vậy. Các bạn giúp mình nhé. Mình Post code cho các bạn xem thử sai ở đâu nhé. cảm ơn các bạn rất nhiều.
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdio.h>

    void init_usart (void)
    {
    UCSRA=0x00;
    UCSRB=0x18;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;
    }

    void main (void)
    {
    DDRD=0x02;
    PORTD=0x03;
    init_usart();

    while(1)
    {
    printf("hello");
    }
    }

  • #2
    Nguyên văn bởi trch Xem bài viết
    Mình đang gặp một vấn đề với hàm "printf()" trong AVR studio. Mình muốn in chữ "hello" lên terminal nhưng làm hoài ko được. Mình quen lập trình bên Code vision có việc nên chuyển qua làm bên AVR Studio nhưng mà ko ngờ khó vậy. Các bạn giúp mình nhé. Mình Post code cho các bạn xem thử sai ở đâu nhé. cảm ơn các bạn rất nhiều.
    Theo mình bạn phải viết lại hàm putchar()
    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


    • #3
      do mình thấy có hàm printf() hỗ trợ sẵn nên muốn dùg luôn mà ko cần viết lại hàm. Có bạn nào biết lỗi ở đâu ko?

      Comment


      • #4
        Nguyên văn bởi trch Xem bài viết
        do mình thấy có hàm printf() hỗ trợ sẵn nên muốn dùg luôn mà ko cần viết lại hàm. Có bạn nào biết lỗi ở đâu ko?
        Viết lại hàm putchar khẩn cấp!

        Bạn thử hình dung thế này nhé: Con AVR của ATMEL có nhiều loại, có con có đến 2 cổng serial rs232. Vậy thì bạn nghĩ hàm putchar mặc định trong stdio.h nó sẽ gửi dữ liệu ra cổng nào khi bạn gọi nó? Vậy nên nếu bạn muốn gửi dữ liệu ra cổng serial số 1 chẳng hạn, đương nhiên bạn phải viết lại hàm đó rồi.

        Bản thân thư viện stdio.h cũng thế, cái tên của nó cũng chẳng nói lên một thiết bị vào ra cụ thể nào cả, mặc dù ở trên PC, mặc định nó là các cửa sổ console. Và đối với nhiều ứng dụng nhúng, việc định nghĩa lại một số hàm trong đó là điều cần làm.

        Comment


        • #5
          với codeVision thì nó lấy USART0 làm mặc định cho các hàm putchar, getchar..., nhưng nhìn code bạn viết thì có lẻ bạn đang dùng WinAVR complier, thằng này ngày xưa có thử xài, để xài putchar, getchar bạn ko cần viết lại gì cả, chỉ cần setup cấu hình cho putchar, ... là được ( nó cung cấp sẵn hàm để mình config luôn, lâu quá rồi ko nhớ, nhưng nói chung là ko cần viết lại).

          Comment


          • #6
            mình đã tạo các hàm putchar(); và getchar() nhưng nó vẫn ko giao tiếp máy tính dc. Bạn nào từng làm cái này cho ý kiến nhé; Code dưới đây:
            #include <avr/io.h>
            #include <stdio.h>
            #include <util/delay.h>
            #include <avr/pgmspace.h>
            unsigned char ReceiveByte( void );
            void TransmitByte( unsigned char data );
            void init_usart (void);

            void init_usart (void)
            {
            //set buad rate to 9600
            //XTAL=110592
            UBRRH = 0x00;
            UBRRL = 0x33;

            // enable receiver and transmitter
            UCSRB = (1<<RXEN)|(1<<TXEN);

            //set frame format 8bit 1stop no parity
            // asynchronous operation
            UCSRC = (1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(0<<USBS )|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
            }

            int main (void)
            {
            char k;
            init_usart();
            while(1)
            {
            k=getchar();
            putchar(k);
            }
            }
            unsigned char ReceiveByte( void )
            {
            while ( !(UCSRA & (1<<RXC)) ) /* Wait for incomming data */
            ; /* Return the data */
            return UDR;
            }

            void TransmitByte( unsigned char data )
            {
            while ( !(UCSRA & (1<<UDRE)) )
            ; /* Wait for empty transmit buffer */
            UDR = data; /* Start transmittion */
            }
            thanks nhiều nhiều!

            Comment


            • #7
              Nguyên văn bởi trch Xem bài viết
              mình đã tạo các hàm putchar(); và getchar() nhưng nó vẫn ko giao tiếp máy tính dc. Bạn nào từng làm cái này cho ý kiến nhé; Code dưới đây:

              thanks nhiều nhiều!
              Oh my goodness. Bạn phải thay tên 2 hàm ReceiveByte và TransmitByte bằng getchar và putchar tương ứng.
              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


              • #8
                hic, sơ ý quá. Thank nhiều nhiều.

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X