ШИМ + UART как быть с пк

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

Спасибо за помошь чтоб не путать вот

#include <avr/io.h>
#include <avr/interrupt.h>//библиотека прерываний

void USART_Init( unsigned int baudrate );
unsigned char USART_Receive( void );
void USART_Transmit(unsigned char data);
void init_PWM(void);

void init_PWM(void)
{
TCCR1A = (1 << COM1B1) | (1 << WGM11);
TCCR1B = (1 << WGM12) | (1 << CS11);
TIMSK |= (1 << OCIE1A);
DDRB |= (1 << PB4);
}

int main( void ) //Главная функция
{
USART_Init(12); //Скорость соединения
init_PWM();

for(;;)
{
unsigned char str = UDR;
int PWM;
PWM = (int)str;//
if (str =='2')//здесь работает хорошо
{
OCR1B = 100;
}
else
OCR1B = str;//не выполняется точнее выполняется но не верно на выходе постоянно одно значение

USART_Transmit( USART_Receive() ); //так для отладки
}
}

void USART_Init( unsigned int baudrate ) //Функция инициализации USART
{
UBRRH = (unsigned char) (baudrate>>8);
UBRRL = (unsigned char) baudrate;
UCSRA = (1<<U2X); //Удвоение скорости
UCSRB = ( ( 1 << RXEN ) | ( 1 << TXEN ) ); //Разрешение на прием и н апередачу через USART
UCSRC = (1<<USBS) | (3<<UCSZ0);
}

unsigned char USART_Receive( void ) //Функция приема данных
{
while ( !(UCSRA & (1<<RXC)) ); //Ожидание приема символа
return UDR; //Возврат символа
}

void USART_Transmit( unsigned char data ) //Функция отправки данных
{
while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR = data; //Начало передачи данных
}

в принципе коменты есть но повторюсь сам USART рботает без ошибок, чувствую нужно прерывае но я новичок, так что я запутался Мяу
Реклама
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

phanis писал(а):Может лучше сделать работу с двойным буфером. И отправлять количество требуемых байт в комп(запрос), когда нужно заполнить один из буферов.
В буфер складывать по прерыванию юсарта.
Из буфера читать в шим по прерыванию таймера.
С данными работать в виде структуры. Битовые поля.
Блин по смыслу я свами согласен а как если не сложно найдите накидать рабочий пример
Реклама
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

Engineer_Keen писал(а):UART настроен? Скорости совпадают? Процедура обработки приема данных через UART есть? Учитывается что OCR1B - 16 разрядный, а UDR - 8 разрядный?
скорость?, а как проверить, и что вы имеете ввиду.
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

Hitalik писал(а):
phanis писал(а):Может лучше сделать работу с двойным буфером. И отправлять количество требуемых байт в комп(запрос), когда нужно заполнить один из буферов.
В буфер складывать по прерыванию юсарта.
Из буфера читать в шим по прерыванию таймера.
С данными работать в виде структуры. Битовые поля.
Блин по смыслу я свами согласен а как если не сложно найдите накидать рабочий пример
я преследую цель высокой скорости и простоты кодаж
в USART не срабатывает прерывание!!!ISR(USART_RX_vect)
Последний раз редактировалось Hitalik Чт апр 12, 2012 18:18:04, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ШИМ + UART как быть с пк

Сообщение Engineer_Keen »

Как вы убедились что UART работает без ошибок? Для начала примите байт, прибавьте к нему 1 и отошлите назад. Если придет то, что надо, тогда со скоростями и приемом/передачей все в порядке и надо смотреть дальше.
Реклама
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

00111001 ОТПРАВЛЕННОЕ
00111001 ПРИНЯТО
Реклама
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

Hitalik писал(а):00111001 ОТПРАВЛЕННОЕ
00111001 ПРИНЯТО
без прибавления 1

по битам
31 отправляю прибовляю 1
32 и получаю это
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: ШИМ + UART как быть с пк

Сообщение Engineer_Keen »

Ладно, UART работает. А какое
на выходе постоянно одно значение
?
Что если заменить строчку USART_Transmit( USART_Receive() ) на USART_Transmit(str)?
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

