Atmega128 не работают таймеры 1 и 3
- Войдите на сайт для отправки комментариев
Ср, 18/12/2019 - 00:05
Столкнулся с проблемой, написал скетч для регулятора мощности, с платой nano все работает, а вот с платой на базе atmega128 не работает вылетает куча ошибок пробовал и таймер 3, но он тоже не работает, работает только второй таймер, но на нем не работает регулятор мощности так как таймер 2 в миллисекундах а нужен период во 40 микросекунд, перерыл весь интернет и ничего путевого не нашел.
C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp: In member function 'void TimerOne::attachInterrupt(void (*)(), long int)': C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp:117:3: error: 'TIMSK1' was not declared in this scope TIMSK1 = _BV(TOIE1); // sets the timer overflow interrupt enable bit ^ C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp: In member function 'void TimerOne::detachInterrupt()': C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp:125:3: error: 'TIMSK1' was not declared in this scope TIMSK1 &= ~_BV(TOIE1); // clears the timer overflow interrupt enable bit ^ C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp: In member function 'void TimerOne::start()': C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp:143:3: error: 'TIMSK1' was not declared in this scope TIMSK1 &= ~_BV(TOIE1); // AR added ^ C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp:144:3: error: 'GTCCR' was not declared in this scope GTCCR |= _BV(PSRSYNC); // AR added - reset prescaler (NB: shared with all 16 bit timers); ^ In file included from c:\program files (x86)\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0, from C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.h:39, from C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp:39: C:\Users\USER\Documents\Arduino\libraries\TimerOne-r11\TimerOne.cpp:144:16: error: 'PSRSYNC' was not declared in this scope GTCCR |= _BV(PSRSYNC); // AR added - reset prescaler (NB: shared with all 16 bit timers); ^ exit status 1 Ошибка компиляции для платы ATmega128.
пробовал разные библиотеки, а так же CyberLib.h, но на данной плате не могу запустить этот простейший код, может кто сталкивался, помогите решить проблему.
У Атмеги 128 таймеры устроены немного по другому и библиотека TimerOne не подходит. Либо ищите библиотеку таймеров для вашего контроллера или почитайте даташит и работайте с таймером напрямую без библиотеки.
Да вот в том то и проблема не могу найти подходящую библиотеку, а работать с таймерами напрямую, знаний не хватает...
Да вот в том то и проблема не могу найти подходящую библиотеку, а работать с таймерами напрямую, знаний не хватает...
Решений, как всегда три:
1. прокачать знания (рекомендуется)
2. заказать в коммерческом разделе
3. забить
ну мало ли кто знает библиотеку еще с свободном доступе, поэтому и спросил
ну мало ли кто знает библиотеку еще с свободном доступе, поэтому и спросил
Да настроить таймеры, что бы генерили прерывания через нужные промежутки совсем не сложно. В сети полно объяснений как это делается, если лень даташит читать.
Да вот в том то и проблема не могу найти подходящую библиотеку, а работать с таймерами напрямую, знаний не хватает...
Решений, как всегда три:
1. прокачать знания (рекомендуется)
2. заказать в коммерческом разделе
3. забить
надо прокачать, даже IRINKA прокачивает )))
И воспользоваться готовой библиотекой:
ConstTimers.h
Вот, например
Сейчас пробую переписать библиотеку первого таймера, скопировав ее и переименовав и с помощью даташита на мегу 128 пытаюсь переписать, хоть и много всего не понятного мне.
Сейчас пробую переписать библиотеку первого таймера, скопировав ее и переименовав и с помощью даташита на мегу 128 пытаюсь переписать, хоть и много всего не понятного мне.
А использовать библиотеку от ЕвгенийП религия не позволила?
я не находил такой библиотеки
Спасибо, код рабочий, кажется что в русской документации много не прописано. Вот например хочу установить делитель как в таймере TimerOne смотрю код установки:
Чем отличается 6 от 7 строки (условия одни и те же, действия разные) или
8 от 9 строки (тоже самое).
Откуда вот это число - 15624?
Спасибо, код рабочий, кажется что в русской документации много не прописано.
зачем нужна "русская документация" ? ее почти ни на одну библиотеку нет. Даже русские программисты часто пишут доки по английски, чтобы два раза не писать. Смотрите комменты в исходнике.
это не просто условия, в момень вычисления выражения в скобках значение cycles меняется
что то реально не то что ли делаю, попробовал пример, начал подставлять свои значения из таблицы описания микроконтроллера, но на скорость это никак не повлияло (каждую по отдельности пробовал).
это не просто условия, в момень вычисления выражения в скобках значение cycles меняется
то есть знак подчеркивания играет роль плейсхолдера?
то есть знак подчеркивания играет роль плейсхолдера?
при чем тут знак подчеркивания? Вы знаете, что означает выражение x-=3; ?
- а теперь попробуйте прочитать cycles>>=3
у меня такое ощущения, что вы многие контструкции Си впервые видите. Может для начала свой уровень прокачать, как уже выше советовали? тогда и подчеркивания перестанут казаться чем-то мистическим :)
Многие да, в первый раз, сейчас начал исправлять таймер, он начинает потихоньку работать (используя документацию и ошибки которые выдает компилятор), например
первое было второе стало.
А вот это по описанию, я нашел что это главный регистр счетчиков и таймеров, но ничего пододного в документации на мегу128 я не нашел, пока закомментировал, компилятор перестал ругаться, но на сколько это критично?
GTCCR=0; // Запускаем синхронно все таймера
Компилятор не знает об этой переменной
для 328 чипа знает, аддон MegaCore?
Верно, ничего другого не нашлось
По таймеру он нормально заработал и диммирование заработало
Верно, ничего другого не нашлось
По таймеру он нормально заработал и диммирование заработало
и чего бы ему не заработать )))
Сейчас опять вернулся к данному коду, начал проводить разные тесты, работать он заработал, но работает как то не так, во первых, если запустить 2 таймера в такой последовательности:
То таймер 2 не работает, а если поменять местами, то они работают оба но как то, как будто мешают друг другу, на MsTimer2 сидит обработка Serial.available() (а там сенсорный экран), и если запущен TimerNew, то нажатия на экран отрабатывают редко (но отрабатывают), если отключить TimerNew, то все работает как часы, не пойму в чем дело.
TimerNew это таймер 3 у которого исправлены 2 строки c TIMSK1 на TIMSK
Думал может дело в приоритете прерываний, попробовал TimerNew.initialize(1000); но ничего не изменилось, не пойму куда копать
ничего не изменилось, не пойму куда копать
это вы верно заметили, вам давно советовали прокачать знания - но "ничего не изменилось" - вы продолжаете использовать настройки таймеров как египетские заклинания. не понимая что к чему
В авр нет приоритета прерываний. Кто первый взял тот и в прерывании. И уже не отнимешь. Можно только отдать.
меня интересует пока не сам код, а хотя бы, то что при одновременной работе таймеров с прерываниями будут ли они друг другу мешать, как происходит сейчас или такого не должно быть, в прерывании для Serial там чтение порта и отсылка в порт, крошечного объема, и то только при нажатии на экран, а во втором прерывании вобще ничего нет, глюк проявляется только когда запущен именно этот таймер
посмотрел одну и вторую библиотеку и увидел что при использовании Atmega128 Timer2 использует TIMSK так же как и другая библиотека, в документации указано что у нее 2 16-разрядных таймера, но название второго не могу найти в официальной документации.
16-bit Timer/Counter (Timer/Counter1 and Timer/Counter3 )
The 16-bit Timer/Counter unit allows accurate program execution timing (event management), wave generation, and signal timing measurement. The main features are:
• True 16-bit Design (i.e.,Allows 16-bit PWM)
• Three Independent Output Compare Units
• Double Buffered Output Compare Registers
• One Input Capture Unit • Input Capture Noise Canceler
• Clear Timer on Compare Match (Auto Reload)
• Glitch-free, Phase Correct Pulse width Modulator (PWM)
• Variable PWM Period
• Frequency Generator
• External Event Counter
• Ten Independent Interrupt Sources (TOV1, OCF1A, OCF1B, OCF1C, ICF1, TOV3, OCF3A, OCF3B, OCF3C, and ICF3)
но название второго не могу найти в официальной документации.
http://ww1.microchip.com/downloads/en/DeviceDoc/doc2467.pdf
стр.132, 16-bit Timer/Counter Register Description
Так вот я совсем запутался, в MsTimer2 библиотеке для Atmega128 идет регистр управления TCCR2, во второй библиотеке TCCR1A, в документации указано 2 регистра: TCCR1A, TCCR3A
Но таймер MsTimer2 прекрасно работает, это как такое получается, там в таймере того кода... ничего лишнего.
Вот попытался запустить 2 таймера, первый работает второй нет, в чем причина, вроде все с документации
ETIMSK |= (1 << OCIE1A); // Enable CTC interrupt
Разобрался
Только так и не понял, почему в библиотеке MsTimer2, все не соответствует документации, но при этом он работает???
Кусок из кода:
И еще в этом коде:
Разве не ошибка делить на 2000000? Это получается что заданный интервал вырастет в двое или я не прав?
Вот, например
Скажите пожалуйста как понять эту запись, какой это интервал срабатывания? как его посчитать?
я так понимаю сделал прерывание по 1мкс, как теперь сделать 50, 100 и т.д.? и правильно ли я понял что сделал?
Так работает, 1с интервал, а как считать 1мкс или 1мс?
Так работает, 1с интервал, а как считать 1мкс или 1мс?
для 1 мс OCR1A = 31; видимо
Ну, вообще-то, приоритеты есть. Если одновременно (в течении одного такта процессора) случится несколько прерываний, то они будут вызываться в порядке приоритета. А так да, если обработчик начал работать, то пока он не закочится или внутри него явно не разрешить прерывания, то его прерывать не будут.
Если одновременно (в течении одного такта процессора) случится несколько прерываний, то они будут вызываться в порядке приоритета.
Где про это прочитать? А какое из одновременных прерываний будет главнее, PCINT, IRQ0 или CTC от таймера 1? Как это узнать?
Если одновременно (в течении одного такта процессора) случится несколько прерываний, то они будут вызываться в порядке приоритета.
Где про это прочитать? А какое из одновременных прерываний будет главнее, PCINT, IRQ0 или CTC от таймера 1? Как это узнать?
Хорош тролить дед! Буд-то сам не знаешь где. В даташите вестимо :
The complete list of vectors is shown in “Interrupts” on page 59. The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request 0.
The complete list of vectors is shown in “Interrupts” on page 59. The list also determines the priority levels of the different interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the External Interrupt Request 0.
Блаадарю. Не знал. Видимо, не дочитал до этого, потому думал, что у AVR все прерывания равнозначны, кроме Reset, естессна.
Ну, вообще-то, приоритеты есть. Если одновременно (в течении одного такта процессора) случится несколько прерываний, то они будут вызываться в порядке приоритета. А так да, если обработчик начал работать, то пока он не закочится или внутри него явно не разрешить прерывания, то его прерывать не будут.
Абсолютно согласен. Именно в течении одного такта процессора есть. Но событие настолько маловероятное, что я держу в памяти его наличие, а стараюсь писать так, чтобы в остальных случаях работало без приоритетов.
На самом деле не настолько маловероятное. В один такт если при нормальном исполнении программы. А вот если прерывания были запрещены, например потому, что обрабатывается какое-то другое, и за это время произошли события, которые должны были вызвать другие прерывания, то после разрешения прерываний (выходе из обработчика) "накопившиеся" прерывания будут вызываться один за другим в порядке приоритета.
Интересно, там счётчик бежит по регистру флагов каждый раз сначала или нет? Если, допустим, во время выполнения обработчика "высокоприоритетного" прерывания опять оно произойдёт, то следующим будет обрабатываться опять оно или нижележащее?
Логично, конечно, предположить, что "высокоприоритетное" будет постоянно блочить остальные - иначе зачем ему приоритетность...
Интересно, там счётчик бежит по регистру флагов каждый раз сначала или нет? Если, допустим, во время выполнения обработчика "высокоприоритетного" прерывания опять оно произойдёт, то следующим будет обрабатываться опять оно или нижележащее?
Логично, конечно, предположить, что "высокоприоритетное" будет постоянно блочить остальные - иначе зачем ему приоритетность...
Насколько я понимаю, то с начала, хотя не проверял. Но по выходу из прерывания выполняется, как минимум, одна команда основной программы. То есть выполнение основной программы полностью не блокируется при непрерывных прерываниях, хоть и здорово тормозится.
И снова согласен. Но имел в виду только одновременное срабатывание. Очереди прерываний нет. Если выставлено несколько, то после того как после выхода из прерывания выполнится одна команда программы механизм прерываний будет работать с "чистого листа" , делая переход на обработку прерывания с наивысшим приоритетом. Если он выставляется чаще низкоприоритетного то у низкоприритетного могут быть проблемы с вызовом.
Ну, в общем да. Но такая ситуация возможна только если более высокоуровневое прерывание случается в момент обработки его же непрерывно. А такой расклад это и так почти полная ж.. тут у же не до заботы о других прерываниях.
Чото я самниваютя и немогу согласиццо с некоторыми вищщами...
С INTх ладно, вроде согласен, но с остальным не очень. И по поводу ОДНОЙ (заветной) команды между векторами - а чем докажете??? Кто может побырику наваять скетч(328Р), шоб работали все таймеры (9 векторов) + два INT0,1 от собственного ногодрыга + АЦП в Free... ну и ещё что там осталось кроме PCINTx, они не интересны. В протеусе можно потактно логировать события, приходящие от процессора, вот и посмотрим на вашу теорию.