View difference between Paste ID: X4wW3id4 and NBFMq1C6
SHOW: | | - or go back to the newest paste.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <util/delay.h>
4
5
volatile uint8_t uart;
6
uint8_t temp;
7
volatile uint8_t count;
8
volatile uint8_t start;
9
volatile uint8_t c;
10
volatile uint8_t uart_data;
11
volatile uint8_t Rece_bit;
12
volatile uint8_t rec;
13
volatile uint8_t usart_r;
14
volatile uint8_t coef;
15
16
ISR(INT0_vect){
17
                rec=1;} // Прерывание чисто для определения стартового бита при приеме, 
18
                        // используется редко, можно сюда повесить что-либо еще
19
20
ISR(TIM0_COMPA_vect){
21
        TIMSK0=0x00; 
22
        TCCR0B=0x00;   // Единственный Таймер, используется для формирования четких промежуток 
23
        OCR0A=0;       // между битами, как при приеме так и при передачи
24
        c=1;           
25
        TCNT0=0;
26
        TIMSK0=0x04;
27
        TCCR0B=0x02;
28
                      // Значение "сброс при совпадении" загружается каждый раз из переменной
29
 OCR0A=coef;      // Можно быстро менять скорости UART
30
        Rece_bit=1; 
31
}
32
33
int lov (uint8_t data2) {
34
        if (count>=8){
35
        PORTB|=(1<<4); start=0; temp=0; c=0; count=0;
36
        TIMSK0=0; TCCR0B=0; OCR0A=0;goto nah;}
37
        
38
        if(c==1){
39
                if (start==0){temp=0x80; start=1;
40
                count--; goto razvet;
41
        }
42
        temp=data2;
43
        temp=temp>>count;
44
        temp=temp<<7;
45
        razvet:
46
        switch(temp){
47
                case 0x80 : PORTB&=~(1<<4);  break;
48
                case 0x00 : PORTB|=(1<<4);   break;
49
        }
50
        count++; c=0;
51
   }
52
nah:;
53
}       
54
55
int UART_trans(uint8_t data){
56
        uint8_t f;      
57
        data=~data;     
58
        coef=115;
59
        TIMSK0=0x04;
60
        TCCR0B=0x02;
61
        for(f=0;f<10;f++){
62
                while(c==0);
63
                lov(data);
64
        }
65
        start=0; temp=0; c=0; count=0;
66
        TIMSK0=0; TCCR0B=0; OCR0A=0;
67
        coef=0;
68
}
69
70
int UART_receiv(void){
71
        uint8_t a;
72
        usart_r=0;
73
        
74
        MCUCR=0x02; // INT0 Interrupt
75
        GIMSK=0x40; // INT0 Interrupt
76
        
77
        while(rec==0); // Ждать, пока не случится стартовый бит
78
        MCUCR=0; // INT0 Interrupt
79
        GIMSK=0; // INT0 Interrupt
80
        coef=115;
81
        TIMSK0=0x04;
82
        TCCR0B=0x02;
83
        rec=0;
84
        TCNT0=0xDC;
85
        for(a=0; a<9; a++){
86
                while(Rece_bit==0);
87
88
                if(bit_is_set(PINB,1)){usart_r |=(1<<7);} else {usart_r &=~(1<<7);}
89
                usart_r=usart_r>>1;
90
                Rece_bit=0;
91
            }
92
}
93
94
int main(void)
95
{
96
        DDRB&=~(1<<1); // 
97
        DDRB|=(1<<4);  // 
98
                
99
   asm("sei");   
100
        while(1)
101
    {       
102
           UART_receiv(); // Сперва принимаем байт
103
           _delay_ms(10);  // Пауза для наглядности
104
           UART_trans(usart_r);  // Отправляем обратно
105
        }
106
}