| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Atmega162 Timer1 и Timer3 работаю по разному
02.07.2014, 16:56
|
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от vynt
|
И у меня 7.1sp0 (но зарегина на другое имя). Где брал уже не помню, не один год уже прошёл. Таких глюков не разу не наблюдал
|
А если я Вам выгружу .cof, можете у себя запустить?
PS. Весь проект во вложении.
|
|
|
|
02.07.2014, 17:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от qweentet
|
А если я Вам выгружу .cof, можете у себя запустить?
PS. Весь проект во вложении.
|
проверил, и cof и hex. частота разная
Проект под CodeVision? Плохо его знаю. Но, если это возможно отключите всю оптимизацию
Последний раз редактировалось vynt; 02.07.2014 в 17:09.
|
|
|
|
02.07.2014, 19:19
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Ха. Оказывается мне просто повезло, я не в точности повторил Вашу инициализацию. При значениях TCCRnB= 0,1,2 частота таймеров совпадает. При TCCRnB=3 - разница в 2 раза, при TCCRnB=4 уже в 4 раза, ну и далее удваивается...
Либо DS врёт, либо мы с вами где-то что-то мелким шрифтом не прочитали...
Например это "Note that in ATmega161compatibility mode, only one 16-bits Timer/Counter is available (Timer/Counter1)."
х.з. как там себе протеус устанавливает этот "compatibility mode".
Но, если загвоздка в этом, то читать нужно уже другой DS
Последний раз редактировалось vynt; 02.07.2014 в 19:21.
|
|
|
|
02.07.2014, 19:51
|
|
|
Частый гость
Регистрация: 17.06.2014
Сообщений: 30
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от vynt
|
Попробуйте так переписать инициализацию
|
PHP код:
|
void TIM1_Init(void){
TCCR1B=0x00; //мало ли что тут уже есть...
TCCR1B|=(1‹‹CS10)|(1‹‹CS11); //Устанавливаем предделитель 64
TCCR1B|=(1‹‹WGM12);
}
|
а вот как рекомендовано в DS устанавливать TCNTn
|
PHP код:
|
void TIM16_WriteTCNTn( unsigned int i )
{
unsigned char sreg;
unsigned int i;
/* Save Global Interrupt Flag*/
sreg = SREG;
/* Disable interrupts*/
_CLI();
/* Set TCNTnto i */
TCNTn= i;
/* Restore Global Interrupt Flag*/
SREG = sreg;
}
|
Обратите внимание на сохранение/восстановление регистра SREG и запрет всех прерываний. В противном случае, TCNTn насколько я знаю, безопасно можно менять только внутри обработчика соответствующего прерывания. А вообще, я обычно так делаю (пример):
|
PHP код:
|
void timer0_init(void)// WGM: Normal
{
TCCR0 = 0x00; //stop
TCNT0 = 0xD5; //setup
OCR0 = 0x2B; //
TCCR0 = 0x04; //start+preskale=256
}
|
Далее, в отдельной функции устанавливаю маску всех используемых прерываний и разрешаю их все (sei). По ходу работы, программа больше к этим функциям не обращается.
з.ы.
по отрывочным кускам кода довольно сложно определить в чём загвостка, нужен проект целиком
з.з.ы.
кстати, пример про TCNTn целиком взят из DS, и в нём есть ошибка! найдёте?..
|
ошибка в том, что переданный параметр i, создается еще и внутри функции, в итоге он будет браться за значение...=)
|
|
|
|
02.07.2014, 21:03
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Верно. В корпорациях документацию тоже люди пишут. Copy-Paste, Copy-Paste
И таблички 57 и 58 могли так же заполнить...
з.ы.
надо с атмеловского сайта DS свежий скачать, глянуть что там
з.з.ы.
скачал - всё то же
Последний раз редактировалось vynt; 02.07.2014 в 21:13.
|
|
|
|
02.07.2014, 21:13
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Кстати, CodeWizard интересно генерит код инициализации для таймеров 1 и 3. Лишее удалил.
|
Код:
|
/ Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 115,200 kHz
TCCR1B=(0‹‹CS12) | (1‹‹CS11) | (1‹‹CS10);
// Timer/Counter 3 initialization
// Clock value: 115,200 kHz
TCCR3B= (1‹‹CS32) | (0‹‹CS31) | (1‹‹CS30); |
|
|
|
|
02.07.2014, 22:02
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 02.03.2011
Адрес: Россия, КБР
Сообщений: 629
Сказал спасибо: 108
Сказали Спасибо 596 раз(а) в 334 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от Ara41
|
|
Кстати, CodeWizard интересно генерит код инициализации для таймеров 1 и 3.
|
Видать опирается на факт а не описание в DS
|
|
|
|
02.07.2014, 22:25
|
|
|
Гражданин KAZUS.RUN
Регистрация: 16.06.2005
Сообщений: 942
Сказал спасибо: 25
Сказали Спасибо 174 раз(а) в 123 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от niXto
|
|
Во всех АВР из последнего обновления (пикоповерных) есть аппаратная инверсия портов через регистр ПИН. Читайте внимательней
|
Ну с пикоповерными пока работать не доводилось, потому и просил ссылку, почитать про то, чего ранее не видел.
Сообщение от vynt
|
|
Таки так можно сказать о любом глюке в программе
|
Именно! Мне повезло с моим первым начальником. Когда я в 2002 начинал работать с контроллерами, находил массу ошибок то в компиляторах, то в железе, например не так ацп работал или таймер, вот мол, сами смотрите, он не смотрел, а сразу посылал - иди ищи ошибку в программе, читай документацию. И таки смог донести до меня что 99.5% неправильной, неустойчивой, странной работы или не работы, "ошибок" в ядре контроллера, глюков компилятора - это всё в мозгах программиста. Просто потому что тысячи людей по всему миру решали задачи по использованию периферия контроллера и у них всё было нормально. Ну а с 2002 количество человеко-часов потраченных на работу с архитектурой авр вероятно исчисляется миллионами, так что процент имхо составляет уже 99.99 для старых архитектур.
Сообщение от vynt
|
|
А макрос как раз "^=" и делает.
|
Ну уж я-то это понял, сам давно разными макросами пользуюсь, подогнав под себя и теперь из проекта в проект кочуют. Но вот понял ли этот макрос топик-стартер и стал ли он в нём разбираться вообще?
Сообщение от qweentet
|
|
т.е. произошло прерывание, выставили 1, в следующий раз наоборот, потом множил на 2)
|
А операцией "^=" ты именно это и делаешь. Это операция инверсии. Был 0, случилось прерывание, 0 стал 1, снова пришло прерывание - 1 стала 0. Вот только зачем на 2 умножать? Время между сменами уровней - это период прерывания. Для получения значения частоты надо 1/Т. И никакой "микропродолжительности" ты не получишь. При инвертировании раз в прерывание у тебя всегда длительность 1 будет равна длительности 0.
|
|
|
|
03.07.2014, 10:45
|
|
|
Вид на жительство
Регистрация: 09.12.2009
Адрес: Россия, Тула
Сообщений: 376
Сказал спасибо: 191
Сказали Спасибо 153 раз(а) в 98 сообщении(ях)
|
Re: Atmega162 Timer1 и Timer3 работаю по разному
Сообщение от Someone
|
|
Да ну? А ссылочку на страницу даташита можно?
|
Гы... Ребята, ну это ж не даташит на STM32... Неужто так лениво открыть страницы для I/O PORT (PIN).
Ну даю страницу 64 в даташите ATmega48:
Toggling the Pin Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn. Note that the SBI instruction can be used to toggle one single bit in a port.
|
|
|
|
Сказали "Спасибо" krug_vv
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:11.
|
|