ATTiny13 рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рджреНрд╡реИрдз рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ UART

Geektimes рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдПрдХ рдмрд╛рд░, рдореЗрд░реА рд╕реЗрд╡рд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рд▓реЛрдХрдкреНрд░рд┐рдп ATtiny13 рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ UART рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред Googling, рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд▓реЗрдЦ рдорд┐рд▓реЗ, рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ:


рдФрд░ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ:


рдирд╡реАрдирддрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ (рдкреВрд░реНрдг рджреНрд╡реИрдз) рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рдХреЛрдб рдПрд╡реАрдЖрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдзрд╛рд░реНрдорд┐рдХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╢реБрджреНрдз рд╕реА рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рдкреВрд░реНрдг рджреНрд╡реИрдз UART рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдФрд░ рдЙрд╕реА рд╕рдордп рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдмрд╣реБрдд рд╕реАрдорд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ (рд╕рд┐рд░реНрдл рдПрдХ 8-рдмрд┐рдЯ рдЯрд╛рдЗрдорд░) рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдХрд╛рд░реНрдп рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдЪреНрдЫреА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рд╛рдордЧреНрд░реА рд╣реЛрдЧреА, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд▓рдЧрднрдЧ рдЦрд░реЛрдВрдЪ рд╕реЗ рдореИрдВрдиреЗ AVR рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХреАред

рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдХреИрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╛рда, рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реЛрдВрдЧреЗред

рддреЛ, рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдмрд╕ рдЙрд╕ рд░реВрдк рдореЗрдВ uart13.h рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдкреЛрд╕реНрдЯ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИ, рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред

Uart13.h рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓
/*    UART   ATtiny */

#ifndef _UART13_H_
#define _UART13_H_ 1

#include <avr/io.h>
#include <avr/interrupt.h>

/*
*	        
*	    UART.
*/

#define TXPORT PORTB		//    
#define RXPORT PINB		//    
#define TXDDR DDRB		//     
#define RXDDR DDRB		//     
#define TXD 0			//       
#define RXD 1			//       

/*
*	  ,     ()
*	 BAUD_DIV   :
*	BAUD_DIV = (CPU_CLOCK / DIV) / BAUD_RATE
*	 CPU_CLOCK -   , BAUD_RATE -   UART,
*	 DIV -    ,   TCCR0B.
*	,   9.6 ,   8,   9600 :
*	BAUD_DIV = (9 600 000 / 8) / 9600 = 125 (0x7D).
*/

//#define T_DIV		0x01	// DIV = 1
#define T_DIV		0x02	// DIV = 8
//#define T_DIV		0x03	// DIV = 64
#define BAUD_DIV	0x7D	//  = 9600 

/*
*	         UART
*/

volatile uint16_t txbyte;
volatile uint8_t rxbyte;
volatile uint8_t txbitcount;
volatile uint8_t rxbitcount;

void uart_init();
void uart_send(uint8_t tb);
int16_t uart_recieve(uint8_t* rb);

#endif /* _UART13_H_ */



рд▓реЗрдХрд┐рди рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджреВрдВрдЧрд╛ рддрд╛рдХрд┐ рд▓реЗрдЦ рдХреЛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ рдмрджрд▓ рди рд╕рдХреЗред

рдмрд╛рдзрд╛ TIM0_COMPA
ISR(TIM0_COMPA_vect)
{
	TXPORT = (TXPORT & ~(1 << TXD)) | ((txbyte & 0x01) << TXD); //    TXD   txbyte
	txbyte = (txbyte >> 0x01) + 0x8000;	//  txbyte   1   1    (0x8000)
	if(txbitcount > 0)			//    (   ),
	{
		txbitcount--;			//     .
	}
}


