Котаны, всем привет! Просьба тапками не бросаться - только начал осваивать Attiny 2313. Изучаю по книге Белова
Сейчас ковыряюсь с таймерами. Ниже кусок извращенского кода, который ведет себя странно (или, скорее всего, я еще не догоняю). Хочу понять механику работы прерываний для T1 при совпадении с двух каналов. В текущем виде в обработчиках chnlA/chnlB при значениях TCCR1A 0x40 и 0x10 соответственно сигнала нет на ногах ОС1A/OC1B. Опытным путем выявил, если и там, и там 0х50, то сигнал идет на 2 канала. И самое странное: если значения реверсные 0х10 и 0х40, то сигналы идут с разной частотой и небольшим сдвигом по фазе Догадки есть, но почему тишина при "родных" значениях для каналов?
В текущем виде в обработчиках chnlA/chnlB при значениях TCCR1A 0x40 и 0x10 соответственно сигнала нет на ногах ОС1A/OC1B.
Сигнала нет, т.к. у вас выбран режим "Normal port operation, OC1A/OC1B disconnected."
In Clear Timer on Compare or CTC mode (WGM13:0 = 4 or 12), the OCR1A or ICR1 Register are used to manipulate the counter resolution. In CTC mode the counter is cleared to zero when the counter value (TCNT1) matches either the OCR1A (WGM13:0 = 4) or the ICR1 (WGM13:0 = 12).
Читайте даташит.
Ну, и написан у вас не код, а какая-то дребедень. Скачайте avr-gcc, и забудьте про asm, как страшный сон.
Хочу понять механику работы прерываний для T1 при совпадении с двух каналов.
СТС режим – это очистка (сброс в ноль) счётного регистра TCNT1 при совпадении со значением регистра OCR1A. А при совпадении регистра TCNT1 с регистром OCR1B счётный регистр TCNT1 не сбрасывается, а продолжает считать. Таким образом, если регистр OCR1B будет по значению больше регистра OCR1A, то прерывание по каналу В не произойдёт, так как при совпадении регистра TCNT1 и регистра OCR1A счётный регистр TCNT1 очистится и значит до значения регистра OCR1B не сможет досчитать. А если значение регистра OCR1B будет меньше значения регистра OCR1A, то оба прерывания по каналу В и по каналу А будут работать как положено.
И чего все так от ассемблера шарахаются? Вполне себе нормальный инструмент для большинства прикладных приложений. Чаще вопрос не в языке, а в необходимом уровне изучения аппаратных модулей микроконтроллера. Да в тонкостях взаимосвязи настроек этих модулей и ядра МК.
Ну, и написан у вас не код, а какая-то дребедень. Скачайте avr-gcc, и забудьте про asm, как страшный сон.
По поводу говнокода критика принимается. Назначение чисто экспериментальное. По остальному не соглашусь: в битах COM1A0 и COM1B0 регистра TCCR1A как раз стоят "1", что говорит о том, что сигналы OC1A/OC1B уже активированы. TCCR1B выставлен правильно (режим СТС, без предделителя).
Т.е. значения 0х40 и 0х10 в прерываниях корректные для канала А и В: COM1A0 = 1 и COM1B0 = 1 соответственно. Почему при этом тишина - непонятно. Еще непонятнее, почему сигнал идет, но при двух активных каналах 0х50 (COM1A0 = 1 и COM1B0 = 1 одновременно). Ну и совсем взрыв мозга, почему при противоположных значениях COM1A0/COM1B0 для каждого канала есть писк, но какой-то странный: со смещением по фазе и частоте.
Открываем оригинальный даташит https://www.microchip.com/en-us/product ... ment-table ищем таблицу 12-5. Из неё узнаём, что режим СТС есть двух типов: со сбросом по значению регистра ICR1 или OCR1A. Далее открываем таблицу 12-2 и выставляем биты регистра TCCR1A в соответствии с ней. Затем выставляем предделитель таймера и он начинает тикать. Также обязательно помним, что флаг компаратора взводится не в текущем такте (такт таймера, а не системный!) совпадения значений, а лишь в следующем.
; ---------- Инициализация таймера/счетчика T1 ---------- ldi YH, 0x0A ldi YL, 0x8C out OCR1BH, YH out OCR1BL, YL
out OCR1AH, YH out OCR1AL, YL
LDI R16,1<<WGM13|1<<WGM12;|1<<CS10 ; Режим сравнения ICR1 и предделитель 1 OUT TCCR1B,R16 LDI R16,1<<COM1A1|1<<COM1B1|1<<COM1A0|0<<COM1B0|1<<WGM11;|1<<WGM10 OUT TCCR1A,R16 ;противофазные импульсы A и B ; LDI R16,1<<COM1A1|1<<COM1B1|1<<COM1A0|1<<COM1B0|1<<WGM11;|1<<WGM10 ; OUT TCCR1A,R16 ;синфазные импульсы A и B
ldi XH, 0x12 ldi XL, 0x8C out ICR1H, XH out ICR1L, XL
LDI R16,1<<WGM13|1<<WGM12|1<<CS10 ; Режим сравнения ICR1 и предделитель 1 OUT TCCR1B,R16
; ldi temp, 0x60 ; out TIMSK, temp ; Маска прерываний: разрешены по совпадению канала А и В ; out TIFR, temp ; Очищаем флаг совпадения по каналу А и В
; sei ; Разрешение прерываний
; ---------- Конец модуля инициалиации ----------
loop: rjmp loop
.EXIT
Периферия предназначена для разгрузки ядра. В Вашем случае можно обойтись без прерываний
В режиме отладки по F11 все четко прыгает по прерываниям. Соответствующие флаги выставляются/снимаются. Вроде, и в железе все должно работать, ан нет! А как симуляцию запустить? Научите пжл. Сейчас выбрано Simulator в debugger/programmer. Не работал ни разу с ним.
Команды LDI в прерывании разрешая один канал запрещают другой. Поэтому на выходах OC1A, OC1B всегда 0. Если сделать как ниже получите импульсы сдвинутые по фазе примерно на четверть периода
Если сделать как ниже получите импульсы сдвинутые по фазе примерно на четверть периода
Именно так! Если установить в регистре TCCR1A биты COM1A0 и COM1B0 в "1" прямо в модуле инициализации, то смысл прерываний отпадает. Все и так будет переключаться без проблем. Это я уже проделывал. Все же непонятно, почему в соответствующих прерываниях для каналов А/В установка "родных" бит COM1A0/COM1B0 не дает сигнала с ног OC1A/OC1B. Ведь даже если они влияют друг друга, как было замечено ранее, все равно какое-то шевеление должно быть. Наверное, есть какая-то недокументированная особенность для режима СТС.
Я понимаю, что проблема высосана из пальца и, наверное, не стоит выеденного яйца, но все же хочу понять и доразобраться. Сейчас как зацикленный Спасибо за понимание
В режиме CTC регистры порта вывода необходимо взводить самому. Биты FOC тоже не работают. Поэтому отцепляем пины от компараторов, переключаем их и снова цепляем к компараторам. Компаратор таймера их только сбрасывает (в 0 или 1, если стоит инверсия). Если нужен полный автомат, то необходимо использовать что-то из режимов PWM. Я в режимах NORMAL и CTC выводами управляю вручную.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения