МикроКонтроллер AVR начинающим - общие вопросы

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение SSG » 04 май 2008, 20:52

В некоторых АВРках есть режимы в которых верхнее значение можно задавать. А так, как уже и сказали аксакалы, :) только вручную в начале процедуры обработки прерывания по совпадению в счетный регистр таймера ноль записывать. И таймер начнет барабанить с нуля, а процедура будет себе выполняться. И им будет глубоко друг на друга все равно :).
I live My life!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Fox89 » 04 май 2008, 21:31

у часов вот такой обработчик прерывания:
Код: Выделить всё
// Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)    //Прерывание происходит 100 раз в сек, сохраняем в глобальные переменные текущее время
{
TCNT1H=0x00;
TCNT1L=0x00;
milliseconds++;
}

часы отстают в сутки на полторы минуты. Кварц 16 МГц, тинька2313, прерывания 100 раз в сек.
Даже если на каждом прерывании терять по 10 тактов - то не должно быть такой погрешности. Кварц дохлый или грабли в другом месте? Собственно вопросы были по этой причине
Fox89
 
Сообщения: 57
Зарегистрирован: 11 ноя 2007, 20:12
Откуда: урал

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение avr123.nm.ru » 04 май 2008, 21:40

Точная подгонка времени описана в задаче 6 курса ! http://avr123.nm.ru/z6.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Fox89 » 05 май 2008, 04:45

avr123.nm.ru писал(а):Точная подгонка времени описана в задаче 6 курса ! http://avr123.nm.ru/z6.htm

указанный способ не подходит. Во первых часы отстают а это значит что придется изменять параметры таймера, а во вторых этих NOP будет слишком много, да и кварц не термостатирован, что означает что корректирующую величину придется менять в зависимости от условий эксплуатации. В данному случае проще ввести корректировку времени 4 раза в сутки добавляя или вычитая настраиваемую константу.
Fox89
 
Сообщения: 57
Зарегистрирован: 11 ноя 2007, 20:12
Откуда: урал

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Master » 09 май 2008, 00:48

Хелп, нимагу понять, есть у меня Mega8, я двумя кнопками подключенными к прерываниям включаю и выключаю ШИМ на ножке В2, включается он очень даже на ура, а вот после выключения ШИМа на порте остается то высокий, то низкий уровень.
Код: Выделить всё
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)  //ПУСК
{
PORTC.2=0;  //отключаем реле торможения
delay_ms(PauseTormoz);  //пауза на срабатывание реле

PORTC.1=1;  //включаем реле пуска
delay_ms(PausePusk);  //пауза на срабатывание реле

TCCR1B=0x09;  //запускаем ШИМ 
delay_ms(200);  //пауза для устранения дребезга контактов   
}

// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)  //СТОП
{
TCCR1B=0x08;  //останавливаем ШИМ 
delay_ms(1);  //пауза на всякий случай
PORTC.1=0;  //отключаем реле пуска
delay_ms(PausePusk);  //пауза на срабатывание реле

PORTC.2=1;  //включаем реле торможения
delay_ms(PauseTormoz);  //пауза на срабатывание реле

delay_ms(200);  //пауза для устранения дребезга контактов 
}


Добавлено спустя 1 минуту 9 секунд:
Причем вставка после выключения ШИМа сточки
Код: Выделить всё
PORTB.2=0;
не помогает.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение rig » 09 май 2008, 09:49

так ты шим скорей всего останавливаешь в случайном состянии. отсюда то 1 то 0 на выходе. выходы Порта сконфигурированы как шим и программированию типа порт=1 или 0 не поддаются.
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Master » 09 май 2008, 10:44

Да наверное так и получается, просто в протеусе всегда ШИМ отключается в состоянии "0".
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Master » 09 май 2008, 22:57

Блин все равно не получается, уже уменьшаю ШИМ до нуля, останавливаю таймер, но никакого результата, при ШИМе 100% после выключения на ножке все равно высокий уровень.
Код: Выделить всё
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)  //СТОП
{
OCR1B=0x00;  //уменьшаем ШИМ до нуля
TCCR1B=0x08;  //останавливаем ШИМ 
delay_ms(1);  //пауза на всякий случай
PORTC.1=0;  //отключаем реле пуска
delay_ms(PausePusk);  //пауза на срабатывание реле

PORTC.2=1;  //включаем реле торможения
delay_ms(PauseTormoz);  //пауза на срабатывание реле

delay_ms(200);  //пауза для устранения дребезга контактов 
}
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение rig » 10 май 2008, 00:37

уже лучше? только высокий на ножке?
выход шим случайно не инверстный, и какой МК?
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Master » 10 май 2008, 11:39

Выход не инверсный, МК Mega8 кварц 16 МГц, получается что вероятность появления высокого уровня прямопропорциональна величине ШИМ :(
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Master » 11 май 2008, 00:58

Короче нашел в чем проблема, это даже наверное из раздела грабли, все прошло после того как я вставил паузу в 1мс.
Код: Выделить всё
OCR1B=0x00;  //уменьшаем ШИМ до нуля
delay_ms(1);  //БЕЗ ЭТОЙ ПАУЗЫ НИФИГА НЕ РАБОТАЕТ ШИМ ОСТАНАВЛИВАЕТСЯ В ВЫСОКОМ ПОЛОЖЕНИИ
TCCR1B=0x08;  //останавливаем ШИМ
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение SSG » 11 май 2008, 08:23

А можно еще, на крайняк, в регистр сравнения писать число, при котором ШИМ 0%.
I live My life!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение Master » 11 май 2008, 10:32

А это что еще за регистр такой?
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение SSG » 12 май 2008, 22:23

ну, блин, OCR (Output Compare Register) там какой-нибудь OCR1A, OCR1B и протча. Если там ноль, то и на ножке будет ноль, а если там максимальное значение, то на выходе будет 1.
I live My life!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: МикроКонтроллеры начинающим - общие вопросы

Сообщение rig » 12 май 2008, 23:51

Master, вообщето отвечая на твои вопросы я думал ты представляешь как шим работает через таймеры. :pardon:
Аватара пользователя
rig
 
Сообщения: 1437
Зарегистрирован: 03 авг 2007, 19:43
Откуда: Екатеринбург
прог. языки: Си, асм со словарем

Пред.След.

Вернуться в Микроконтроллеры

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

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