Зависит от режима работы. При "ручном" останове текущее содержимое таймера не изменится (если момент останова не совпадет с соответствующей точкой работы таймера - например сброс по совпадению). Насчет обнуления - это только или по сбросу или по выходу из сна оговорено - смотрим соответствующий раздел даташита.
... Установив биты предделителя CS12 – CS10 в "000" мы останавливаем таймер. При этом TCNT1 обнуляется? Если опять запустить счёт он продолжится со значения в момент остановки или начнётся с нуля?
Да, таймер останавливает счёт. Предделитель нет! При последующем запуске продолжение счёта в моменты переполнения предделителя.
Сидел разбирался с кодом akl. Напишу, что я понял и свои вопросы. Стартовая инициализация. Вы убрали очистку ОЗУ. Вы считаете это лишним, или спрятали что-бы не загромождать код? С настройками таймера понятно - счётчик стоит, прерывания по захвату разрешены, предделитель сброшен. В R22 заготовка для TCCR1B. Основной цикл. Пока Т=0 - крутимся вначале. Прерывание. По первому заходу всё ясно - запускаем счётчик, сбрасываем флаг из R30 и в основной цикл. А вот второй заход (с переходом на метку ZAHVAT) мне не совсем понятен. Я бы сократил его до
Код:
ZAHVAT: in Temp1,ICR1L ;копируем значение регистра захвата in Temp2,ICR1H SET ;устанавливаем бит Т EXT: RETI
Ведь после этого мы попадаем в LOOP с Т=1. Нас пропустит на вывод на индикатор и задержку. А в конце вы поставили
Код:
rjmp RESET
А там все необходимые настройки таймера и флагов уже прописаны. Так-что все манипуляции с регистрами в прерываниями я считаю излишними. И последний вопрос. Если вы убрали очистку ОЗУ из блока стартовой инициализации, что очистит TCNT1?
_________________ Это Спарта! В смысле, ассемблер. Все ручками.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Про внешние прерывания.. Там написано что прерывания осуществляются от пинов: INT0 и PCINT0....PCINT5. с последними все понятно... но вот INT0 на каком выводе ??? Или я чтото не понял...?
Всем доброго дня. Завалялось у меня несколько штук attiny261, ради интереса решил попробовать запустить PWM6 Mode. Даташит изучал как мог, с помощью гуглопереводчика. Попробовал в протеусе - на выходах сигнала нет. В железе еще не собирал.. Подскажите, где ошибка? CKSEL fuses 0001, SUT1..0 = 10. Код инициализации таймера1 под спойлером.
Код:
ldi temp, 0b00111111 ; выводы ШИМ на выход (6 PWM) out ddrb, temp ;
Всем счастливого нового года! Прикупил на али такую приблуду
Называется LED-матрица 8x8 с драйвером max7219. Поигрался с ней в среде Arduino и решил запустить её на ASM. МК atmega8. Включение отдельных пикселей реализовал без проблем. Решил сделать бегущий огонёк в первой строке. Вот код Спойлер
;============= ; ***** ПОДПРОГРАММы РАБОТЫ С MAX7219 SPI_transfer: ;отправка данных (Temp5 - команда, Temp6 - данные) cbi PORTB, 2 // Вывод SS на 0 OUT SPDR, Temp5 ;отправляем команду vozvr_1: sbis SPSR, SPIF ;ждём отправки rjmp vozvr_1 sbi PORTB, 2 // Вывод SS на +5 cbi PORTB, 2 // Вывод SS на 0 OUT SPDR, Temp6 ;отправляем данные vozvr_2: sbis SPSR, SPIF ;ждём отправки rjmp vozvr_2 sbi PORTB, 2 // Вывод SS на +5 RET
; ***** КОНЕЦ ОБЛАСТИ ПОДПРОГРАММ****** ;============= ; Прерывание по сбросу, стартовая инициализация RESET: ; Инициализация стека LDI Temp1, LOW(RAMEND) OUT SPL, Temp1 LDI Temp1, HIGH(RAMEND) OUT SPH, Temp1
CLI ; Глобальный запрет прерываний
; настройка SPI ldi temp1,0b00101100 // SS, SCK, MOSI на выход out DDRB, temp1 // Отправляем в конфигуратор порта sbi PORTB, 2 // Вывод SS на +5 ldi temp1, 0b01010000 // Настраиваем SPI, SPE = 1 это разрешит протокол; out SPCR, temp1 // MSTR = 1 говорит что мы руководим посылкой
Попробовал поменять РВ2 на РВ1 и РВ0 - вообще не запустилось. Включает тестовый режим и всё. Это когда светят все пиксели. Убрал дёрганье ножкой между посылкой первого и второго байта - стало работать как надо на РВ2.
_________________ Это Спарта! В смысле, ассемблер. Все ручками.
В процессе дальнейшего копания возникла ещё одна проблемка. Попробовал сделать кольцевой сдвиг символа влево. Задумка такова - в оперативке по метке Kod зарезервировано 8 байт. Там лежит построчно закодированный символ. Temp5 - счётчик и указатель на номер строки при передаче. Они совпадают. Извлекаем в Temp6 первый байт, отправляем в max7219, выполняем кольцевой сдвиг и возвращаем в оперативку с пост-инкрементом и снова по кругу. Получился такой код Спойлер
Код:
LDI Temp5, 0x01 Proga:
LDI XL,low(Kod) //запись адреса метки ОЗУ LDI XH,High(Kod) m05: LD Temp6, X //получение данных RCALL SPI_transfer //подпрограмма отправки данных (Temp5 и Temp6) CLC rol Temp6 //сдвиг байта влево BRCC m03 ORI Temp6,0b00000001 m03: ST X+,Temp6 //сохранение нового сзачения с пост-инкрементом INC Temp5 //инкрементируем счётчик CPI Temp5,0x09 //проверяем прошло-ли 8 циклов BRNE m05 //если нет на метку m05 //если да: RCALL delay_01 //задержка LDI Temp5, 0x01 //обновляем счётчик
rjmp Proga
Символ выводится но не сдвигается. Где я напартачил?
_________________ Это Спарта! В смысле, ассемблер. Все ручками.
BOB хотел сказать, что ваши 8 байт являются видеопамятью. Каждые Х мС времени подпрограмма вывода выводит всё содержимое этой видеопамяти в ваш модуль 8Х8. А вы, когда ВАМ надо эту видеопамять модифицируете.
_________________ Я всё-всё узнAю и стану профессором.
Легче заново набросок сделать, чем в чужом, фрагментами представленном коде, разбираться. Тем более, что в данном случае надо еще и к даташиту на MAX7219 плотненько возвернуться. Да со структурой привязки пикселей уточнить (теоретически там 8 колонок по 8 вертикальных точек в колонке - блок данных "на боку" - в наличии такой матрицы на данный момент нету за ненадобностью - могу лишь "теоретизировать"). Да и МК для меня не "базовый" - хотя в примитиве с программным SPI что на тиньку2313, что на мегу8 лаподрыг особо отличаться не должен... Разве что без привязки к МК то уже библиотечка получается...
более рационально менять содержимое буфера видеопамяти, а затем делать пакетный вывод
Тогда надо будет вытащить байт из оперативки, модифицировать, вернуть обратно, а потом ещё раз вытаскивать для отправки. Как по мне - вытащил, отправил, модифицировал, вернул более оптимально. По поводу
BOB51 писал(а):
в данном случае надо еще и к даташиту на MAX7219 плотненько возвернуться. Да со структурой привязки пикселей уточнить
это всё не нужно. По работе с MAX7219 вопросов нет. Вывод реализован без вопросов. Вопрос в модификации. Почему после первого прохода я получаю из оперативки немодифицированные данные?
_________________ Это Спарта! В смысле, ассемблер. Все ручками.
Вообще-то данные из ячейки видеобуфера вытаскиваются однократно на каждое обращение к СБИС контроллера. Тем более, что у АВРок косвенное чтение памяти имеется. А вот отсылка блока из двух байт при каждом обращении к СБИС (адрес и данные) выполняется. Полный цикл - пересылка блока 8*2=16 байт по SPI заметно длиннее всех имеющихся обращений к ОЗУ.
Касательно обработки содержимого видеобуфера - это уже на усмотрение автора. В зависимости от задачи можно обработку и в регистровом файле делать.
Допустим блок видеобуфера в ОЗУ имеет вот такое размещение:
а вот относительно дисплея... шаблон развернется "боком":
Это как первая подсказка к алгоритму обработки. И еще одно замечание - Если для циклических процессов (бегущие точки или полоски, разнообразные сдвиги) еще можно применить программные решения, то для версий мультипликации гораздо выгоднее применять ряд из "кадров", размещенных или в ПЗУ или во внешней ЕЕПРОМ.
Сейчас этот форум просматривают: Bing [Bot], roman.com и гости: 47
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения