avr305.h (2172B)
1 #ifndef AVR305_H 2 #define AVR305_H 3 4 /* See LICENSE file for copyright and license details. */ 5 #include <avr/io.h> 6 #include <avr/interrupt.h> 7 8 //Set tx to PB2 / rx to PB1 9 #define UART_Port _SFR_IO_ADDR(PORTB) 10 #define UART_Tx 0 11 #define UART_Rx 1 12 13 //Define baudrate 14 #define BAUD_RATE 115200 15 16 //Calculate delays 17 #ifdef F_CPU 18 #define TXDELAY (((F_CPU/BAUD_RATE)-7 +1.5)/3) 19 #define RXDELAY (((F_CPU/BAUD_RATE)-5 +1.5)/3) 20 #else 21 #error CPU frequency F_CPU undefined 22 #endif 23 24 void printc(char ch) { 25 uint8_t txdelay = TXDELAY; 26 uint8_t delayCount = 0; 27 28 __asm__ __volatile__( 29 "0: cli\n\t" 30 " sbi %[uart_port]-1,%[uart_tx]\n\t" 31 " cbi %[uart_port],%[uart_tx]\n\t" 32 " in __tmp_reg__,%[uart_port]\n\t" 33 " ldi r25,3\n\t" 34 "1: mov %[delayCount],%[txdelay]\n\t" 35 "2: dec %[delayCount]\n\t" 36 " brne 2b\n\t" 37 " bst %[ch],0\n\t" 38 " bld __tmp_reg__,%[uart_tx]\n\t" 39 " lsr r25\n\t" 40 " ror %[ch]\n\t" 41 " out %[uart_port],__tmp_reg__\n\t" 42 " brne 1b\n\t" 43 : 44 [ch] "+r" (ch), 45 [delayCount] "+r" (delayCount) 46 : 47 [uart_port] "M" (UART_Port), 48 [uart_tx] "M" (UART_Tx), 49 [txdelay] "r" (txdelay) 50 : 51 "r25" 52 ); 53 } 54 55 void serialPrint(const char *string) { 56 while(*string) { 57 printc(*string++); 58 } 59 sei(); 60 } 61 62 void serialPrintln(const char *string) { 63 while(*string) { 64 printc(*string++); 65 } 66 printc('\r'); 67 printc('\n'); 68 sei(); 69 } 70 71 char serialReadc() { 72 uint8_t rxdelay = RXDELAY; 73 uint8_t rxdelay15 = (RXDELAY*1.5)-2.5; 74 uint8_t delayCount = 0; 75 76 __asm__ __volatile__( 77 "0: cbi %[uart_port]-1,%[uart_rx]\n\t" 78 " sbi %[uart_port],%[uart_rx]\n\t" 79 " mov %[delayCount],%[rxdelay15]\n\t" 80 " ldi %[rxdelay15],0x80\n\t" 81 "1: sbic %[uart_port]-2,%[uart_rx]\n\t" 82 " rjmp 1b\n\t" 83 " cli\n\t" 84 "2: subi %[delayCount], 1\n\t" 85 " brne 2b\n\t" 86 " mov %[delayCount],%[rxdelay]\n\t" 87 " sbic %[uart_port]-2,%[uart_rx]\n\t" 88 " sec\n\t" 89 " ror %[rxdelay15]\n\t" 90 " brcc 2b\n\t" 91 "3: dec %[delayCount]\n\t" 92 " brne 3b\n\t" 93 : 94 [rxdelay15] "+r" (rxdelay15), 95 [delayCount] "+r" (delayCount) 96 : 97 [uart_port] "M" (UART_Port), 98 [uart_rx] "M" (UART_Rx), 99 [rxdelay] "r" (rxdelay) 100 ); 101 return rxdelay15; 102 } 103 104 #endif