управление шим через uart

Обсуждаем контроллеры компании Atmel.
Ответить
Sel4
Открыл глаза
Сообщения: 74
Зарегистрирован: Пн дек 06, 2010 23:57:09
Откуда: Обнинск

управление шим через uart

Сообщение Sel4 »

Здравствуйте! Помогите пожалуйста советом или кодом.
У меня есть такой код. Мне нужно, чтобы из USART_GetChar() значения вида STX200200ETX
управляли ШИМом. Первое "200" - это Y джойстика (от 100 до 300), аналогично и для второй "200", только по Х.
STX - символ начала того, из чего нужно читать, ETX - символ его окончания.
(Если просто в while(1) отправлять по условию символы, то оно работает.
типа, if(simbol =='q') {right= например, 200}; (symbol= USART_GetChar() ) )
Для кнопок там просто отправляет буквы на вкл и на откл.
Самое мне не ясное это как сделать так, чтобы изменялся шим на желаемом OCR...
Управляется таким джойстиком
https://play.google.com/store/apps/details?id=org.projectproto.btjoystick&hl=ru

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "usart.h"
#include <stdio.h>


#define right OCR0
#define left OCR2
#define forward OCR1A
#define backward OCR1B

#define    STX        0x01 //      0x02 // начало
#define    ETX        0x09//      0x03//конец

unsigned char cmd[8] = {0, 0, 0, 0, 0, 0, 0, 0};

void pause(unsigned long i)
{
  while (--i) asm("nop");
}
int main(void)
{
PORTD=0;
//DDRD=0xb0;
DDRD = 0xfc;
PORTB=0;
DDRB=0x08;

TCCR2  = 0b01100100;
TCCR0  = 0b01100100;
TCCR1A = 0b10100001;
TCCR1B = 0b11100010;

USART_Init();
asm("sei");
while(1)
{
 if(USART_GetChar()>0)   // в скетче ардуино тут Serial.available()
 { 
                          // data received from smartphone
   _delay_ms(20);
   cmd[1] =  USART_GetChar();   // в скетче ардуино тут Serial.read()
   if(cmd[0] == STX) 
   {
     int i=1;     
     while(USART_GetChar()>0)  // в скетче ардуино тут Serial.available()
    {       
   left = cmd[2];
       _delay_ms(10);
       cmd[i] = USART_GetChar(); // в скетче ардуино тут Serial.read()
       if(cmd[i]>127 || i>7)                 break;     // Communication error
       if((cmd[i]==ETX) && (i==2 || i==7))   break;     // Button or Joystick data
       i++;
     }
     if     (i==2)      getButtonState(cmd[1]);    // 3 Bytes  ex: < STX "C" ETX >
      if(i==7)        getJoystickState(cmd);     // 6 Bytes  ex: < STX "200" "180" ETX >
} } } }

void getJoystickState(unsigned char data[8])   

{
 float vmax; int vmd; int vmi; float perc;
 int joyX = (data[1]-48)*100 + (data[2]-48)*10 + (data[3]-48);       // obtain the Int from the ASCII representation
 int joyY = (data[4]-48)*100 + (data[5]-48)*10 + (data[6]-48);
 joyX = joyX - 200;                                                  // Offset to avoid
 joyY = joyY - 200;                                                  // transmitting negative numbers

 if(joyX<-100 || joyX>100 || joyY<-100 || joyY>100)     return;      // commmunication error
    if ((joyX == 0) && (joyY == 0)) {
     // motorI.run(RELEASE);
    //  motorD.run(RELEASE);
      return;
    }

    if (joyY > 0) {
     // motorI.run(FORWARD);
     // motorD.run(FORWARD);
      vmax = joyY * 255 / 100  ;
    } else {
     // motorI.run(BACKWARD);
     // motorD.run(BACKWARD); 
      vmax = -joyY * 255 / 100     ;
    }
   
  if (joyX == 0) {
    vmd = (int) vmax;
    vmi = (int) vmax;
  }
  else if(joyX > 0) {
    perc = (100.0 -  (float) joyX ) / 100.0;
    vmd = (int)  (vmax * perc);
    vmi = (int) vmax;
  }
  else if(joyX < 0) {
    perc = (100.0  +  (float) joyX ) / 100.0;
    vmi = (int) (vmax * perc);
    vmd = (int) vmax;
  }
  //motorI.setSpeed(vmi);
  //motorD.setSpeed(vmd);

}

void getButtonState(int bStatus)  {
 switch (bStatus) {
// ----------  BUTTON #1  ----------
   case 'A':
  PORTC = 0x01;
     break;
   case 'B':
 PORTC =0x00;
     break;
}
}

В usart.h заголовки такие:

Код: Выделить всё

void USART_Init(void); //инициализация usart`a
unsigned char USART_GetTxCount(void); //взять число символов передающего буфера
void USART_FlushTxBuf(void); //очистить передающий буфер
void USART_PutChar(unsigned char sym); //положить символ в буфер
void USART_SendStr(char * data); //послать строку по usart`у
unsigned char USART_GetRxCount(void); //взять число символов в приемном буфере
void USART_FlushRxBuf(void); //очистить приемный буфер
unsigned char USART_GetChar(void); //прочитать приемный буфер usart`a
Ответить

Вернуться в «AVR»