Chào các bác .
Em mới học AVR và làm thử mạch giao tiếp máy tính qua cổng COM, nhưng mãi nó vẫn không chạy.Em nghĩ code đã Ok rồi còn phần em đang nghi ngờ là dùng thạch anh ngoài .Em dùng con 7,3728Mhz cho nó chuẩn , và giá trị UBRRL = 2F (47). Nhưng em dùng mạch vạp AVR 910 và cái AVRProg chỉ có các chế độ như vầy
Và em chọn là Ext XTAL,Medium Frequency , sau đó em Write và nạp code --> nó không chạy . và em thấy là dù em chọn là Medium Frequency hay High Frequency thì test bằng mấy con LED , chip vẫn chạy OK
.Em tưởng set sai thì không chạy chứ ?
Đây là cái mạch của em :
Và đây là code :
EM cũng đã tham khảo code của các bác trên này và code em viết cũng chẳng khác gì .Em đoán do mạch em sai hoặc set fuse sai .
Em mới tìm hiểu AVR nên nếu câu hỏi gà quá các bác đừng cười nhé.
Mong các bác giúp em.
Thanks nhiều !
Em mới học AVR và làm thử mạch giao tiếp máy tính qua cổng COM, nhưng mãi nó vẫn không chạy.Em nghĩ code đã Ok rồi còn phần em đang nghi ngờ là dùng thạch anh ngoài .Em dùng con 7,3728Mhz cho nó chuẩn , và giá trị UBRRL = 2F (47). Nhưng em dùng mạch vạp AVR 910 và cái AVRProg chỉ có các chế độ như vầy
Và em chọn là Ext XTAL,Medium Frequency , sau đó em Write và nạp code --> nó không chạy . và em thấy là dù em chọn là Medium Frequency hay High Frequency thì test bằng mấy con LED , chip vẫn chạy OK
.Em tưởng set sai thì không chạy chứ ?
Đây là cái mạch của em :
Và đây là code :
Code:
#include <mega16.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x18 ;PORTB #endasm #include <lcd.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) // 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> void main(void) { char test; char lcd_buffer[10]; State0=T PORTA=0x00; DDRA=0x00; State0=T PORTB=0x00; DDRB=0x00; State0=T PORTC=0x00; DDRC=0x00; State0=T PORTD=0x01; DDRD=0x02; TCCR0=0x00; TCNT0=0x00; OCR0=0x00; 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; MCUCR=0x00; MCUCSR=0x00; 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=0x2F; ACSR=0x80; SFIOR=0x00; // LCD module initialization lcd_init(16); // Global enable interrupts #asm("sei") lcd_clear(); lcd_gotoxy(0,0); lcd_putsf("RS232"); while (1) { lcd_gotoxy(0,1); // lcd_putsf("RS"); // test=getchar(); // putchar(test); putchar('a'); }; }
Em mới tìm hiểu AVR nên nếu câu hỏi gà quá các bác đừng cười nhé.
Mong các bác giúp em.
Thanks nhiều !
Comment