Engineer_Keen писал(а):Ладно, UART работает. А какое
на выходе постоянно одно значение
?
Что если заменить строчку USART_Transmit( USART_Receive() ) на USART_Transmit(str)?
ну он уходит в цикл но предаёт верно
я вот подумал если выражение работает if (str =='2')//
то получается нужна задержка, но я её пробывал, может дело в прирывании не подскажите как её реализовать на avrstudio5
с задержкой тоже не выходит
for ( int j = 0; j <= 200; j++){}OCR1B = str;
хм
при условии if
if()
OCR1B = 100;
USART_Transmit(100); 64
USART_Transmit(OCR1B); 64
тоесть в OCR1B попадает то что нужно
///////////////////////////////////////////////////
else
OCR1B = str; сюда отправляю 100
USART_Transmit(100); 64
USART_Transmit(OCR1B); 00
тоесть в цикле в OCR1B всегда 00 независимо от str

но в цыкле при выражении

цикл
OCR1B = 100;
USART_Transmit(100); 64
USART_Transmit(OCR1B); 64

тоесть работает нормально
в итоге вывод что про зацикливанни в OCR1B с UDR проблема
понятно ошибка преоброзования UDR в INT для шима я передаю только один символ.
преобразовывать надо через atoi() но есть проблема, atoi() нужна строка а не символ.
Вывод нужно создать масив из символов а потом передавать в atoi.
Подскажите как правильно это зделать чтоб было просто?
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

#define SIZE_BUF 8
//кольцевой (циклический) буфер
unsigned char TxBuf[SIZE_BUF];
unsigned char tail = 0;
unsigned char head = 0;
unsigned char count = 0;

//"очищает" буфер
void FlushBuf(void)
{
tail = 0;
head = 0;
count = 0;
}
//положить символ в буфер
void PutChar(unsigned char sym)
{
if (count < SIZE_BUF){ //если в буфере еще есть место
TxBuf[tail] = sym; //помещаем в него символ
count++; //инкрементируем счетчик символов
tail++; //и индекс хвоста буфера
if (tail == SIZE_BUF) tail = 0;
}

}

//взять символ из буфера
unsigned char GetChar(void)
{
unsigned char sym = 0;
if (count > 0){ //если буфер не пустой
sym = TxBuf[head]; //считываем символ из буфера
count--; //уменьшаем счетчик символов
head++; //инкрементируем индекс головы буфера
if (head == SIZE_BUF) head = 0;
}
return sym;

}

char * USART_SendStr(void)
{
char * str= NULL;
int i=0;
while(count > 0)
{
unsigned char sym;
sym = GetChar();РАБОТАЕТ

*(str+i)=sym; НЕ РАБОТАЕТ получаю в сумме не то что нужно
i++;
}
return str;
}

int main( void ) //Главная функция
{
USART_Init(12); //Скорость соединения
init_PWM();

PutChar('5');
while (1)
{

int i = atoi(USART_SendStr());
USART_Transmit(i);

}
}

//
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

В итоге масив не тот *(str+i)=sym; не верно что не так
Hitalik
Родился
Сообщения: 18
Зарегистрирован: Пт окт 21, 2011 19:42:45

Re: ШИМ + UART как быть с пк

Сообщение Hitalik »

Вообщем спасибо всем зделал так и работае изумительно

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

void PWM_Transmit()//функция для передачи  OCR1 в ШИМ
{
   static char * str;//переменная для масива строк
   int count = 0;//переменная для количества символов
   while (count < 3)//делаем цикл в 3 раза так как моё число не превышает 999 то мне хватает
   {
     while ( !(UCSRA & (1<<RXC)) ); //ждем пока не будет символа
     str=(char*) realloc(str, count); //выделяем память под символ
     *(str+count)=UDR;               //пишем полученный символ в масив
    count++;                       //индексируем масив
   }   
   OCR1B = (int)atoi(str);//в итоге говорим что OCR1B = полученный масив str преобразованный из строчного в числовой (int)atoi(str)
   USART_Transmit('j');//так для отладки
}
int main( void ) //Главная функция
{ 
USART_Init(12); //Скорость соединения  115200
init_PWM();//инсталируем ШИМ
while (1)
  {     
    if (UDR == 'h')//если получаем h 
        {
        PWM_Transmit();//то переходим сюда
        }
   //отправляем  в терминал h511 можно и h001 и получаем на выходе то что и требовалось!!!
      
  }  
}
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»