Таймеры/счётчики в AVR
Re: Таймеры/счётчики в AVR
Дерганье ног согласен, а CPI каким боком?
Расскажите если не трудно.
Наверно придется новую тему создавать, а то уже не в те дебри лезим
Расскажите если не трудно.
Наверно придется новую тему создавать, а то уже не в те дебри лезим
- Реклама
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Таймеры/счётчики в AVR
Как при чём? У регистра ведь последовательный вход. Вот и использовать хардварный SPI для передачи байта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Таймеры/счётчики в AVR
Создал новую тему 
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Таймеры/счётчики в AVR
Молодец. Обычно при этом ещё ссылку на новую тему дают.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Таймеры/счётчики в AVR
Есть вопрос по таймеру1 в AVR. Таймер1 в режиме FastPWM, с выводов OC1A и OC1B выходят шим сигналы, с помощью OCR1A и OCR1B задаю скважность шим. Но требуется, чтобы сигналы выходили попеременно- то с OC1A, когда напряжение на нем кончится-с OC1B. Как можно такое сделать?
- Реклама
Re: Таймеры/счётчики в AVR
Нулевой бит COM0x1 задает полярность сигнала. На одном канале выставить импульсы положительной полярности, на другом отрицательной. При одинаковых значениях сравнения на обоих выводах сигнал будет идти в противофазе.
Re: Таймеры/счётчики в AVR
Нет,так сигналы в одно и то же время будут выходить,а нужно смещение по времени- сначала на первом выходе сигнал, сигнал кончился- появляется на втором.
Re: Таймеры/счётчики в AVR
То, что вы описываете и есть противофаза.
Re: Таймеры/счётчики в AVR
Ни кто не в курсах, нужно ли что-то ещё, чтобы заставить ATmega162 заходить в прогу обработки прерывания? (Таймер 0, режим CTC - прерывание, сброс при совпадении (в единственном канале)):
* таблица векторов внесена
* метка для ухода поставлена
* число для сравнения задано
* режим и источник такта таймеру выбраны
* бит маски выбран
* глобальное разрешено
И... нефига.
* таблица векторов внесена
* метка для ухода поставлена
* число для сравнения задано
* режим и источник такта таймеру выбраны
* бит маски выбран
* глобальное разрешено
И... нефига.
Re: Таймеры/счётчики в AVR
не проще ли было это куском кода здесь изобразить?
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
Re: Таймеры/счётчики в AVR
В этом камне адрес вектора занимает 2 слова, поэтому нужно его явно указывать.
Код: Выделить всё
reti ;01C таймер 1 совпадение в канале B
reti ;01E таймер 1 переполнение
.org 0x0020
rjmp preh ;020 таймер 0 совпадение (в единственном канале)
reti ;022 таймер 0 переполнение
Re: Таймеры/счётчики в AVR
Спс! Заработало.
В связи с этим ещё 4 вопроса:
1) В mega8 ждёт такое же "УГ"?
2) Если хотим ещё прерываний - .org перед каждым?
3) "Промежности" между векторами - это вторые слова адресов?
4) Если хотим "прерывание в прерывании" достаточно сразу же возобновить I, и вторую обработку не выносить за пределы первой?
1) В mega8 ждёт такое же "УГ"?
2) Если хотим ещё прерываний - .org перед каждым?
3) "Промежности" между векторами - это вторые слова адресов?
4) Если хотим "прерывание в прерывании" достаточно сразу же возобновить I, и вторую обработку не выносить за пределы первой?
Re: Таймеры/счётчики в AVR
1..3) Желательно адреса всех используемых векторов определять явно, тогда не будет таких ситуаций.
Почему не выносить. Пишите обычный обработчик, в который придёт программа при наступлении события.Серый_ писал(а):Если хотим "прерывание в прерывании" достаточно сразу же возобновить I, и вторую обработку не выносить за пределы первой?
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Таймеры/счётчики в AVR
Эээ... как много.
В маленьких камнях на вектор отводится по одной команде чтобы всунуть туда rjmp
В больших камнях rjmp уже не достреливает до конца памяти, поэтому там вектор занимает 2 команды чтобы всунуть jmp.
Чтобы не промахнуться:
1) ставить .ORG перед кодом обработчика
2) понаписать соотв. заглушек (jmp/rjmp), напр.
В маленьких камнях на вектор отводится по одной команде чтобы всунуть туда rjmp
В больших камнях rjmp уже не достреливает до конца памяти, поэтому там вектор занимает 2 команды чтобы всунуть jmp.
Чтобы не промахнуться:
1) ставить .ORG перед кодом обработчика
2) понаписать соотв. заглушек (jmp/rjmp), напр.
Код: Выделить всё
rjmp RESET;
rjmp INT0;
rjmp INT1;
...[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Таймеры/счётчики в AVR
А, ну понят., т. е. второе случится на любом адресе первого, туда же и вернётся, первое доделается и вернётся в прогу.akl писал(а):Почему не выносить. Пишите обычный обработчик, в который придёт программа при наступлении события.
Re: Таймеры/счётчики в AVR
А,точно.. тогда еще вопрос,вот сделал так к примеру-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 скачивания
Re: Таймеры/счётчики в AVR
В атмеловском апноуте AVR447 описано, как генерировать ШИМ с паузами между импульсами для управления полу-мостом.
Re: Таймеры/счётчики в AVR
А в чём фишка, если при билде в *.hex, ассемблер не видит всех регистров связанных с таймером 3? (mega162) К примеру:
out etimsk,r16
"error: Operand 1 out of range: 0x7d" А адреса всему таймеру такие: na (0x7D). В режиме совместимости с mega161 он и не должен быть доступен, но юзаю в нормальном режиме - mega162.
out etimsk,r16
"error: Operand 1 out of range: 0x7d" А адреса всему таймеру такие: na (0x7D). В режиме совместимости с mega161 он и не должен быть доступен, но юзаю в нормальном режиме - mega162.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Таймеры/счётчики в AVR
Дык, out не достреливает до РВВ с адресом 0x7D.
Сомневаюсь что режим совместимости может это как-то исправить.
Сомневаюсь что режим совместимости может это как-то исправить.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]


