ШИМ + UART как быть с пк
Re: ШИМ + UART как быть с пк
Спасибо за помошь чтоб не путать вот
#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 рботает без ошибок, чувствую нужно прерывае но я новичок, так что я запутался Мяу
#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 рботает без ошибок, чувствую нужно прерывае но я новичок, так что я запутался Мяу
- Реклама
Re: ШИМ + UART как быть с пк
Блин по смыслу я свами согласен а как если не сложно найдите накидать рабочий примерphanis писал(а):Может лучше сделать работу с двойным буфером. И отправлять количество требуемых байт в комп(запрос), когда нужно заполнить один из буферов.
В буфер складывать по прерыванию юсарта.
Из буфера читать в шим по прерыванию таймера.
С данными работать в виде структуры. Битовые поля.
Re: ШИМ + UART как быть с пк
скорость?, а как проверить, и что вы имеете ввиду.Engineer_Keen писал(а):UART настроен? Скорости совпадают? Процедура обработки приема данных через UART есть? Учитывается что OCR1B - 16 разрядный, а UDR - 8 разрядный?
Re: ШИМ + UART как быть с пк
я преследую цель высокой скорости и простоты кодажHitalik писал(а):Блин по смыслу я свами согласен а как если не сложно найдите накидать рабочий примерphanis писал(а):Может лучше сделать работу с двойным буфером. И отправлять количество требуемых байт в комп(запрос), когда нужно заполнить один из буферов.
В буфер складывать по прерыванию юсарта.
Из буфера читать в шим по прерыванию таймера.
С данными работать в виде структуры. Битовые поля.
в USART не срабатывает прерывание!!!ISR(USART_RX_vect)
Последний раз редактировалось Hitalik Чт апр 12, 2012 18:18:04, всего редактировалось 1 раз.
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ШИМ + UART как быть с пк
Как вы убедились что UART работает без ошибок? Для начала примите байт, прибавьте к нему 1 и отошлите назад. Если придет то, что надо, тогда со скоростями и приемом/передачей все в порядке и надо смотреть дальше.
- Реклама
Re: ШИМ + UART как быть с пк
00111001 ОТПРАВЛЕННОЕ
00111001 ПРИНЯТО
00111001 ПРИНЯТО
Re: ШИМ + UART как быть с пк
без прибавления 1Hitalik писал(а):00111001 ОТПРАВЛЕННОЕ
00111001 ПРИНЯТО
по битам
31 отправляю прибовляю 1
32 и получаю это
- Engineer_Keen
- Друг Кота
- Сообщения: 3872
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: ШИМ + UART как быть с пк
Ладно, UART работает. А какое
Что если заменить строчку USART_Transmit( USART_Receive() ) на USART_Transmit(str)?
?на выходе постоянно одно значение
Что если заменить строчку USART_Transmit( USART_Receive() ) на USART_Transmit(str)?
Re: ШИМ + UART как быть с пк
ну он уходит в цикл но предаёт верно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.
Подскажите как правильно это зделать чтоб было просто?
Re: ШИМ + UART как быть с пк
#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);
}
}
//
//кольцевой (циклический) буфер
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);
}
}
//
Re: ШИМ + UART как быть с пк
В итоге масив не тот *(str+i)=sym; не верно что не так
Re: ШИМ + UART как быть с пк
Вообщем спасибо всем зделал так и работае изумительно
Код: Выделить всё
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 и получаем на выходе то что и требовалось!!!
}
}

