Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: Таймеры/счётчики в AVR

Сообщение arm-17 »

Дерганье ног согласен, а CPI каким боком?

Расскажите если не трудно.

Наверно придется новую тему создавать, а то уже не в те дебри лезим
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

Как при чём? У регистра ведь последовательный вход. Вот и использовать хардварный SPI для передачи байта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: Таймеры/счётчики в AVR

Сообщение arm-17 »

Создал новую тему :)
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

Молодец. Обычно при этом ещё ссылку на новую тему дают.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Эиком - электронные компоненты и радиодетали
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Таймеры/счётчики в AVR

Сообщение dm211 »

Есть вопрос по таймеру1 в AVR. Таймер1 в режиме FastPWM, с выводов OC1A и OC1B выходят шим сигналы, с помощью OCR1A и OCR1B задаю скважность шим. Но требуется, чтобы сигналы выходили попеременно- то с OC1A, когда напряжение на нем кончится-с OC1B. Как можно такое сделать?
Реклама
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

Нулевой бит COM0x1 задает полярность сигнала. На одном канале выставить импульсы положительной полярности, на другом отрицательной. При одинаковых значениях сравнения на обоих выводах сигнал будет идти в противофазе.
Реклама
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Таймеры/счётчики в AVR

Сообщение dm211 »

Нет,так сигналы в одно и то же время будут выходить,а нужно смещение по времени- сначала на первом выходе сигнал, сигнал кончился- появляется на втором.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

То, что вы описываете и есть противофаза.
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Re: Таймеры/счётчики в AVR

Сообщение Серый_ »

Ни кто не в курсах, нужно ли что-то ещё, чтобы заставить ATmega162 заходить в прогу обработки прерывания? (Таймер 0, режим CTC - прерывание, сброс при совпадении (в единственном канале)):
* таблица векторов внесена
* метка для ухода поставлена
* число для сравнения задано
* режим и источник такта таймеру выбраны
* бит маски выбран
* глобальное разрешено
И... нефига. :evil:
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

не проще ли было это куском кода здесь изобразить?
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Re: Таймеры/счётчики в AVR

Сообщение Серый_ »

Спойлер.include "m162def.inc"
.equ del = 85 ;делитель для таймера (при прескалере /8)
.cseg
.org 0
;РАСПРЕДЕЛЕНИЕ ВЕКТОРОВ ПРЕРЫВАНИЙ mega162, РАЗМЕЩАЕТСЯ ТОЛЬКО ЗДЕСЬ!
rjmp reset ;0x000 RESET, он же скакать к инициализации устройств
reti ;0x002 внешнее прерывание INT0
reti ;0x004 внешнее прерывание INT1
reti ;итд006 внешнее прерывание INT2
reti ;008 внешнее прерывание по смене на электроде PCINT0
reti ;00A внешнее прерывание по смене на электроде PCINT1
reti ;00C таймер 3 захват
reti ;00E таймер 3 совпадение в канале A
reti ;010 таймер 3 совпадение в канале B
reti ;012 таймер 3 переполнение
reti ;014 таймер 2 совпадение (в единственном канале)
reti ;016 таймер 2 переполнение
reti ;018 таймер 1 захват
reti ;01A таймер 1 совпадение в канале A
reti ;01C таймер 1 совпадение в канале B
reti ;01E таймер 1 переполнение
rjmp preh ;020 таймер 0 совпадение (в единственном канале)
reti ;022 таймер 0 переполнение
reti ;024 SPI, STC передача завершена
reti ;026 USART0 Rx (приём) завершён
reti ;028 USART1 Rx (приём) завершён
reti ;02A USART0 регистр данных пуст
reti ;02C USART1 регистр данных пуст
reti ;02E USART0 Tx (передача) завершена
reti ;030 USART1 Tx (передача) завершена
reti ;032 EEPROM готов
reti ;034 аналоговый компаратор
reti ;036 програмная память готова (всего 28 прерываний)
;037 последняя промежность
;--------------------------- RAM НА МАКСИМАЛЬНЫЙ АДРЕС СТЕКА
reset: ldi r16,high(RAMEND)
out sph,r16
ldi r16,low(RAMEND)
out spl,r16
;--------------------------- УСТАНОВКА ТАЙМЕРА0 (8bit)
ldi r16,0b00000001 ;маска от совпадения
out timsk,r16
;etimsk нужен только для таймера 3, не приелся
;tifr,etifr флаговые рагистры всех таймеров, не приелся
;sfior, сброс прескалеров и ещё какое-то уг, не приелся

;tcnt0 счётный регистр не приелся, счёт с нуля
ldi r16,del ;задать делитель в канал совпадения
out ocr0,r16 ;отправить в канал совпадения
ldi r16,0b00001010 ;режим CTC, прескалер /8 [шит102]
out tccr0,r16 ;ТАЙМЕР ПОШЁЛ [шит100]
;МЕЖ ПРЕРЫВАНИЯМИ 680 ТАКТОВ
;========= ГЛОБАЛЬНОЕ РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ
sei ;set I во флаговом регистре
;--------------------------- ОСНОВНАЯ ПРОГА
sbi portB,0 ;начальный уровень на порту
loop: nop
nop
rjmp loop ;вертеться в цикле ожидая нового прерывания

;========= ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ, ТАЙМЕР 0
;В НЁМ ПРОГРАМНО ЗАДЕРЖИВАТЬ И ДЁРГАТЬ portB 0
;НА ОБРАБОТКУ 634 ТАКТА
;программно ждать, опустить строб, держать, поднять и выйти из прерывания

preh:
ldi r17,110 ;задержка 553 такта
zad1: dec r17 ;отминусовать 1-цу в r17 (*1такт)
cpi r17,0 ;стали ли он от этого 0? (*1такт)
breq vse1 ;да уже 0 на выход (*1т/2 при переходе)
rjmp zad1 ;нет отминусовывать ещё (*2такта)
;553:5=110делитель
vse1: ;< < < < < < < < < < здесь сбросить portB
cbi portB,0

ldi r17,16 ;держать строб 81 такт
zad2: dec r17 ;минуснуть (*1такт)
cpi r17,0 ;уже 0? (*1такт)
breq vse2 ;да, на выход (*1т / 2 при переходе)
rjmp zad2 ;нет, к минусовке (*2такта)
;81:5=16делитель
vse2: sbi portB,0 ;вернуть portB
;> > > > > > > > > > здесь строб подняли
reti ;заброать адрес выхода из стека, выйти и вернуть I
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

В этом камне адрес вектора занимает 2 слова, поэтому нужно его явно указывать.

Код: Выделить всё

reti	;01C таймер 1 совпадение в канале B
reti	;01E таймер 1 переполнение
    .org  0x0020
rjmp preh ;020 таймер 0 совпадение (в единственном канале)
reti	;022 таймер 0 переполнение
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Re: Таймеры/счётчики в AVR

Сообщение Серый_ »

Спс! Заработало. :) В связи с этим ещё 4 вопроса:
1) В mega8 ждёт такое же "УГ"?
2) Если хотим ещё прерываний - .org перед каждым?
3) "Промежности" между векторами - это вторые слова адресов?
4) Если хотим "прерывание в прерывании" достаточно сразу же возобновить I, и вторую обработку не выносить за пределы первой?
akl
Друг Кота
Сообщения: 4447
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

1..3) Желательно адреса всех используемых векторов определять явно, тогда не будет таких ситуаций.
Серый_ писал(а):Если хотим "прерывание в прерывании" достаточно сразу же возобновить I, и вторую обработку не выносить за пределы первой?
Почему не выносить. Пишите обычный обработчик, в который придёт программа при наступлении события.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

Эээ... как много.
В маленьких камнях на вектор отводится по одной команде чтобы всунуть туда rjmp
В больших камнях rjmp уже не достреливает до конца памяти, поэтому там вектор занимает 2 команды чтобы всунуть jmp.

Чтобы не промахнуться:
1) ставить .ORG перед кодом обработчика
2) понаписать соотв. заглушек (jmp/rjmp), напр.

Код: Выделить всё

rjmp RESET;
rjmp INT0;
rjmp INT1;
...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Re: Таймеры/счётчики в AVR

Сообщение Серый_ »

akl писал(а):Почему не выносить. Пишите обычный обработчик, в который придёт программа при наступлении события.
А, ну понят., т. е. второе случится на любом адресе первого, туда же и вернётся, первое доделается и вернётся в прогу. :) Адреса выходов в стеке не нарушаются. Двойные прерывания и meg-и раньше не писал / не сталкивался. У кого не "ф карме" - "фсем ф карму". :)
dm211
Прорезались зубы
Сообщения: 208
Зарегистрирован: Вс дек 10, 2006 19:26:13

Re: Таймеры/счётчики в AVR

Сообщение dm211 »

a5021 писал(а):То, что вы описываете и есть противофаза.
А,точно.. тогда еще вопрос,вот сделал так к примеру-

Код: Выделить всё

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
 TCNT0=135;
 OCR1A=10;
 OCR1B=500;
}
импульсы идут один за одним, как сделать "мёртвое время" между импульсами ?
Вложения
imp.jpg
(15.9 КБ) 307 скачиваний
2t-pwm.rar
(27.66 КБ) 132 скачивания
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Re: Таймеры/счётчики в AVR

Сообщение a5021 »

В атмеловском апноуте AVR447 описано, как генерировать ШИМ с паузами между импульсами для управления полу-мостом.
Аватара пользователя
Серый_
Опытный кот
Сообщения: 708
Зарегистрирован: Пт ноя 30, 2007 14:40:44

Re: Таймеры/счётчики в AVR

Сообщение Серый_ »

А в чём фишка, если при билде в *.hex, ассемблер не видит всех регистров связанных с таймером 3? (mega162) К примеру:
out etimsk,r16

"error: Operand 1 out of range: 0x7d" А адреса всему таймеру такие: na (0x7D). В режиме совместимости с mega161 он и не должен быть доступен, но юзаю в нормальном режиме - mega162. :evil:
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

Дык, out не достреливает до РВВ с адресом 0x7D.
Сомневаюсь что режим совместимости может это как-то исправить.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Ответить

Вернуться в «AVR»