Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2013, 19:21   #1
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Восклицание Генератор на Atmega8 (AVR). Код на C

Доброго времени суток.
Возникла потребность собрать генератор испульсов на Atmega8.

Использую самописную функцию для микросекундных задержек

Код:
#define TIKS_1MS (10000000/64/1000)
#define TIKS_1US (TIKS_1MS/500)

void sleep_us(unsigned long int us)
{
   while(us--){
      TCNT0 = 0;
      while(TCNT0 < TIKS_1US);
   }
}

int main(void){
TCCR0 = (1<<CS02);

int i;
for(i = 0; i<5; i++){
  sleep_us(83);
}
Что не так в даном коде? Использую один из таймеров Atmeg'и, Предделитель 64, кварц 10Mhz

Тот же пример для милисекундных задержек

Код:
#define TIKS_1MS (10000000/64/1000)

void sleep_ms(unsigned long int ms)
{
   while(ms--){
      TCNT0 = 0;
      while(TCNT0 < TIKS_1MS);
   }
}

int main(void){
TCCR0 = (1<<CS02);

int i;
for(i = 0; i<5; i++){
  sleep_ms(100);
}

Последний раз редактировалось dem66; 28.01.2013 в 20:07.
dem66 вне форума Ответить с цитированием
Старый 28.01.2013, 20:39   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Код:
#define TIKS_1MS (10000000/64/1000)
#define TIKS_1US (TIKS_1MS/500)
10000000 / 64 / 1000 == 156
156 / 500 == 0
А чем _delay_us не устраивает? Или в цикле ещё что-то будет?

Последний раз редактировалось Somebody; 28.01.2013 в 20:43.
Somebody вне форума Ответить с цитированием
Старый 28.01.2013, 20:42   #3
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

Так как мне подправить код для работы с микросекундами?
dem66 вне форума Ответить с цитированием
Старый 05.02.2013, 00:38   #4
Volfer
Новичок
Джуниор
 
Аватар для Volfer
 
Регистрация: 04.02.2013
Сообщений: 1
По умолчанию

Код:
while(условие)
{
  PORTA.0 = 0;
  delay_us(17);
  PORTA.0 = 1;
  delay_us(83);
}
Можно, конечно, через ШИМ, но если не нужно заморачиваться, то... вполне работает.
Volfer вне форума Ответить с цитированием
Старый 05.02.2013, 08:22   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

А можно нескромный вопрос, зачем вам сей велосипед? Там же есть специальная ножка, выводящая тактовые импульсы.

Цитата:
Сообщение от Atmega8 Datasheet
Depending on the clock selection fuse settings, PB7 can be used as output from the inverting
Oscillator amplifier
При необходимости ставите на выходе этой ножки делитель частоты (двоичный счетчик).

Цитата:
Сообщение от dem66
sleep_us(83);
Это ОЧЕНЬ плохо. Если желаете решать задачу программно - в Атмегах есть прерывания по таймеру, лучше воспользуйтесь ими.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 05.02.2013 в 08:40.
ROD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ШИМ для мк atmega8 pimple2006 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.02.2012 04:11
генератор из txt в xml-код Di_Noskova Фриланс 3 23.12.2011 11:26
програматор для ATmega8. все это длля чайника! pufystyj Микроконтроллеры, робототехника, схемотехника, 3D принтеры 14 28.05.2011 00:57
Аналог ATmega8-16PU PDIP28 iukash Компьютерное железо 20 16.09.2010 23:58
AVR Sparky Микроконтроллеры, робототехника, схемотехника, 3D принтеры 6 31.12.2009 16:53