Thông báo

Collapse
No announcement yet.

Lỗi ATmega16 kết nối PC qua MAX232

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

  • Lỗi ATmega16 kết nối PC qua MAX232

    Nhờ các bác giúp giùm, cái con ATmega16 của em nó chạy điên cuồng rồi. E có một đoạn code để thử con ATmega16 trên AVRBoard của SaigonTech:

    Code:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V1.25.7 beta 5 Professional
    Automatic Program Generator
    © Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date    : 9/1/2007
    Author  : F4CG                            
    Company : F4CG                            
    Comments: 
    
    
    Chip type           : ATmega16
    Program type        : Application
    Clock frequency     : 4.000000 MHz
    Memory model        : Small
    External SRAM size  : 0
    Data Stack size     : 256
    *****************************************************/
    
    #include <mega16.h>
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
       char k;
    // 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=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 
    PORTD=0x00;
    DDRD=0x00;
    
    // 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=0x18;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x19;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    while (1)
          {
          // Place your code here
          printf("Test UART%u\n\r", 0);
          k = getchar();
          k++;
          printf("%c \n", k);
    
          };
    }
    Em đã kiểm tra lại các thông số, các kết nối và cáp RS232 nhưng mà chip vẫn chạy điên cuồng. Cái này là em lưu lại từ Terminal của CodeVision:

    Code:
    А‚  ÿ‚  ÷‚•þ’•ÿç‚  ‡…ç‚  „…þ‚Dþÿ#‚$  …ñç‚  †ÿ`‚`ÿç‚$  ‡‚ „‚ àÿ¯Ä‚ qÿ‚þ‚ÿ‚  ×…ç‚ QÄ…þ‚ ù‡‚$  …0} …‚þAþ‚ ÿ †‚$ …þАĂ  ÷‚•þ‚Tÿ¿þ”…ç‚  „þ‚4pû‡ñç‚  ‡ÿþ‚ qÿð †‚4 àÿÄ‚ àÿ‚•þõ‚  Ä…ç‚  ÔþÄ÷‡‚$  …0ç‚  ‡0ÿþçþ „‚ ì ‡‚$ ïÄç‚Ô‚þ‚t‚  „…ç‚`þ‚4`ÿ‡‚  ‡ñÄ‚ Aþ‚ ÿ „‚ qðç‚$  Ä‚4  ü‚þ‚•ç‚  „…ç‚$  …þ‚4þÿ‡ †‚$ ñç‚  ‡ÿþ‚`ÿ „‚ è ‡‚$ àÄ‚4 aÿ‚4  „‚$ •þ‚þÝç‚$ à…þ‚4 ÿ‡‚4  …4ç‚  ‡Aþ‚ ÿ ‡‚ ø ‡‚$þАç‚4  ü‚þ‚t5•þÐåÄ‚$  …þ‚xÿ‡ç‚tþñá‚  ‡ÿþç‚4 q7אû †‚ àç‚4 àü‚þõ7•þðç‚þÄ‚  ÕÒóáÿ‡‚4  …0á‚  ‡0ÿþÿç‚  …º †‚ Аÿ‚þ‚T‚•þðç‚tþ
    Các bác giúp em với, thanks các bác trước!

  • #2
    while (1)
    {
    // Place your code here
    printf("Test UART%u\n\r", 0);
    k = getchar();
    k++;
    printf("%c \n", k);

    };
    }
    Kí tự loằng ngoằng thế kia có lẽ là bạn sai BaudRate. Bạn coi lại BaudRate xem xem Baud của máy tính đã đúng chưa, cấu hình thạch anh của CodeVision với mạch thật của bạn. Hồi trc thằng bạn mình dính vụ thạch anh cấu hình 4Mhz, hàn mạch thật 8Mhz, set Baud nhầm vẫn nhận đúng vì nó để Baud = 2 lần Baud thật.
    Với lại đọc lại code của bạn, thì thấy là k tăng liên tục kể cả ko có gì gửi lên (k = NULL) thì kí tự gửi ra màn hình vẫn gửi, nó tăng lớn quá tự tràn thôi..., đây cũng có thể là 1 nguyên nhân gây kí tự chạy điên cuồng trên màn hình.

    Comment


    • #3
      cái này thì bạn nên kiểm tra phần cứng, program các fuse bit để mega16 chạy đúng 4Mhz. nếu sử dụng thạch anh thì hàn đúng 4Mhz và set cho chip chạy ở chế độ thạch anh ngoài. nếu sử dụng nguồn dao động nội thì cũng cần set lên 4Mhz, vì mặc định thì chip mới mua về sẽ hoạt động ở tần số 1Mhz bằng nguồn dao động nội. (xem phần System Clock and Clock Options trong datasheet của nó để mà set cho đúng).
      về phần mềm: thì chip sẽ chạy dòng này "printf("Test UART%u\n\r", 0);" và gửi ra USART. sau đó sẽ chờ nhận data về, "k = getchar();", chip sẽ chờ đến khi nào nhận được data mới thôi. nếu không nhận được data nào thì nó sẽ đứng chờ ở đây. ( vì vậy bạn không phải lo là sẽ bị tràn biến k).

      vài dòng góp ý. thân chào!

      Comment

      Về tác giả

      Collapse

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

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

      Collapse

      Đang tải...
      X