Posted to tcl by stever at Sat Oct 17 23:29:52 GMT 2009view raw

  1. //#include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. //#include <stdlib.h>
  4. //#include <stdio.h>
  5. #ifndef F_CPU
  6. #define F_CPU 2000000
  7. #endif
  8.  
  9. #define MYBSEL 12
  10. volatile uint16_t receivedData;
  11.  
  12. void USART_Receive(void)
  13. {
  14. /* Receive one char. */
  15. /* Wait until data received or a timeout.*/
  16. while ( !( USARTC0.STATUS & USART_RXCIF_bm) );
  17. receivedData = USARTC0.DATA;
  18. }
  19.  
  20.  
  21. void USART_Transmit(unsigned char data)
  22. {
  23. /* Wait for empty transmit buffer */
  24. //while ( !( UCSR0A & (1<<UDRE0)) )
  25. while ( !( USARTC0.STATUS & USART_DREIF_bm) )
  26. ;
  27. /* Put data into buffer, sends the data */
  28. USARTC0.DATA = data;
  29. //UDR0 = data;
  30. }
  31.  
  32.  
  33. void USART_Init(unsigned int bsel) {
  34. int bscale = 0;
  35.  
  36. /* Set baud rate */
  37. USARTC0.BAUDCTRLA = (unsigned char)(bsel & 0xFF);
  38. USARTC0.BAUDCTRLB = ((unsigned char)(bscale & 0x0F)<< 4) | ((unsigned char)(bsel >> 8) & 0x0F);
  39. //UBRR0H = (unsigned char)(ubrr>>8);
  40. //UBRR0L = (unsigned char)ubrr;
  41.  
  42. /* Set frame format: 8data, 1 stop bit */
  43. USARTC0.CTRLC = (USARTC0.CTRLC & ~USART_CHSIZE_gm) | USART_CHSIZE_8BIT_gc;
  44. //UCSR0C = (3<<UCSZ00);
  45.  
  46. /* Enable receiver and transmitter */
  47. USARTC0.CTRLB = (USART_RXEN_bm | USART_TXEN_bm);
  48. //UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  49. }
  50.  
  51.  
  52. int main(void) {
  53.  
  54. USART_Init(MYBSEL);
  55.  
  56. PORTC.DIRSET = PIN3_bm; // PC3 (TXD0) as output.
  57.  
  58. PORTC.DIRCLR = PIN2_bm; // PC2 (RXD0) as input.
  59.  
  60.  
  61. USART_Transmit('T');
  62. USART_Transmit('e');
  63. USART_Transmit('s');
  64. USART_Transmit('t');
  65. USART_Transmit('\r');
  66. USART_Transmit('\n');
  67.  
  68. while(1) {
  69. USART_Receive();
  70. USART_Transmit(receivedData);
  71. }
  72.  
  73. return 0;
  74. }
  75.  
  76.  
  77.