Thông báo

Collapse
No announcement yet.

Lỗi khi truyền dữ liêu lên PC qua RS232

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

  • Lỗi khi truyền dữ liêu lên PC qua RS232

    Mình đang làm một đề tài. Thu tín hiệu âm thanh rồi đưa vào ATmega32 chuyển lên PC.
    lập trình trên covision
    nhưng khi chạy mô phỏng thi no hiên lên lai là các ky tư.không biết tại sao.Bác nao biết giúp mình chỉnh sủa cái????/




    Đây là đoan code của tớ

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

    Project :
    Version :
    Date : 3/16/2010
    Author : F4CG
    Company : F4CG
    Comments:


    Chip type : ATmega32
    Program type : Application
    Clock frequency : 8.000000 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 512
    ************************************************** ***/

    #include <mega32.h>

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


    #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)

    #include <stdio.h>



    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    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

    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];

    #if TX_BUFFER_SIZE<256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif

    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
    {
    --tx_counter;
    UDR=tx_buffer[tx_rd_index];
    if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    };
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli")
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
    tx_buffer[tx_wr_index]=c;
    if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
    ++tx_counter;
    }
    else
    UDR=c;
    #asm("sei")
    }
    #pragma used-
    #endif

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

    #include <delay.h>

    #define FIRST_ADC_INPUT 0
    #define LAST_ADC_INPUT 7
    unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
    #define ADC_VREF_TYPE 0x20


    // Declare your global variables here
    unsigned int temp;


    void hexa(char c)
    {
    char h[17] = "0123456789ABCDEF";
    printf("%c%c", h[c>>4], h[c&0x0F]);
    }


    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=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTB=0x00;
    DDRB=0xFF;

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

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

    // 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=0xD8;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;

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

    // ADC initialization
    // ADC Clock frequency: 1000.000 kHz
    // ADC Voltage Reference: AREF pin
    // Only the 8 most significant bits of
    // the AD conversion result are used
    ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
    ADCSRA=0xCB;

    // LCD module initialization
    lcd_init(16);

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

    while (1)
    {
    // Place your code here
    char c;
    printf("\nNhap kt: ");
    scanf("%c", &c);
    hexa(c);


    if(rx_counter >0);
    temp=adc_data[0];

    PORTD=temp;
    putchar(temp);
    delay_ms(10);

    };
    }

  • #2
    Mô phỏng qua protues không ra đúng ký tự là BT, lỗi là do mô phỏng cổng COM232. Bỏ cái cổng com đi thay bằng 2 con NOT nối tiếp nhau là mô phỏng được, Có 1 cao thủ mới bày cho tôi cách này, mô phỏng được rồi.

    Comment


    • #3
      Kiểm tra lại xung của chip.Mặc định là 1M.

      Comment


      • #4
        Nhưng mình truyền lên lại là các ký tự.the mạch vẽ lại ntn vây bạn? hay tần số thay đổi cho chip ntn? nói rõ cho mình vói?

        Comment


        • #5
          Mạch như bình thường thôi.Nhưng trong properties của chip,chọn xung là 8MHz

          Comment


          • #6
            Bạn viết lại cái chương trình cho tường minh:
            1. chỉ một lệnh putchar thì có cần ngắt thu, ngắt phát? Vừa không có tác dụng vừa rối
            2. chtr lấy adc 8bit, phát lại qua uart thì mặc nhiên máy tính hiển thị ra ký tự bảng mã ascii thôi, không có gì sai cả. Nếu muốn hiển thị thành số thì phải chuyển đổi thành string (123->'1','2','3') trước khi chuyển
            Đã bỏ nghề về quê chăn gà...

            Comment


            • #7
              nếu không có ngắt thi làm sao chạy được bạn?ko sử dung UART thi sao truyền lên dc PC? Lệnh string dung ntn vây?

              Comment


              • #8
                Các bước cơ bản để truyền một khối dữ liệu lên máy tính như sau:

                1. Thiết lập cổng UART cho phép truyền đi, tốc độ truyền.
                2. Đóng gói một khung truyền thông chứa dữ liệu lên máy tính. ( có thể lưu trong một mảng cho dễ)
                3. Truyền cái gói này ra cổng UART
                4. Thế là truyễn xong dữ liệu ra máy tính.
                Còn muốn mô phỏng cũng được. Dùng Proteus và cổng com ảo mô phỏng. Có thể mắc mạch Max232 nhưng chú ý mắc nối tiếp thêm một con NOT vào hai chân TXD, RXD của AVR.
                Có thể dùng terminal để kiểm tra nhận dữ liệu
                Một ví dụ nhỏ:

                Code:
                void send_pc(void)
                {    
                    unsigned int checksum;
                    putchar(0xAB);      //0
                    putchar(0xBC);      //1
                    putchar(Data1);  //2
                    putchar(Data2);  //3
                    putchar(Data3);  //4
                    putchar(Data4);  //5
                    checksum = (unsigned int)((unsigned int)(Data1) + 
                                (unsigned int)(Data2) + (unsigned int)(Data3)+ (unsigned int)(Data4))%100;
                    putchar((unsigned char)checksum); 
                    
                }
                n
                ĐT: 0986 492 489

                Tham khảo:

                Comment


                • #9
                  minhieu giải thích rõ code được không?

                  Comment


                  • #10
                    Nguyên văn bởi kebitmat_f Xem bài viết
                    minhieu giải thích rõ code được không?
                    Code đó là bạn minhhieu dùng codevision để viết chương trình.
                    *về phần cứng:như các mạch giao tiếp các chíp khác với máy tính ,gồm 1AVR+1MAx232 +vài con R,c..
                    *về phần mềm:khai báo UART trong mục codeWinzarAVR,chú ý đồng bộ rồi chỉ việc dùng hàm putchar() và getchar() để truyền/nhận thôi.
                    Mình cũng vừa test mạch này mà.
                    Chúc thành công!
                    Gian Khó Cuộc Đời Nuôi Ta Lớn!
                    Giang Hồ Đẫm Máu Dạy Ta Khôn!

                    (@_@)______________(@_@)

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X