Guest User

UART программный на Atiny13A

a guest
Feb 18th, 2015
2,488
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data