You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
| #include <avr/interrupt.h>
 | |
| #include "uart.h"
 | |
| #include "fifo.h"
 | |
| 
 | |
| Fifo_t uart0_rx_buffer = {{}, 0, 0};
 | |
| Fifo_t uart0_tx_buffer = {{}, 0, 0};
 | |
| 
 | |
| const uint16_t bsel = 208;
 | |
| const int8_t bscale = 0;
 | |
| 
 | |
| //FILE uart_output = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
 | |
| 
 | |
| void init_uart(void){
 | |
|     USARTD0_CTRLC= USART_CHSIZE0_bm | USART_CHSIZE1_bm;
 | |
|     //USARTD0_BAUDCTRLB = 0;
 | |
|     //USARTD0_BAUDCTRLA = 0;
 | |
|     USARTD0.BAUDCTRLA = bsel;
 | |
|     USARTD0.BAUDCTRLB = 0 | (bsel >> 8) | (bscale << USART_BSCALE0_bp);
 | |
|     USARTD0_CTRLB = USART_TXEN_bm | USART_RXEN_bm;
 | |
| 
 | |
|     //USARTD0_CTRLA=USART_RXCINTLVL0_bm;
 | |
| 
 | |
|     PORTD_OUTSET = PIN3_bm;
 | |
|     PORTD_DIRSET = PIN3_bm; 
 | |
|     PORTD_OUTCLR = PIN2_bm;
 | |
|     PORTD_DIRCLR = PIN2_bm;
 | |
| 
 | |
|     //stdout = &uart_output;
 | |
| }
 | |
| 
 | |
| void uart_putchar(char c, FILE *stream)
 | |
| {
 | |
|     fifo_push(&uart0_tx_buffer, c);
 | |
|     USARTD0_CTRLA |= USART_DREINTLVL_LO_gc;
 | |
| }
 | |
| 
 | |
| //void puts(char * s){
 | |
| //    while (*s) {
 | |
| //        putchar(*s++);
 | |
| //    }
 | |
| //}
 | |
| 
 | |
| char get_uart0_char(void)
 | |
| {
 | |
|     while(1){
 | |
|         char buffer;	
 | |
| 
 | |
|         while( !(USARTD0_STATUS & USART_RXCIF_bm) );
 | |
|         buffer=USARTD0_DATA;	
 | |
|         if ((USARTD0_STATUS & (USART_FERR_bm | USART_PERR_bm | USART_BUFOVF_bm))==0)
 | |
|             return buffer;
 | |
|     }
 | |
| }
 | |
| 
 | |
| ISR(USARTD0_RXC_vect)
 | |
| {
 | |
|     uint8_t tmp = get_uart0_char();
 | |
|     putchar(tmp);
 | |
|     if(( tmp == 0x0D || tmp == 0x0A))
 | |
|         printf("wurst\n\r");
 | |
|     else
 | |
|         fifo_push(&uart0_rx_buffer, tmp);
 | |
| }
 | |
| 
 | |
| ISR(USARTD0_DRE_vect){
 | |
|     uint8_t tmp;
 | |
|     if(fifo_pop(&uart0_tx_buffer, &tmp) == FIFO_SUCCESS){
 | |
|         USARTD0_DATA = tmp;
 | |
|     } else {
 | |
|         USARTD0_CTRLA &= ~USART_DREINTLVL_LO_gc;
 | |
|     }
 | |
| }
 |