рдпрд╣рд╛рдВ рд╣рдореЗрдВ OCR0A рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ OCR0A рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рджрд░реНрдЬ рдореВрд▓реНрдп рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ TCNT0 рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (CTC рдЯрд╛рдЗрдорд░ рдореЛрдб, TCCR0A рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд╕реЗрдЯ)ред рдЗрд╕ рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ UART рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Txbyte рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рд╢рд┐рдлреНрдЯ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╣рд░ рдмрд╛рд░ рдЬрдм рдХреЛрдИ рд╡реНрдпрд╡рдзрд╛рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ txbyte рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ microcircuit рдХреЗ TXD рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╡реИрд░рд┐рдПрдмрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рджрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдХреЛ рдореБрдХреНрдд рдЙрдЪреНрдЪ рдмрд┐рдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдмрдХрд┐ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рдЪрд░ рд╕рдВрдЦреНрдпрд╛ 0xFFFF рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рддрд░реНрдХ рд╕реНрддрд░ TXD рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдирд┐рд░рдВрддрд░ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмрд┐рдЯ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛: 1 рд╕реНрдЯрд╛рд░реНрдЯ, 8 рдбреЗрдЯрд╛ рдмрд┐рдЯреНрд╕ рдФрд░ 1 рд╕реНрдЯреЙрдк, рдХреБрд▓ 10 (0x0A) рдХреЗ рд▓рд┐рдП, рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯ рдмрд┐рдЯ рдХреЗ рд╕рд╛рде рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП txbyte рдбреЗрдЯрд╛ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╡реЗ рддреБрд░рдВрдд рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗред рдлрд╝рдВрдХреНрд╢рди void uart_send (uint8_t tb) рдкреИрдХреЗрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред

рдмрд╛рдзрд╛ TIM0_COMPB
ISR(TIM0_COMPB_vect)
{
	if(RXPORT & (1 << RXD))			//      RXD
		rxbyte |= 0x80;			//   1,   1    rxbyte
	
	if(--rxbitcount == 0)			//   1         
	{
		TIMSK0 &= ~(1 << OCIE0B);	//  ,   TIM0_COMPB
		TIFR0 |= (1 << OCF0B);		//    TIM0_COMPB
		GIFR |= (1 << INTF0);		//     INT0
		GIMSK |= (1 << INT0);		//   INT0
	}
	else
	{
		rxbyte >>= 0x01;		//   rxbyte   1
	}
}


рдпрд╣рд╛рдБ рд╣рдо OCR0B рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдЗрдВрдЯрд░рдкреНрдЯ рд╣реИрдВрдбрд▓рд░ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ TIM0_COMPA рдХреЗ рд╡реНрдпрд╡рдзрд╛рди рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬрдм рдЗрд╕ рд░реБрдХрд╛рд╡рдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ TCNT0 рдЯрд╛рдЗрдорд░ рд░реАрд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд░реБрдХрд╛рд╡рдЯ рдХреЗрд╡рд▓ рддрдм рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдХреА рд╕рдордп рдпрд╣ рдирд┐рд╖рд┐рджреНрдз рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рд╣рдо рдЖрд░рдПрдХреНрд╕рдбреА рдЗрдирдкреБрдЯ рдХреА рддрд╛рд░реНрдХрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рдпрд╣ рдПрдХ рд╣реИ, рддреЛ рдкреНрд░рд╛рдкреНрдд рдЪрд░ rxbyte рдХреЗ рдЙрдЪреНрдЪ рдХреНрд░рдо рдореЗрдВ рдПрдХ рд▓рд┐рдЦреЗрдВ, рдлрд┐рд░ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдмрд┐рдЯреНрд╕ рдХреЗ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░, рдпрджрд┐ рдпрд╣ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕реНрд╡рд╛рдЧрдд рд╕рдорд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рд╣рдо рдЕрдЧрд▓реЗ рдмрд┐рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП rxbyte рдЪрд░ рдХреЛ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╡реНрдпрд╡рдзрд╛рди INT0
ISR(INT0_vect)
{
	rxbitcount = 0x09;			// 8    1  
	rxbyte = 0x00;				//   rxbyte
	if(TCNT0 < (BAUD_DIV / 2))		//        
	{
		OCR0B = TCNT0 + (BAUD_DIV / 2);	//         
	}
	else
	{
		OCR0B = TCNT0 - (BAUD_DIV / 2);	//        
	}
	GIMSK &= ~(1 << INT0);			//    INT0
	TIFR0 |= (1 << OCF0A) | (1 << OCF0B);	//    TIM0_COMPA (B)
	TIMSK0 |= (1 << OCIE0B);		//    OCR0B
}


рд╡реНрдпрд╡рдзрд╛рди INT0ред рдпрд╣ рдЗрдирдкреБрдЯ INT0 рдкрд░ рдкрд▓реНрд╕ рдХреЗ рдЕрдиреБрдЧрд╛рдореА рдХрд┐рдирд╛рд░реЗ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реВрдЪрдирд╛ рд░рд┐рд╕реЗрдкреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд┐рдЯ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ 9 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, rxbyte рдЪрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рд░рдЬрд┐рд╕реНрдЯрд░ OCR0B рдХреЗ рд▓рд┐рдП рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ TIM0_COMPB рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдмрд┐рдЯ рдХреЗ рдмреАрдЪ рдореЗрдВ рд╕рдордп рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕рдХреЗ рдмрд╛рдж, TIM0_COMPB рд╡реНрдпрд╡рдзрд╛рди рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ INT0 рд╡реНрдпрд╡рдзрд╛рди рдЕрдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

