roboforum.ru

Технический форум по робототехнике.

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

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

SSG » 04 май 2008, 20:52

В некоторых АВРках есть режимы в которых верхнее значение можно задавать. А так, как уже и сказали аксакалы, :) только вручную в начале процедуры обработки прерывания по совпадению в счетный регистр таймера ноль записывать. И таймер начнет барабанить с нуля, а процедура будет себе выполняться. И им будет глубоко друг на друга все равно :).

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 тактов - то не должно быть такой погрешности. Кварц дохлый или грабли в другом месте? Собственно вопросы были по этой причине

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

avr123.nm.ru » 04 май 2008, 21:40

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

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

Fox89 » 05 май 2008, 04:45

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

указанный способ не подходит. Во первых часы отстают а это значит что придется изменять параметры таймера, а во вторых этих NOP будет слишком много, да и кварц не термостатирован, что означает что корректирующую величину придется менять в зависимости от условий эксплуатации. В данному случае проще ввести корректировку времени 4 раза в сутки добавляя или вычитая настраиваемую константу.

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;
не помогает.

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

rig » 09 май 2008, 09:49

так ты шим скорей всего останавливаешь в случайном состянии. отсюда то 1 то 0 на выходе. выходы Порта сконфигурированы как шим и программированию типа порт=1 или 0 не поддаются.

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

Master » 09 май 2008, 10:44

Да наверное так и получается, просто в протеусе всегда ШИМ отключается в состоянии "0".

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);  //пауза для устранения дребезга контактов 
}

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

rig » 10 май 2008, 00:37

уже лучше? только высокий на ножке?
выход шим случайно не инверстный, и какой МК?

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

Master » 10 май 2008, 11:39

Выход не инверсный, МК Mega8 кварц 16 МГц, получается что вероятность появления высокого уровня прямопропорциональна величине ШИМ :(

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

Master » 11 май 2008, 00:58

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

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

SSG » 11 май 2008, 08:23

А можно еще, на крайняк, в регистр сравнения писать число, при котором ШИМ 0%.

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

Master » 11 май 2008, 10:32

А это что еще за регистр такой?

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

SSG » 12 май 2008, 22:23

ну, блин, OCR (Output Compare Register) там какой-нибудь OCR1A, OCR1B и протча. Если там ноль, то и на ножке будет ноль, а если там максимальное значение, то на выходе будет 1.

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

rig » 12 май 2008, 23:51

Master, вообщето отвечая на твои вопросы я думал ты представляешь как шим работает через таймеры. :pardon:


Rambler\'s Top100 Mail.ru counter