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 | } |