UART рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдп рд╣реИрдВред

Uart_send рдлрд╝рдВрдХреНрд╢рди
void uart_send(uint8_t tb)
{
	while(txbitcount);		//      
	txbyte = (tb + 0xFF00) << 0x01; //     txbyte        1
	txbitcount = 0x0A;		//     10
}


UART рдмрд╛рдЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдлрд╝рдВрдХреНрд╢рдиред рдпрд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЪрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдЯ рд▓реЗрддрд╛ рд╣реИ; рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдкреВрд░рд╛ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рд▓рд┐рдП рдЪрд░ рдХреЗ рдирд┐рдЪрд▓реЗ 8 рдмрд┐рдЯреНрд╕ рдХреЛ txbyte рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдКрдкрд░реА 8 рдмрд┐рдЯреНрд╕ 0xFF рд░рд╣рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЪрд░ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрдо рдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╛рд░рдВрдн рдмрд┐рдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рдмрд┐рдЯ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ 10 рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

Uart_recieve рдлрд╝рдВрдХреНрд╢рди
int16_t uart_recieve(uint8_t* rb)
{
	if(rxbitcount < 0x09)		//       9
	{
		while(rxbitcount);	//     
		*rb = rxbyte;		//      
		rxbitcount = 0x09;	//    
		return (*rb);		// 
	}
	else
	{
		return (-1);		//   -1 ( )
	}
}


UART рдмрд╛рдЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рд╕реВрдЪрдХ рдХреЛ 8-рдмрд┐рдЯ рдЪрд░ рдореЗрдВ рдПрдХ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рдирд┐рд╣рд┐рдд рд╣реЛрдЧреАред рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдмрд╛рдЗрдЯ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рддреЛ рд░рд┐рдЯрд░реНрди (-1)ред рдпрджрд┐ рдЗрд╕ рд╕рдордп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рджреЛ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдмрд╛рдЗрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рд░ (-1)ред

Uart_init рдлрд╝рдВрдХреНрд╢рди
void uart_init()
{
	txbyte = 0xFFFF;		//     -  
	rxbyte = 0x00;			//     -  
	txbitcount = 0x00;		//     -  (   )
	rxbitcount = 0x09;		//      - 9 (  )
	
	TXDDR |= (1 << TXD);		//       
	RXDDR &= ~(1 << RXD);		//       
	TXPORT |= (1 << TXD);		//     TXD
	RXPORT |= (1 << RXD);		//     RXD
	OCR0A = BAUD_DIV;		//    OCR0A    
	TIMSK0 |= (1 << OCIE0A);	//   TIM0_COMPA
	TCCR0A |= (1 << WGM01);		//   CTC ( TCNT0   OCR0A)
	TCCR0B |= T_DIV;		//        
	MCUCR |= (1 << ISC01);		//   INT0    
	GIMSK |= (1 << INT0);		//   INT0
	sei();				//   
}


UART рдЖрд░рдВрднреАрдХрд░рдг рд╕рдорд╛рд░реЛрд╣ред рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ, рдХреЛрдИ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВред рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХреБрдЫ рд╕рд░рд▓ рдореБрдЦреНрдп () рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

main.c
#include "uart13.h"

int main(void)
{
	uint8_t b = 0;
	uart_init();
	while (1) 
	{
		if(uart_recieve(&b) >= 0)	//    ,    
			uart_send(b);		//   ,  
	}
	return (0);
}


рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВ:
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ: 482 рдмрд╛рдЗрдЯреНрд╕ 47.1% рдкреВрд░реНрдг
рдбреЗрдЯрд╛ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ: 5 рдмрд╛рдЗрдЯреНрд╕ 7.8% рдкреВрд░реНрдг

рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдЯреЙрдХ рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдЖрдзреА рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рднреА рд╣реИ!
рдкреНрд░реЛрдЯреАрди рдореЗрдВ рдЬрд╛рдБрдЪ:

рд╕рд┐рдореБрд▓реЗрд╢рди рдареАрдХ рд╣реИ!


рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐: рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд┐рдХрд▓рд╛, рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рджреЗрд░реАред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВ, рд╡реЗ avr-gcc: GitHub рдкрд░ рд╕реНрд░реЛрдд рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ

Source: https://habr.com/ru/post/hi386485/


All Articles