Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: USART PWM |
Цитата |
|
[quote="hitalik"][quote="Streetstyle"]Выглядит ужасно !!! :shock:
PWM = (int)str;//преобр Как я пнял :crazy: этим ты хочмш преобразовать строку к примеру "25" в число 25 если да то это ошибка ! Для преобразования строки в число нужна функчия atoi() из библиотеки stdlib.h :cool:[/quote] Вы правы, я всю ночь сидел и думал, и пришол к выводу что ШИМ получает только первый сивол мною переданный, и когда я увидел ваше сообшение всё столо на свой места но atoi() не работает с сиволом ему нужна строка [b]мне нужен буфер как я понял помогите с этим!!![/b][/quote] [b]вам огромное спасибо[/b] Ваше замечание было решающие...
|
|
|
|
Добавлено: 15 апр 2012, 01:18 |
|
|
|
|
|
Заголовок сообщения: |
Re: USART PWM |
Цитата |
|
Streetstyle Спасибо конечно но мне нужно было управлять нагрузкой с пк я уже разобрался
Streetstyle Спасибо конечно но мне нужно было управлять нагрузкой с пк я уже разобрался
|
|
|
|
Добавлено: 15 апр 2012, 01:16 |
|
|
|
|
|
Заголовок сообщения: |
Re: USART PWM |
Цитата |
|
Вообщем спасибо всем зделал так и работае изумительно
[code]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 и получаем на выходе то что и требовалось!!! } } [/code] Я понимаю что вы будете говорит за всякие буфера и всё такое но мне нужно было чтоб работало быстро и чётко!!!
|
|
|
|
Добавлено: 15 апр 2012, 01:13 |
|
|
|
|
|
Заголовок сообщения: |
Re: USART PWM |
Цитата |
|
Нет вру Советую писать в CodeVisionAVR там уже встроенны функции для работы со строками и UART, главное разбратся с Help-ом он только на английском
Нет вру ;) Советую писать в CodeVisionAVR там уже встроенны функции для работы со строками и UART, главное разбратся с Help-ом он только на английском
|
|
|
|
Добавлено: 14 апр 2012, 20:55 |
|
|
|
|
|
Заголовок сообщения: |
Re: USART PWM |
Цитата |
|
Больше нечем помоч немогу
Вложения: |
c.zip [113.24 КБ]
Скачиваний: 748
|
Больше нечем помоч немогу :zomg:
|
|
|
|
Добавлено: 14 апр 2012, 20:15 |
|
|
|
|
|
Заголовок сообщения: |
Re: USART PWM |
Цитата |
|
Хотел тебе написать прогу но у самого голова опухла я тоже новичек в этом деле. Думаю тебя устроит простой вариант : кнопки 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) { } }
Хотел тебе написать прогу но у самого голова опухла :shock: я тоже новичек в этом деле. Думаю тебя устроит простой вариант : :crazy: кнопки a и s прибовляют z и x уменшают ;)
Написано в AVR Studio 5 если будут проблемы с модулем delay.h то надо включит оптимизацию. хотя его можно удалить он сдесь ненужен
[color=#0000BF]// 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) { } }[/color]
|
|
|
|
Добавлено: 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; Получаю не верное значение!!!
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 |
Цитата |
|
[quote="Streetstyle"]UCSRC = (1<<USBS) | (3<<UCSZ0); ):\ USART_Transmit( USART_Receive() ); :? -------------------------------------------- [quote]отправляю 31 прибовляю 1 получаю 32 [/quote] :smile: :smile: :smile: :smile:
отправь 99 и получиш 910 :smile: :smile: :smile: :smile: :smile: :smile: :smile: :smile: :smile:[/quote] Нет я решил по другому но тут опять не задача 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() ); :? -------------------------------------------- [quote]отправляю 31 прибовляю 1 получаю 32 [/quote] :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вух и более значных чисел.
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 |
|
|
|