atmega64A чтение по usart

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 25 сен 2019.

  1. Yerabdi

    Yerabdi Гик

    Здравствуйте всем начал работать с atmega64a. Получилось отправлять данные с usart на терминал но
    не получается принимать данные с терминала. вывод PC3 срабатывает что показывает при приема данных заходит в прерывание по приему
    вот код
    Код (C++):
    ISR (TIMER0_COMP_vect)
    {
        T++;
       
    }
    ISR(USART0__RX_vect)         //завершение приема
    {
          rx_in_byte(UDR0);// priem po visual studio
      PORTC^=(1<<PC3);
    }
    //*****usart_Tx********  
    ISR (USART0__UDRE_vect)//регистр данных на передачу пуст
    {            
        UDR0 = *sendd;
        sendd++;
        ToSend++;
        if (ToSend == 1)
        {
            UCSR0B &= ~(1 << UDRIE0);
        }
     
     
    }
    int main(void)
    {
        //timer_0
        TCCR0 |= (1<<WGM01); // Режим CTC (сброс по совпадению)
        TIMSK |=(1<<OCIE0);  // Разрешить прерывание по совпадению
        TCCR0 |=(1<<CS02)|(1<<CS01)|(1<<CS00); // CLK/1024,64mcs
        //TCCR0 |=(1<<CS02);//clk/64,4mcs
        OCR0=15; //по достижении уходить в вектор прерывании, 15 равняется к 960 нс/16MHz
        TCNT0=0;
        //******usart***************
        UBRR0H = (unsigned char)(ubrr>>8);
        UBRR0L = (unsigned char)ubrr;
        UCSR0B =(1<< RXEN0) //разрешаем прием
        |(1<< TXEN0 );//разрешаем передачу
        //UCSR0C = (1<<USBS0)//2 stop bit
        UCSR0C = (0<<USBS0)//1 stop bit
        |(1<<UCSZ00)|(1<<UCSZ01);// 8-бит dannie
        UCSR0B |=(1<<RXCIE0);//прерывание по приему данных
        //**********************
         DDRC |=(1<<PC3);
        PORTC &=~(1<<PC3);
        asm("sei");
        while(1)
        {
            if (T>=2000)
            {
            if(usartRxBuf[0]== 5)
             {UART_SendData(TxBuf);}
              T=0;
            }            
        }
    }


    //********usart Rx****************************
    void rx_in_byte(uint8_t bits)
    {static uint8_t status,rx_wr_index=0,zapis=0;
         /*if (zapis < 4)
         {usartRxBuf[zapis++]=bits;
          }
            if (zapis == 4)
            {startrec=1;
                zapis=0;}
        */
     
         usartRxBuf[0]=bits;  
    }
    //********usart Tx************************
    void UART_SendData(uint8_t *pSendData)//otpravka dannih po prerivanii
    {   ToSend=0;
        sendd = pSendData;
         UCSR0B |=(1<<UDRIE0);//preriv.po opustusheni
     
    }
     
    Последнее редактирование: 25 сен 2019
  2. Yerabdi

    Yerabdi Гик

    Разобрался я отправлял данные с терминала в коде нужно было конвертировать данные с символьных на цифровой
    Код (C++):
    /********usart Rx****************************
    void rx_in_byte(uint8_t bits)
    {static uint8_t status,rx_wr_index=0,zapis=0;
        uint8_t a=0,b=0,c=0;
         a =bits;                        // vvod dannih s terminala v1.9 "simbol"
        c=0;
        if ((a>=48) && (a<=57)) {
          c = c * 10 +  (a - 48);
        }      
        b=c;
         usartRxBuf[zapis]=b;  
    }