Зависит от режима работы.
При "ручном" останове текущее содержимое таймера не изменится (если момент останова не совпадет с соответствующей точкой работы таймера - например сброс по совпадению).
Насчет обнуления - это только или по сбросу или по выходу из сна оговорено - смотрим соответствующий раздел даташита.
[uquote="a1000",url="/forum/viewtopic.php?p=3909218#p3909218"]... Установив биты предделителя CS12 – CS10 в "000" мы останавливаем таймер. При этом TCNT1 обнуляется? Если опять запустить счёт он продолжится со значения в момент остановки или начнётся с нуля?[/uquote]Да, таймер останавливает счёт. Предделитель нет! При последующем запуске продолжение счёта в моменты переполнения предделителя.
Сидел разбирался с кодом akl. Напишу, что я понял и свои вопросы. Стартовая инициализация. Вы убрали очистку ОЗУ. Вы считаете это лишним, или спрятали что-бы не загромождать код? С настройками таймера понятно - счётчик стоит, прерывания по захвату разрешены, предделитель сброшен. В R22 заготовка для TCCR1B. Основной цикл. Пока Т=0 - крутимся вначале. Прерывание. По первому заходу всё ясно - запускаем счётчик, сбрасываем флаг из R30 и в основной цикл. А вот второй заход (с переходом на метку ZAHVAT) мне не совсем понятен. Я бы сократил его до
А там все необходимые настройки таймера и флагов уже прописаны. Так-что все манипуляции с регистрами в прерываниями я считаю излишними.
И последний вопрос. Если вы убрали очистку ОЗУ из блока стартовой инициализации, что очистит TCNT1?
[uquote="a1000",url="/forum/viewtopic.php?p=3909483#p3909483"]...убрали очистку ОЗУ из блока стартовой инициализации, что очистит TCNT1?[/uquote]Область адресов RAM и область регистров I/O разные. А так, да просто не включил при инициализации
Про внешние прерывания..
Там написано что прерывания осуществляются от пинов: INT0 и PCINT0....PCINT5. с последними все понятно... но вот INT0 на каком выводе ???
Или я чтото не понял...?
Всем доброго дня. Завалялось у меня несколько штук attiny261, ради интереса решил попробовать запустить PWM6 Mode. Даташит изучал как мог, с помощью гуглопереводчика. Попробовал в протеусе - на выходах сигнала нет. В железе еще не собирал.. Подскажите, где ошибка? CKSEL fuses 0001, SUT1..0 = 10.
Код инициализации таймера1 под спойлером.
Всем счастливого нового года!
Прикупил на али такую приблуду
Называется LED-матрица 8x8 с драйвером max7219. Поигрался с ней в среде Arduino и решил запустить её на ASM. МК atmega8. Включение отдельных пикселей реализовал без проблем. Решил сделать бегущий огонёк в первой строке. Вот код
Спойлер
Попробовал поменять РВ2 на РВ1 и РВ0 - вообще не запустилось. Включает тестовый режим и всё. Это когда светят все пиксели. Убрал дёрганье ножкой между посылкой первого и второго байта - стало работать как надо на РВ2.
В процессе дальнейшего копания возникла ещё одна проблемка. Попробовал сделать кольцевой сдвиг символа влево. Задумка такова - в оперативке по метке Kod зарезервировано 8 байт. Там лежит построчно закодированный символ. Temp5 - счётчик и указатель на номер строки при передаче. Они совпадают. Извлекаем в Temp6 первый байт, отправляем в max7219, выполняем кольцевой сдвиг и возвращаем в оперативку с пост-инкрементом и снова по кругу. Получился такой код
Спойлер
BOB хотел сказать, что ваши 8 байт являются видеопамятью. Каждые Х мС времени подпрограмма вывода выводит всё содержимое этой видеопамяти в ваш модуль 8Х8. А вы, когда ВАМ надо эту видеопамять модифицируете.
Легче заново набросок сделать, чем в чужом, фрагментами представленном коде, разбираться.
Тем более, что в данном случае надо еще и к даташиту на MAX7219 плотненько возвернуться. Да со структурой привязки пикселей уточнить (теоретически там 8 колонок по 8 вертикальных точек в колонке - блок данных "на боку" - в наличии такой матрицы на данный момент нету за ненадобностью - могу лишь "теоретизировать").
Да и МК для меня не "базовый" - хотя в примитиве с программным SPI что на тиньку2313, что на мегу8 лаподрыг особо отличаться не должен...
Разве что без привязки к МК то уже библиотечка получается...
BOB51 писал(а): более рационально менять содержимое буфера видеопамяти, а затем делать пакетный вывод
Тогда надо будет вытащить байт из оперативки, модифицировать, вернуть обратно, а потом ещё раз вытаскивать для отправки. Как по мне - вытащил, отправил, модифицировал, вернул более оптимально. По поводу
BOB51 писал(а):в данном случае надо еще и к даташиту на MAX7219 плотненько возвернуться. Да со структурой привязки пикселей уточнить
это всё не нужно. По работе с MAX7219 вопросов нет. Вывод реализован без вопросов. Вопрос в модификации. Почему после первого прохода я получаю из оперативки немодифицированные данные?
Вообще-то данные из ячейки видеобуфера вытаскиваются однократно на каждое обращение к СБИС контроллера.
Тем более, что у АВРок косвенное чтение памяти имеется.
А вот отсылка блока из двух байт при каждом обращении к СБИС (адрес и данные) выполняется.
Полный цикл - пересылка блока 8*2=16 байт по SPI заметно длиннее всех имеющихся обращений к ОЗУ.
Касательно обработки содержимого видеобуфера - это уже на усмотрение автора.
В зависимости от задачи можно обработку и в регистровом файле делать.
Допустим блок видеобуфера в ОЗУ имеет вот такое размещение:
а вот относительно дисплея... шаблон развернется "боком":
Это как первая подсказка к алгоритму обработки.
И еще одно замечание -
Если для циклических процессов (бегущие точки или полоски, разнообразные сдвиги) еще можно применить программные решения, то для версий мультипликации гораздо выгоднее применять ряд из "кадров", размещенных или в ПЗУ или во внешней ЕЕПРОМ.