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

 
Текущее время: 18 окт 2019, 13:23

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



Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: USART PWM
СообщениеДобавлено: 12 апр 2012, 18:54 
Не в сети

Зарегистрирован: 12 апр 2012, 18:41
Сообщения: 8
Помогите найти ошибку, не работает ШИМ если значение получает с 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 проблема


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 12 апр 2012, 19:37 
Не в сети

Зарегистрирован: 17 окт 2011, 20:16
Сообщения: 70
Выглядит ужасно !!! :shock:

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


Вложения:
AVR_12_2010_copy.pdf [328.89 КБ]
Скачиваний: 1667
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 13 апр 2012, 04:20 
Не в сети

Зарегистрирован: 12 апр 2012, 18:41
Сообщения: 8
Streetstyle писал(а):
Выглядит ужасно !!! :shock:

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 13 апр 2012, 04:42 
Не в сети

Зарегистрирован: 17 окт 2011, 20:16
Сообщения: 70
Работает и с одним симвалом (числовым) а если надо asc11 код то можно присвоить a='1'


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 13 апр 2012, 06:16 
Не в сети

Зарегистрирован: 12 апр 2012, 18:41
Сообщения: 8
Streetstyle писал(а):
Работает и с одним симвалом (числовым) а если надо asc11 код то можно присвоить a='1'

Не понял это как можно отрывок кода для наглядности?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 13 апр 2012, 08:23 
Не в сети

Зарегистрирован: 17 окт 2011, 20:16
Сообщения: 70
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вух и более значных чисел.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 13 апр 2012, 19:46 
Не в сети

Зарегистрирован: 17 окт 2011, 20:16
Сообщения: 70
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:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 14 апр 2012, 12:01 
Не в сети

Зарегистрирован: 12 апр 2012, 18:41
Сообщения: 8
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;
}


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 14 апр 2012, 12:05 
Не в сети

Зарегистрирован: 12 апр 2012, 18:41
Сообщения: 8
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;
Получаю не верное значение!!!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: USART PWM
СообщениеДобавлено: 14 апр 2012, 20:14 
Не в сети

Зарегистрирован: 17 окт 2011, 20:16
Сообщения: 70
Хотел тебе написать прогу но у самого голова опухла :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)
{

}
}


Последний раз редактировалось Streetstyle 14 апр 2012, 20:27, всего редактировалось 4 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ]  На страницу 1, 2  След.

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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