AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
17.03.2017, 12:05
|
#1
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Atmega16a Вектора прерываний
Добрый день. Случилась странность, при написании проги на АСМе в AVRStudio4 вдруг выяснилось, что поменялись вектора прерываний ТМР0 и ТМР2 (другие не проверял). Причем в симуляторе работает как по датишу, а в железе иначе (выяснил опытным путем). Переполнение ТМР0( 0х12) уходит на USART RXC(0х16), компаратор ТМР0 ( 0х26) уходит на SPI, STC(0х14). Переполнение ТМР2( 0х08 уходит на TMR1 CAPR(0х10), компаратор ТМР2(0х06) уходит на TIMER2 OVF(0х08. bootrst и ivsel не устанавливаю, JTAG и компаратор отключаю. В WIN7-64 и WIN XP-32 - одинаково. Причем раньше написал несколько прог и все было правильно. Третий день ломаю голову не пойму в чем проблема.
Последний раз редактировалось wlad773; 17.03.2017 в 12:09.
|
|
|
|
17.03.2017, 13:10
|
#2
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,050
Сказал спасибо: 3,041
Сказали Спасибо 3,210 раз(а) в 2,180 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
ИМХО - фантастика. Может не тот "def" подключен?
__________________
Экзорцист 40-го уровня.
|
|
|
|
17.03.2017, 13:50
|
#3
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
Фантастика не то слово. Про def не знаю, я назначаю регистру символическое имя. А device Atmega16 и Atmega16а - одинаково.
Даже сделал тестовую програмку с указанием прерываний. Через тере указано куда фактически выходит прерывание.
.device ATmega16a
.NOLIST
.include "m16adef.inc"
.LIST
.set CO = PD6;15 контрольный выход
.set IR_in = PD3;12 вход
.def T_OUTH = R20 ; СБ временной задержки
.def T_OUTL = R21 ; МБ временной задержки
.def TMP = R23 ;
.def TMPL = R24 ;
.def TMPH = R25 ;
.org 0x0000
rjmp BEGIN
reti
reti;INT0
reti
reti;INT1;
reti
reti;TMR2 COMP;
reti
reti;TMR2 OVF - TMR2 COMP
reti
RJMP INTUP;reti;TMR1 CAPR - TMR2 OVF
reti
reti;TMP1 COMPA
reti
reti;TMP1 COMPB
reti
;
reti;TMP1 OVF
reti
reti;TMR0 OVF
reti
reti;SPI,STC - TMR0 COMP
reti
reti;USART RXC - TMR0 OVF
reti
reti;USART UDRE
reti
reti;USART TXC
reti
reti;ADC
reti
reti;EE RDY
reti
;
reti;ANA COMP
reti
reti;TWI
reti
reti;INT2
reti
reti;TMR0_COMP
reti
reti;SPM RDY
.org 0x0030
BEGIN: ldi tmp,Low(RamEnd) ; ЗАГРУЗКА
out SPL,tmp ; УКАЗАТЕЛЯ
ldi tmp,HIGH(RamEnd) ; СТЕКА
out SPH,tmp ; ДЛЯ ВСЕХ ПРОГРАММ
ldi tmp,1‹‹ACD ; выкл.
OUT ACSR,TMP ; компаратор
;Отключение JTAG интерфейса
LDI TMP,0x80 ;
OUT MCUCSR,TMP ;
OUT MCUCSR,TMP ;
LDI TMP,0B11111111 ; настроить выводы порта A
OUT DDRA,TMP ;
LDI TMP,0B00000000 ;
OUT PORTA,TMP ;
LDI TMP,0B11111111 ; настроить выводы порта B
OUT DDRB,TMP ;
LDI TMP,0B00000000 ;
OUT PORTB,TMP ;
LDI TMP,0B11111111 ; настроить выводы порта C
OUT DDRC,TMP ;
LDI TMP,0B00000000 ;
OUT PORTC,TMP ;
LDI TMP,0B11110111 ; настроить выводы порта D
OUT DDRD,TMP ;
LDI TMP,0B00001000 ;
OUT PORTD,TMP ;
;Настройка ТМР и WDT
; TMR0
; LDI TMP,200 ; время ТМР0
; OUT OCR0,TMP ; Hz(200мКСек)
;; LDI TMP,0B00000001 ;нормальный режим
; LDI TMP,0B00001001 ;СТС режим
; OUT TCCR0,TMP ;
;; LDI TMP,0b00000001 ;прерывания от переполнения ТМР0
; LDI TMP,0b00000010 ;прерывания от компаратора ТМР0
; OUT TIMSK,TMP ;
; TMR1
; LDI TMP,0B10000010 ; режим 6-и разрядной ШИМ,
; OUT TCCR1A,TMP ; с выводом на ОС1А, сброс при совпадении
; LDI TMP,63 ; режим 6-и разрядной ШИМ,
; OUT ICR1L,TMP ; 31.250kHz
; LDI TMP,0B00011000 ; режим 6-и разрядной ШИМ,
; OUT TCCR1B,TMP ; таймер-выкл.
; TMR2
; LDI TMP,0x08 ; асинхронный режим
; OUT ASSR,TMP ; таймера 2 от кварца 32768Гц
LDI TMP,127 ;время ТМР2
OUT OCR2,TMP ;
LDI TMP,0B00000001 ;режим нормальный предделитель ТМР2= 1/1
; LDI TMP,0B00001001 ;режим CTC предделитель ТМР2= 1/1
OUT TCCR2,TMP ;
LDI TMP,0b01000000 ;прерывания от переполнения ТМР2
; LDI TMP,0b10000000 ;прерывания от компаратора ТМР2
OUT TIMSK,TMP ;
;Настройка WDT
; LDI TMP,0B00011000 ; включить
; OUT WDTCR,TMP ; WDT, ПРЕРЫВАНИЕ ЧЕРЕЗ
; LDI TMP,0B00001001 ; предделитель
; OUT WDTCR,TMP ; WDT= 32.5мСЕК
; LDI TMP,0x08 ;прерывание
; OUT MCUCR,TMP ;по спаду INT1
; LDI TMP,0x80 ;разрешить прерывание
; OUT GICR,TMP ;по INT1
SEI ;глобальное разрешение прерываний
clr BIT ;
;************** MAIN **************
m1: nop
rjmp m1
;=========================== ПРЕРЫВАНИЕ =============================================
INTUP: PUSH TMP ;
IN TMP,SREG ;
PUSH TMP ;
sbi portd,CO
rcall Del_40uS
cbi portd,CO
POP TMP ;
OUT SREG,TMP ;
POP TMP ;
reti ;
;******************************** ТАЙМАУТЫ
Del_40uS: LDI T_OUTL,10
Del004: DEC T_OUTL
BRNE Del004
RET
END:
;===============================================
.ESEG
.db 0x00
EEND:
|
|
|
|
17.03.2017, 14:51
|
#4
|
Частый гость
Регистрация: 10.09.2010
Адрес: Резиновая
Сообщений: 45
Сказал спасибо: 3
Сказали Спасибо 14 раз(а) в 12 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
Сообщение от wlad773
|
...Даже сделал тестовую програмку
.device ATmega16a
.NOLIST
.include "m16adef.inc"
......
.org 0x0000
rjmp BEGIN
reti
reti;INT0
reti
reti;INT1;
reti
reti;TMR2 COMP;
reti
reti;TMR2 OVF - TMR2 COMP
reti
...
|
В то, что это ранее работало - бряхня!!!
Читаем справку на команды АВР... 1 слово(2 байта) = что рети что джамп.
Смотрим описание таблицы векторов указанного камня:
INT0
INT1
TIMER2COMP
и т.д.
Дальше ясно, почему оно никогда не будет работать?
Вы бы посмотрели бы повнимательней грамотные исходники.
вот например первый попавшийся в гугле:
.CSEG
.ORG 0x0000
RJMP Start ;перепрыгиваем таблицу векторов.
.ORG INT0addr ; External Interrupt0 Vector Address
RJMP INT0_expection
.ORG INT1addr ; External Interrupt1 Vector Address
RETI
.ORG OC2addr ; Output Compare2 Interrupt Vector Address
RJMP PWM_1
.ORG OVF2addr ; Overflow2 Interrupt Vector Address
RETI
.ORG ICP1addr ;Input Capture1 Interrupt Vector Address
RETI
Наводящий вопрос:
Откуда тут взялось
INT0addr
INT1addr
????
И зачем оно вписано в файлик поставляемый вместе со студией????
Прально = чтоб ЮЗАТЬ (по русски использовать).
Перепишите Ваш исходник правильно и будет Вам счастье.
(круглый)
ЗЫ
Ну и нефиг на стэк загонять R23 и регистр состояния, если Вы R20 в дальнейшем поганите. Вы либо крестик снимите, либо труселя наденьте! А то надёргали кода из разных сырцов не разобравшись ни с одним ни с другим... Это Вас никуда не приведёт к сожалению либо счастью...
|
|
|
Сказали "Спасибо" kolobok0
|
|
|
18.03.2017, 08:42
|
#5
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
Обычно я не отвечаю на сообщения самых умных но сегодня, сранья, меня прет. Так вот что я тебе скажу птичка, извини kolobok0. Вам не хватает внимательности и усидчивости. Я сказал, что программы которые писал ранее работают правильно и векторы прерываний были согласно датишу. Но вдруг ,что-то случилось, может переустановка системы? И я набросал тестовую прогу, не претендую на изящество, даже наоборот. Но она тоже работает! Между предложенным тобой вариантом и написанным мной нет никакой разницы. Что бы это понять изучи организацию памяти программ. А набросал, что бы найти вектор прерывания. Как писал ранее- в симуляторе все правильно,а в железе не работает. В каждую строку, по очереди, вставлял команду перехода, прошивал МК и делал так до тех пор пока он не задергает ногой. Потом менял настройки таймеров и повторял. Для тех, кто не был в подводной лодке, не стал этого объяснять, думал само собой разумеется. И при чем тут регистры, они мои, как хочу так и имею!
Буду всем оч благодарен, если в моих темах ответов с упреками от самых умных больше не будет. Либо по существу, либо просто промолчать.
|
|
|
|
18.03.2017, 11:51
|
#6
|
Почётный гражданин KAZUS.RU
Регистрация: 23.10.2007
Адрес: Великие Луки
Сообщений: 2,942
Сказал спасибо: 730
Сказали Спасибо 1,855 раз(а) в 881 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
А микросхема точно Мега16? Можете не отвечать.
|
|
|
|
18.03.2017, 11:57
|
#7
|
Почётный гражданин KAZUS.RU
Регистрация: 20.03.2007
Адрес: "Братское кольцо враждебности", т.е. ближайшее заМКАДье.
Сообщений: 7,050
Сказал спасибо: 3,041
Сказали Спасибо 3,210 раз(а) в 2,180 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
Сообщение от wlad773
|
Но вдруг ,что-то случилось, может переустановка системы?
|
Это - тоже фантастика.
Сообщение от wlad773
|
Между предложенным тобой вариантом и написанным мной нет никакой разницы. Что бы это понять изучи организацию памяти программ. А набросал, что бы найти вектор прерывания.
|
Читая подиагонали ответ "круглого" решил, что проблему он выявил точно. Нет, не выявил.
Но, одно хорошее замечание есть. Почему-бы не пользоваться предопределенными в "def"-файле адресами входов в таблицу прерываний? Не надо тогда будет лишних телодвижений с вставками reti
Цитата:
|
Код:
|
CSEG
.ORG 0x0000
RJMP Start ;перепрыгиваем таблицу векторов.
.ORG INT0addr ; External Interrupt0 Vector Address
RJMP INT0_expection
.ORG INT1addr ; External Interrupt1 Vector Address
RETI
.ORG OC2addr ; Output Compare2 Interrupt Vector Address
RJMP PWM_1
.ORG OVF2addr ; Overflow2 Interrupt Vector Address
RETI
.ORG ICP1addr ;Input Capture1 Interrupt Vector Address
RETI |
|
Если не используется прерывание INT1 - то подчёркнутый фрагмент можно просто выкинуть, но правильность таблицы не будет нарушена. Если не углубляться в дебри надёжности кода...
Ну, и по сути вопроса, - какая версия Студии и выложите файлы "def" и "xml" от mega16a. Бывают ошибки и в них...
__________________
Экзорцист 40-го уровня.
|
|
|
|
18.03.2017, 12:05
|
#8
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
Сообщение от georg65
|
А микросхема точно Мега16? Можете не отвечать.
|
Atmega16a. Но думаю разницы нет.
|
|
|
|
18.03.2017, 12:44
|
#9
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
Сообщение от ForcePoint
|
Почему-бы не пользоваться предопределенными в "def"-файле адресами входов в таблицу прерываний?
|
Я нормальный человек и никогда не делал как в примере, но ситуация заставила. Не обращайте внимание на корявое исполнение. Он помог мне выяснить::
1. что в симуляторе ВП работают правильно.
2. найти реальные адреса ВП.
Кстати INT1 работает правильно. Пользуюсь AVRStudio 4.19 сборка 730. 4.18 на WIN7 не стала.
Не получается вставить файлы с такими расширениями. Научите.
У меня была WIN7, в прошлом году обновил до WIN10, на другом локальном диске WIN_ХР. И было счастье. Но снес WIN10 (не работала с не подписанными драйверами). Поставил WIN7 из проверенного источника. И заметил такую лажу. Я не утверждаю что виновата винда, просто такая последовательность действий. А может программатор козлить ( ProgIsp)?
|
|
|
|
18.03.2017, 12:46
|
#10
|
Прописка
Регистрация: 06.05.2008
Адрес: Пятигорск
Сообщений: 222
Сказал спасибо: 11
Сказали Спасибо 17 раз(а) в 13 сообщении(ях)
|
Re: Atmega16a Вектора прерываний
П.С. Не нашел def ваааще, ни поиском ни вручную, может тут сАбака порылась? Укажите путь расположения файлов.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:48.
|
|