Карма: 1
Рейтинг сообщений: -2
Зарегистрирован: Пт сен 04, 2015 13:10:49 Сообщений: 121 Откуда: г. Ижевск
Рейтинг сообщения:0
Подскажите, пожалуйста, почему не срабатывает прерывание по совпадению таймера, точнее прерывание то есть, только оно попадает на другой вектор почему то. МК - ATmega164. Вроде все перепроверил, все настройки правильные, но в AVR Studio 6 и в Proteuse прерывание попадает на строку компаратора или АЦП в таблице векторов Спойлер
clr temp ; Записываем 0 в регистр temp out PORTD, temp ; порт PD0-PD5: выход =0, PD6: вход =Z ldi temp, 0x7B out DDRD, temp ; 01111011 - "1"-выход, "0"-вход, 2-й бит на вход - внешнее прерывание INT0
clr temp out PORTB, temp ldi temp, 0xFF ; 11111111 все на выход out DDRB, temp
ldi temp, 0x80 ; Аналог. компаратор откл. out ACSR, temp
;---------- Инициализация таймера T1 ----------
ldi temp, 0x0A ; 00001010 - режим СТС - сброс по совпадению и запуск таймера sts 0x81, temp ; TCCR1B ldi temp, deley_vkl_0 sts 0x88, temp ; в OCR1A записали число 35 ldi temp, 0x02 sts 0x6F, temp ; разрешаем прерывание по событию "Совпадение А" TIMSK1
;---------- Инициализация стека ----------
ldi temp,low(RAMEND) ; Выбор адреса вершины стека (адрес конца RAM) out SPL,temp ; Запись его в регистр стека ldi temp,high(RAMEND) ; out SPH, temp sei ;---------- Начало основной программы lp00:
loop5: sbic PIND, 7 ; ждём приход 1 втечение 0.51(мс) если 6-й бит регистра PIND = 0, то след. команда пропускается jmp loop6 in temp, TIFR1 sbrs temp, 1 jmp loop5 jmp lp00 loop6:
;==================== ; Подпрограмма обработки прерываний ;====================
Если ещё актуально. Проще явно указать адрес вектора Регистр OCR1A двухбайтовый и для таких регистров периферии есть определенный порядок записи/чтения Спойлер
Код:
.org 0 ; Установка текущего адреса на ноль
jmp RESET ; Переход на начало программы reti ; jmp EXT_INT0 ; Внешнее прерывание 0 reti ; jmp INT1 ; Внешнее прерывание 1 reti ; jmp INT2 reti ; jmp PCINT0 ; PCINT0 Handler reti ; jmp PCINT1 ; PCINT1 Handler reti ; jmp PCINT2 ; PCINT2 Handler reti ; jmp PCINT3 reti ; jmp WDT ; Watchdog Timer Handler reti ; jmp TIMER2_COMPA ; Timer2 Compare A Handler reti ; jmp TIMER2_COMPB ; Timer2 Compare B Handler reti ; jmp TIMER2_OVF ; Timer2 Overflow Handler reti ; jmp TIMER1_CAPT ; Timer1 Capture Handler
Карма: 29
Рейтинг сообщений: 645
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2694 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
artemik32 писал(а):
только оно попадает на другой вектор почему то.
Попадает оно на тот вектор, это Вы таблицу векторов неправильно заполнили. Поглядите таблицу векторов в ДШ, у данного камня один вектор занимает два слова памяти программ. Команда-затычка RETI однословная команда. На Вашем скрине как раз видно, что программный счетчик указывает на 0x1A, т.е. это адрес нужного Вам вектора.
Можно вставить двухсловные команды на неиспользуемые вектора, например
Код:
jmp RESET
, или две однословные команды на один вектор, например
Код:
nop nop
. Можно в вектор вставить директиву .dw 0x0000. Или воспользуйтесь директивой .ORG, как указал akl.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
тем более что для каждого адреса вектора уже определены соответствующие символьные константы. И это не только проще, но и правильнее - я об этом неоднократно говорил, и буду говорить.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 1
Рейтинг сообщений: -2
Зарегистрирован: Пт сен 04, 2015 13:10:49 Сообщений: 121 Откуда: г. Ижевск
Рейтинг сообщения:0
Да спасибо, я уже написал конкретный адрес перехода на вектор как предложил akl. Так нормально работает, а с младшими мегами таких проблем не было, у которых используется команда rjmp вместо jmp, и памяти у них 8 кб и меньше.
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Друзья, всем привет. Пытаюсь разобраться с таймерами, и столкнулся с непонятной для меня информацией. Пишу в Ардуино ИДЕ. Микроконтроллер: Атмега168 Цель: нужно вызывать функцию 1 раз в секунду (по сути это часы, только назначение другое). Решил все это делать на таймере. Залез в даташит: 0-й и 2-й таймеры 8-мибитные, значит отпадают, остается 1-й таймер. По настройке немного сложно, делаю в первый раз, но в принципе разобраться можно. Вот примерно что я собираюсь делать, Так правильно? и нужно ли делать сброс таймера?:
Код:
TCCR1B |= (1<<WGM12); TCCR1B |= (1<<CS12); // делитель 256 TIMSK |=(1<<OCIE1A); // прерывание по совпадению OCR1AH = 0b11110100; // число для сравнения 62500 OCR1AL = 0b00100100;
.... ISR (TIMER1_COMPA_vect) { // какое-то действие }
Добавлено after 44 minutes 55 seconds: Пробую, но ничего не работает... код:
Код:
int i=10;
ISR (TIM1_COMPA) { // какое-то действие i=i+1; }
void setup(void) { // flip screen, if required // u8g.setRot180(); TCCR1B |= (1<<WGM12); TCCR1B |= (1<<CS12); // делитель 256 TIMSK1 |=(1<<OCIE1A); // прерывание по совпадению OCR1AH = 0b11110100; // число для сравнения 62500 OCR1AL = 0b00100100; Serial.begin(9600); }
void loop(void) { Serial.println(i);
// rebuild the picture after some delay delay(100); }
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Добавлено after 2 minutes 38 seconds: разрешение прерываний (глобальное)?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Карма: 1
Рейтинг сообщений: 10
Зарегистрирован: Вс дек 30, 2012 00:32:06 Сообщений: 542 Откуда: Николаев / Украина
Рейтинг сообщения:0
Да вроде как по умолчанию они включены. Пробовал дописывать sei() но это ничего не изменило. В общем я в ступоре... Может что-то элементарное пропускаю? С тем же ISR не все понятно. В одних местах он прописан как TIM1_COMPA в других по-другому. Пробовал и так и так - нет результата.
_________________ Сделать своими руками всегда интересней чем просто купить и пользоваться
Зарегистрирован: Ср сен 13, 2017 05:53:24 Сообщений: 31
Рейтинг сообщения:0
Помогите. В протеусе все симулирует чётко. Загружаю в МК не отрабатывает прерывание по переполнению таймера1. Мк аттини85. Правильно ли инициализировал прерывание?
Зарегистрирован: Ср сен 13, 2017 05:53:24 Сообщений: 31
Рейтинг сообщения:0
SEI есть в программе, даже есть ещё одно прерывание по таймеру0 (TIMER0_COMPA_vect) и оно работает, а по этому вектору нет, да и интересно почему в протеусе все как надо работает, а в реальном МК нет? мб МК бракованный >_<
интересно почему в протеусе все как надо работает, а в реальном МК нет? мб МК бракованный
МК бракованный... еще может быть компилятор лажает - это две любимые причины всех проблем начинающих.
у вас схема протеуса на 100% соответствует реальной? в реальной ошибок нет? что вы ждете от обработчика с единственным оператором, какие эффекты быть должны, а их нет? ни схемы, ни всей программы, одни загадки-догадки.
я вам точно скажу, в чем причина: у вас есть ошибка. полегчало? только где именно - не скажу
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Зарегистрирован: Ср сен 13, 2017 05:53:24 Сообщений: 31
Рейтинг сообщения:0
Цитата:
МК бракованный... еще может быть компилятор лажает - это две любимые причины всех проблем начинающих.
из-за оптимизации такое может происходить, (-O) выставлена?
Режимы работы реле
1. Потенциометром задается режим от 1 до 4, как на картинке, удержанием кнопки переход на следующий шаг 2. Задается время t1 3. Указываются в чем считать С, М, Ч 4. Задается время t2 5. Указываются в чем считать С, М, Ч 6. Происходит запуск (PB1 рулит реле по выбранному режиму)
Косяк в том, что нет бегающей индикации во время работы
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения