brymen_bm869s_ir_cable

Brymen 869s Serial PC-Comm DIY Cable.
git clone htps://git.e1e0.net/brymen_bm869s_ir_cable.git
Log | Files | Refs | README

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