http://forum.getchip.net/ |
|
USART PWM http://forum.getchip.net/viewtopic.php?f=20&t=213 |
Страница 1 из 2 |
Автор: | hitalik [ 12 апр 2012, 18:54 ] |
Заголовок сообщения: | USART PWM |
Помогите найти ошибку, не работает ШИМ если значение получает с USARTA /* * Usart attiny2313 */ #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); } unsigned char str; int main( void ) //Главная функция { USART_Init(12); //Скорость соединения init_PWM(); while (1) { if(str == '2') { OCR1B = 300; } str = UDR; int PWM; PWM = (int)str;//преобр 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; //Начало передачи данных } В итоге if(str == '2') { OCR1B = 300; } работает отлично USART работает отправляю 31 прибовляю 1 получаю 32 при условии 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 проблема |
Автор: | Streetstyle [ 12 апр 2012, 19:37 ] | ||
Заголовок сообщения: | Re: USART PWM | ||
Выглядит ужасно !!! PWM = (int)str;//преобр Как я пнял этим ты хочмш преобразовать строку к примеру "25" в число 25 если да то это ошибка ! Для преобразования строки в число нужна функчия atoi() из библиотеки stdlib.h
|
Автор: | hitalik [ 13 апр 2012, 04:20 ] |
Заголовок сообщения: | Re: USART PWM |
Автор: | Streetstyle [ 13 апр 2012, 04:42 ] |
Заголовок сообщения: | Re: USART PWM |
Работает и с одним симвалом (числовым) а если надо asc11 код то можно присвоить a='1' |
Автор: | hitalik [ 13 апр 2012, 06:16 ] |
Заголовок сообщения: | Re: USART PWM |
Автор: | Streetstyle [ 13 апр 2012, 08:23 ] |
Заголовок сообщения: | 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вух и более значных чисел. |
Автор: | Streetstyle [ 13 апр 2012, 19:46 ] |
Заголовок сообщения: | Re: USART PWM |
Автор: | hitalik [ 14 апр 2012, 12:01 ] |
Заголовок сообщения: | Re: USART PWM |
Автор: | hitalik [ 14 апр 2012, 12:05 ] |
Заголовок сообщения: | 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; Получаю не верное значение!!! |
Автор: | Streetstyle [ 14 апр 2012, 20:14 ] |
Заголовок сообщения: | 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) { } } |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |