Измеритель оборотов и отправка значения с последовательной связью

У меня есть вопрос о том, как читать RPM и отправлять значение с серийным номером. Это мой код:

char init(void)
{
  UBRRH=(uint8_t) (UBRR_CALC>>8);
  UBRRL=(uint8_t) UBRR_CALC;
  UCSRB=(1<<RXEN)|(1<<TXEN);
  UCSRC=(1<<URSEL)|(3<<UCSZ0);
  return 0;
}

void send(unsigned char x)
{
  while(!(UCSRA&(1<<UDRE))){}
  UDR=x;
}

void sendstring(char *s)
{
  while(*s)
  {
    send(*s);
    s++;
  }
}

volatile uint16_t count=0;    //Main revolution counter   
volatile uint16_t rps=0;    //Revolution per second

void Wait()
{
  uint8_t i;

  for(i=0;i<2;i++)
  {
    _delay_loop_2(0);
  }
}

int main(void)
{
  Wait();
  Wait();
  Wait();
  Wait();

  //Init INT0
  MCUCR|=(1<<ISC01);   //Falling edge on INT0 triggers interrupt.
  GICR|=(1<<INT0);  //Enable INT0 interrupt

  //Timer1 is used as 1 sec time base
  //Timer Clock = 1/1024 of sys clock
  //Mode = CTC (Clear Timer On Compare)
  TCCR1B|=((1<<WGM12)|(1<<CS12)|(1<<CS10));

  //Compare value=976
  OCR1A=976;
  TIMSK|=(1<<OCIE1A);  //Output compare 1A interrupt enable

  //Enable interrupts globaly
  sei();

  while(1)
  {
  }
}

ISR(INT0_vect)
{
  //CPU Jumps here automatically when INT0 pin detect a falling edge
  count++;
}

ISR(TIMER1_COMPA_vect)
{
  //CPU Jumps here every 1 sec exactly!
  rps=count;
  send(rps);
  count=0;
}

Можем ли мы отправлять последовательные данные, когда счетчик прерываний и таймер, у меня есть ошибка, когда я пытаюсь это сделать?

И какой лучший метод для чтения RPM и отправки значения с серийным номером


person Lukis triya    schedule 31.12.2015    source источник
comment
На ваш вопрос несколько сложно ответить из-за объема предоставленной вами информации о том, что вы пытаетесь сделать. Из вашего другого сообщения link я предполагаю, что ваш вопрос касается получения скорости вращения бесщеточного двигателя.   -  person vega8    schedule 31.12.2015
comment
Возможно, вы сможете найти ответ на свой вопрос в Atmel Application Note AVR443 и соответствующий пример кода.   -  person vega8    schedule 31.12.2015
comment
Какая ошибка у вас возникает при попытке? Что не работает? Это так просто, что вы никогда не вызываете init(), поэтому ваш UART не готов к отправке?   -  person Ross    schedule 31.12.2015


Ответы (1)


Одна потенциальная проблема заключается в том, что rps определяется как int16_t, а ваша процедура отправки ожидает беззнаковый символ.

Достаточно ли диапазона 0-255 для вашего RPS?

Вы хотите, чтобы RPS был удобочитаемым для человека, или вы отправляете его на другой компьютер или микроконтроллер?

В подпрограммах прерывания можно отправить последовательный порт, но вам нужно быть осторожным, поскольку последовательные подпрограммы обычно не допускают повторного входа.

person Jeff    schedule 01.01.2016