Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 08.07.2010, 23:02  
Archer07
Прописка
 
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
Archer07 на пути к лучшему
По умолчанию Проблема с аппаратным ШИМ в мега169

Всем добрый день.

Помогите разобраться со следующей проблемой :
Есть необходимость генерировать на ноге контроллера ШИМ сигнал.
С компа передаю число от 0 до 255, где 255 это 100% скважности ШИМ.
ШИП аппаратный на Timer0.
Ниже представленный код работает не верно.
Я не получаю эхо от МК и скважность ШИМ не меняется в процессе работы.
Если же убрать процедуры инициализации ШИМ на Timer0, то отправка и прием числа происходит, эхо-запрос работает.



Код:
int main(void)
{
char data=0;
OSCCAL_calibration(); //процедура калибровки внутреннего генератора по RTC

// Initialize the USART
USARTinit(); Инициализация USART 19200,1 стоповый, нет четности

DDRB =(1‹‹PORTB4); порт будет выходом для ШИМ сигнала


TCCR0A=(1‹‹WGM01)|(1‹‹WGM00)|(1‹‹COM0A1)|(1‹‹CS01); инициализируем timer0 в режиме FastPWM
 OCR0A=125; Значение для сравнения, скважность

for(;;) 
{	
                
if( isCharAvailable() == 1 ) Если получен чар с ПК
 {
  TCCR0A=(1‹‹WGM00)|(1‹‹WGM01)|(0‹‹CS00)|(1‹‹COM0A1); Останавливаем счетчик
  data=receiveChar();
  sendChar(data);     //отправляем на комп, для проверки
  OCR0A=data;         Записываем новое значение для ШИм

  TCCR0A=(1‹‹WGM00)|(1‹‹WGM01)|(1‹‹CS00)|(1‹‹COM0A1); запускаем счетчик
   }
}
 return 0;
}


char isCharAvailable()
{	
// Does the RX0 bit of the USART Status and Control Register
// indicate a char has been received?
if ( (UCSRA & (0x80)) ) return 1;
else return 0;
}

char receiveChar()
{
// Return the char in the UDR0 register
return UDR;
}

void sendChar(char data)
{
int i = 0;
// To send data with the USART put the data in the USART data register 
UDR = data;
 // Check to see if the global interrupts are enabled
 if(SREG & 0x80)
{
// Wait until the byte is sent or we count out
	while ( !(UCSRA&0x40) && (i‹10000) )
{
		i++;
}
}
else  // Wait until the byte is sent
 while( !(UCSRA&0x40) );
// Clear the TXCflag        
UCSRA=UCSRA|0x40;          
}
Реклама:
Archer07 вне форума  
Непрочитано 09.07.2010, 12:38  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Проблема с аппаратным ШИМ в мега169

while ( !(UCSRA&0x40) && (i‹10000) )
Очень странная конструкция. Все равно i оптимизатор выкинет, да и зачем задержка?
Вообще зачем ждать конца передачи непонятно, тем более это просто "эхо".
И UCSRA&0x40 лучше делать как (UCSRA&(1‹‹TXC)) это куда удобнее проверять. Вы так делаете с таймером, почему же UART не повезло?
Попробуйте не останавливать таймер:
Код:
if( isCharAvailable() == 1 ) Если получен чар с ПК
 {
    data=receiveChar();
  sendChar(data);     //отправляем на комп, для проверки
  OCR0A=data;         Записываем новое значение для ШИм
   }
}
 return 0;
}
Зачем проверять включены ли прерывания, если у Вас нет обработчиков?
Отправка байта может быть примерно такой:
Код:
void sendChar(char data)
{
while(!(UCSRA & (1‹‹UDRE)){};
UDR = data;
}
kison вне форума  
Непрочитано 09.07.2010, 15:05  
Archer07
Прописка
 
Регистрация: 25.03.2009
Сообщений: 137
Сказал спасибо: 22
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
Archer07 на пути к лучшему
По умолчанию Re: Проблема с аппаратным ШИМ в мега169

А что значит "оптимизатор i выкинет"?
Archer07 вне форума  
Непрочитано 09.07.2010, 15:40  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Проблема с аппаратным ШИМ в мега169

Сообщение от Archer07 Посмотреть сообщение
А что значит "оптимизатор i выкинет"?
Да то и значит. Какой смысл ему увеличивать переменную, если она не несет никакого смысла? Так что ее сократят и просто будет ждать конца передачи. Причем непонятно зачем.
kison вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
HV9961. Проблема с ложными срабатываниями HeatSink Источники питания и свет 16 25.11.2010 20:51
Посоветуйте ШИМ Easyrider83 Информация по радиокомпонентам 19 04.10.2010 14:13
Ищу ШИМ контроллер serb-radio Информация по радиокомпонентам 1 16.02.2010 21:10
не работает ШИМ в контроллере 40inD Proteus 10 11.01.2010 00:22
Регулятор шим для шд5 Pavelrb Автоматика и аппаратура связи 6 27.12.2008 22:34


Часовой пояс GMT +4, время: 14:34.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot