Перейти к блогу GetChip.net - блог        JilTE[1] - в разработке     Модификации устройств - модификации

 
Текущее время: 11 дек 2019, 05:39

Часовой пояс: UTC + 3 часа [ Летнее время ]



Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЁН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Анти-спам
Анти-спам:
Выполните задание
   

Обзор темы - USART PWM
Автор Сообщение
  Заголовок сообщения:  Re: USART PWM  
Цитата
hitalik писал(а):
Streetstyle писал(а):
Выглядит ужасно !!! :shock:

PWM = (int)str;//преобр Как я пнял :crazy: этим ты хочмш преобразовать строку к примеру "25" в число 25 если да то это ошибка !
Для преобразования строки в число нужна функчия atoi() из библиотеки stdlib.h :cool:

Вы правы, я всю ночь сидел и думал, и пришол к выводу что ШИМ получает только первый сивол мною переданный, и когда я увидел ваше сообшение всё столо на свой места но atoi() не работает с сиволом ему нужна строка мне нужен буфер как я понял помогите с этим!!!

вам огромное спасибо Ваше замечание было решающие...
Сообщение Добавлено: 15 апр 2012, 01:18
  Заголовок сообщения:  Re: USART PWM  
Цитата
Streetstyle
Спасибо конечно но мне нужно было управлять нагрузкой с пк
я уже разобрался
Сообщение Добавлено: 15 апр 2012, 01:16
  Заголовок сообщения:  Re: USART PWM  
Цитата
Вообщем спасибо всем зделал так и работае изумительно

Код:
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 и получаем на выходе то что и требовалось!!!
      
  } 
}

Я понимаю что вы будете говорит за всякие буфера и всё такое но мне нужно было чтоб работало быстро и чётко!!!
Сообщение Добавлено: 15 апр 2012, 01:13
  Заголовок сообщения:  Re: USART PWM  
Цитата
Нет вру ;) Советую писать в CodeVisionAVR там уже встроенны функции для работы со строками и UART, главное разбратся с Help-ом он только на английском
Сообщение Добавлено: 14 апр 2012, 20:55
  Заголовок сообщения:  Re: USART PWM  
Цитата
Больше нечем помоч немогу :zomg:


Вложения:
c.zip [113.24 КБ]
Скачиваний: 179
Сообщение Добавлено: 14 апр 2012, 20:15
  Заголовок сообщения:  Re: USART PWM  
Цитата
Хотел тебе написать прогу но у самого голова опухла :shock: я тоже новичек в этом деле.
Думаю тебя устроит простой вариант : :crazy:
кнопки a и s прибовляют z и x уменшают ;)

Написано в AVR Studio 5 если будут проблемы с модулем delay.h то надо включит оптимизацию.
хотя его можно удалить он сдесь ненужен

// DEFINE___________________________________________________________

#define F_CPU 8000000UL // Скорость мк 8 Мгц

#define BAUD 9600L

#define CR 0x13
#define LF 0x10


// INCLUDE__________________________________________________________

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdlib.h>


// VARIABLES________________________________________________________

volatile char temp;


// INTERRUPT________________________________________________________

ISR(USART_RX_vect)
{
temp=UDR;
switch (temp)
{
case 'a': OCR0A=OCR0A+10; break;
case 'z': OCR0A=OCR0A-10; break;
case 's': OCR0B=OCR0B+10; break;
case 'x': OCR0B=OCR0B-10;
}
}


// INIT FUNCTIONS___________________________________________________

void port_init(void)
{
DDRB=0xff;
PORTB=0x00;
DDRD=0xff;
PORTD=0x00;
}

void pwm_init(void) // Выводы OC0A и OC0B шим
{
TCCR0A|=_BV(WGM00)|_BV(WGM01)|_BV(COM0B1)|_BV(COM0A1);
TCCR0B|=_BV(CS02);
OCR0A=0x00;
OCR0B=0x00;
}

void usrt_init(void) // 8bit 1stop NOParity
{
UCSRB|=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
UCSRC|=_BV(UCSZ0)|_BV(UCSZ1);
UBRRH=(F_CPU/16/BAUD-1)>>8;
UBRRL=(F_CPU/16/BAUD-1)&0xff;
sei();
}


// FUNCTIONS________________________________________________________

void usrt_send(char data)
{
while(!(UCSRA&_BV(UDRE)));
UDR=data;
}


// MAIN FUNCTION____________________________________________________

int main(void)
{
port_init();
usrt_init();
pwm_init();
usrt_send('o');
usrt_send('k');

while(1)
{

}
}
Сообщение Добавлено: 14 апр 2012, 20:14
  Заголовок сообщения:  Re: USART PWM  
Цитата
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;
}

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

int i = atoi(USART_SendStr());
USART_Transmit(i);//получаю не то что должнобыть

}
Если я ложу в буфер PutChar('5');
И также извлекаю с буфера GetChar()
Но как только я хочу сформировать из масива строкку *(str+i)=sym;
Получаю не верное значение!!!
Сообщение Добавлено: 14 апр 2012, 12:05
  Заголовок сообщения:  Re: USART PWM  
Цитата
Streetstyle писал(а):
UCSRC = (1<<USBS) | (3<<UCSZ0); ):\
USART_Transmit( USART_Receive() ); :?
--------------------------------------------
Цитата:
отправляю 31 прибовляю 1
получаю 32
:smile: :smile: :smile: :smile:

отправь 99 и получиш 910 :smile: :smile: :smile: :smile: :smile: :smile: :smile: :smile: :smile:

Нет я решил по другому но тут опять не задача
char * USART_SendStr(void)
{
char * str= NULL;
int i=0;
while(count > 0)
{
unsigned char sym;
sym = GetChar();//здесь фенкция извлекает символ

*(str+i)=sym; //НЕ РАБОТАЕТ в str получеается какаето хрень
i++;
}
return str;
}
Сообщение Добавлено: 14 апр 2012, 12:01
  Заголовок сообщения:  Re: USART PWM  
Цитата
UCSRC = (1<<USBS) | (3<<UCSZ0); ):\
USART_Transmit( USART_Receive() ); :?
--------------------------------------------
Цитата:
отправляю 31 прибовляю 1
получаю 32
:smile: :smile: :smile: :smile:

отправь 99 и получиш 910 :smile: :smile: :smile: :smile: :smile: :smile: :smile: :smile: :smile:
Сообщение Добавлено: 13 апр 2012, 19:46
  Заголовок сообщения:  Re: USART PWM  
Цитата
char b,a='1';

b=atoi(a); // b=1 // atoi работает только с числовыми символами, к примеру('1','500','12225') и неработает с ('a','ghg','crap')
-----------------------
char b,a='1'; // переменной а присвоено значение 49 из кодовой таблицы asc соответствующее знаку 1

b=a; // b=49
-----------------------
да тебе нужен буфер для 2вух и более значных чисел.
Сообщение Добавлено: 13 апр 2012, 08:23

Часовой пояс: UTC + 3 часа [ Летнее время ]


Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB