Atmega168PA, глюк с TCNT1H TCNT1L ?

Обсуждаем контроллеры компании Atmel.
Alex_Soroka
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 15, 2016 09:39:20

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Alex_Soroka »

akl писал(а):Не позорьтесь. :facepalm:
вот вы и не позорьтесь.

Я программы на ассемблере первые свои написал в 1984 году.
и с тех пор пишу. На Асме и на С (больше) и смотрю что компилятор в Асм ложит, так что не надо сказок мне.

Я после С проверил листинг Асма который родился - нигде там не трогается эти регистры, кроме мест которые у меня прописаны(см. прогу выше). "Однократного счета" в даташите не написано, как не читай.
Реклама
Alex_Soroka
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 15, 2016 09:39:20

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Alex_Soroka »

uk8amk писал(а):Почему у нас всё работает на атмега48-88-168-328?
потому что вы невнимательны.

у вас
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение uk8amk »

По порядку:
вот программа ниже - НЕ работает - нет прерывания каждые 0.5сек.
В чем я не прав? Это таки глюк Атмела ?
Не будет считать полсекунды.
Режим счёта Normal считает от 0x0000 до 0xFFFF. Вы делаете вручную предварительную загрузку значения в счётный регистр TCNT1=0xF0BE. Тогда счётчик этот цикл считает от 0xF0BE до 0xFFFF(3906 тактов = полсек), когда счётный регистр переполняется(TOV1), тогда следующий цикл начинается со значения 0x0000. Теперь до переполнения надо посчитать 65536 тактов, что намного больше полсекунды. В первом варианте программы вы делаете принудительное обновление счётного регистра в прерывании значением 0xF0BE при каждом переполнении. Во втором варианте счётчик считает от 0x0000 до 0xFFFF.
НО... не все аппаратные узлы в полном объеме и по-разному в разных версиях симулятора.
Я говорю не про симулятор. Хотя симулятор даже в старой доброй AVRStudio весьма качественный.
Так вот студия без проблем коннектится к реальной макетке. Правда к совсем древним камушкам вроде атмега8 подсоединиться не выйдет из-за отсутствия OCD.

потому что вы невнимательны.
у вас
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
Что вас смущает? Что же там ещё должно быть для режима CTC?
Или вы всё равно хотите через TOV1? Нормально не получится.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Z_h_e »

Если Вы программируете с 1984 года, трудно догадаться добавить тестовых команд? Сделать другой код, например, в котором не используются прерывания, а просто пин меняет свое состояние при переполнении счетчика в цикле и больше ничего не делает. Передавать по UART состояние различных регистров? Использовать debugWIRE? Попробовать в симуляции среды разработки поглядеть состояние счетчиков и других регистров? Но почему то Вам проще писать в Атмел...

Каким образом Вы определили, что счетчик останавливается, если Вы не делали отладку? Может Вы висите в прерывании? А может Вы код для другого контроллера компилируете? Всяко бывает.
Вы не выложили весь код, как Вам тут могут помочь ? Если Вы пишите программы с 1984 года, то неужели трудно догадаться, что надо выкладывать более полную информацию, чтобы Вам кто-то чем-то помог?

Выкладывайте полностью Ваш код, в котором якобы останавливается счетчик или обсуждать эту тему дальше не имеет смысла.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Alex_Soroka
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 15, 2016 09:39:20

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Alex_Soroka »

uk8amk писал(а):По порядку:
Не будет считать полсекунды.
Режим счёта Normal считает от 0x0000 до 0xFFFF. Вы делаете вручную предварительную загрузку значения в счётный регистр TCNT1=0xF0BE. Тогда счётчик этот цикл считает от 0xF0BE до 0xFFFF(3906 тактов = полсек), когда счётный регистр переполняется(TOV1), тогда следующий цикл начинается со значения 0x0000. Теперь до переполнения надо посчитать 65536 тактов, что намного больше полсекунды. В первом варианте программы вы делаете принудительное обновление счётного регистра в прерывании значением 0xF0BE при каждом переполнении. Во втором варианте счётчик считает от 0x0000 до 0xFFFF.
вот... :shock:
похоже в этом и есть дело... Спасибо за обьснение !
...техподдержка Атмела до этого почему-то не доперла...

потому что вы невнимательны.
у вас
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
Что вас смущает? Что же там ещё должно быть для режима CTC?
Или вы всё равно хотите через TOV1? Нормально не получится.
смущает что "ногу будет дергать".
сейчас опять буду все перечитывать заново про Таймер1 и на плате реальной проверять.

не думал я что "по переполнению" теперь таким геморроем станет...
кстати - в ATmega324PA - все путем, в "нормал" режиме Таймера1 ничего перезаписывать в таймер при прерывании не надо. один раз в "майн" вначале настроил и всё.
Видимо я "пересев" на ATmega324PA забыл про "особенности" 168-го... старею 8)
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Z_h_e »

Alex_Soroka писал(а):не думал я что "по переполнению" теперь таким геморроем станет...
кстати - в ATmega324PA - все путем, в "нормал" режиме Таймера1 ничего перезаписывать в таймер при прерывании не надо. один раз в "майн" вначале настроил и всё.
И тут Вы неправы. Точно так же работает счетчик и в нем. Да и откуда счетчику знать, при переполнении в регистр TCNT надо установить значение отличное от нуля? Регистров предустановки нет тут. Как Вам уже писали, лучше всего использовать режим CTC. Счетчик будет считать от нуля до значения регистра OCR1A, при совпадении сбросится, установится флаг переполнения.
---------------------
На счет флага переполнения ошибся. В режиме СТС он устанавливается так же, как и в нормальном. Это в других режимах переполнение может возникать раньше чем счетчик досчитал до максимума. Нужно будет прерывание TIMER1 COMPA.
Последний раз редактировалось Z_h_e Пт сен 09, 2016 11:06:39, всего редактировалось 1 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Alex_Soroka
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Пт апр 15, 2016 09:39:20

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Alex_Soroka »

Z_h_e писал(а):И тут Вы неправы. Точно так же работает счетчик и в нем
мне плевать - я в свой код смотрю и верю тому что вижу.
И в работающей плате вижу что РАБОТАЕТ.
...вы бы даташит почитали, он отличается от 168го.

----- start my code for ATmega324PA -----
...
#include <io.h>
#include <delay.h>
#include <stdlib.h>
...

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
...
mu code here...
...
}

void main(void)
{
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// -------------- Timer 1 -------------------------
// Clock source: System Clock
// Clock value: 125,000 kHz (clk/64 (From prescaler))
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected // OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,5 s
// Timer1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10); // clk/64 (From prescaler)
TCNT1H=0x0B;
TCNT1L=0xDC;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (1<<TOIE1);
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);

// External Interrupt(s) initialization
EICRA=(0<<ISC21) | (0<<ISC20) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT2) | (0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE3) | (0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);

...
my code here...
...
}
--------end-----------


Всем спасибо за внимание к теме. :))
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение uk8amk »

смущает что "ногу будет дергать".
С какого перепугу? Разве если только специально так настроить.
Регистры TCCR
Биты WGM Waveform Generation Mode - определяют режим счёта.
Биты COM Compare Output Mode - настраивают режим работы линии порта.
COM1A1/COM1B1 COM1A0/COM1B0 Description
0 0 Normal port operation, OC1A/OC1B disconnected.
Это означает что вне зависимости от состояния счётчика и сгенерированных событий выводы порта работают как GPIO.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Z_h_e »

Почитал, до того как Вам написать об этом. Нет в 324 предустановки. Укажите где в ДШ есть описание что регистр TCNT может быть загружен неким значением без вмешательства программы.

Если бы Вы сразу написали, что у Вас идут прерывания не с той частотой, Вам бы тут же указали почему это происходит. Вы же писали об их отсутствии.

-----
А Вы поглядите значение регистров TCNT сразу после прерывания. И в 324 будет 0. Счетчик при переполнении сбрасывается.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: Atmega168PA, глюк с TCNT1H TCNT1L ?

Сообщение Alkul »

uk8amk писал(а):
смущает что "ногу будет дергать".
С какого перепугу? Разве если только специально так настроить.
Биты COM Compare Output Mode - настраивают режим работы линии порта.
Я автору об этом уже писал.
Но он или невнимательно читает, или не хочет понимать.
Ответить

Вернуться в «AVR»