Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Старый 21.11.2011, 15:34   #171
pinco
Гражданин KAZUS.RU
 
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от roma9112 Посмотреть сообщение
Может я не прав, но обычно область с адресами прерываний не особенно пользуют когда прерывания не нужны, наверное, что бы если МК попадет туда, то не ушел бы в неведомыю даль.
Если какие-то прерывания не нужны или их совсем ни одного не надо то просто перед rjmp xxxx ставлю nop - если контроллер сюда и попадает то просто ничего не делая идет безопасно вниз опять на свою прогу , и не надо reti даже приписывать , если надо включить какую нибудь обработку прерывания то просто убираю этот nop и по оставшемуся rjmp начинает все лбрабатываться нормально , так что reti совсем не нужно ставить чтобы не тратить лишних тактов в заход в прерывание и тут же выход из него .Саму таблицу с записями векторов оставляю на месте - от ее удаления места микроскопически мало освобождается , при обьеме прог к примеру от 2000 строк до 50000 строк асма эти несколько десятков освободившихся строчек как укус комара слону ,свободного места не прибавляют , так что ее просто оставляю на месте , забив все ненужные прерывания nop -ом , и теперь даже если в программе выходы в эти прерывания и где-то по недосмотру случайно и останутся включенные (по включающим флагам в соответствующих регистрах) - то ничего все равно не происходит , где nop -ы там вся обработка выключена и никаких уходов вдаль и подвисаний на этом нет .

После .org 0x0000 далее адреса каждого из векторов можно и не указывать - по таблице датачета на этот AVR они и так потом идут по порядку на каждый следующий адрес по умолчанию .



;================================================= =======================

.cseg ; Начало кодового сегмента

.org 0x0000
rjmp RESET ; Обработка сброса (включен)
nop ;rjmp EXT_INT0 ; внешнее прерывание IRQ0 (выключен)
nop ;rjmp EXT_INT1 ; внешнее прерывание IRQ1 (выключен)

rjmp TIM1_CAPT ; Обработка захвата таймера/счетчика T1 (включен)
rjmp TIM1_COMPA ; Совпадение А таймера/счетчика T1 (включен)
rjmp TIM1_COMPB ; Совпадение В таймера/счетчика T1(включен)
rjmp TIM1_OVF ; Обработка переполнения таймера/счетчика T1(включен)
nop ;rjmp TIM0_OVF ; Обработка переполнения таймера/счетчика T0 (выключен)
nop ;rjmp SPI_STC ; Передача по SPI завершена (выключен)

nop ;rjmp USART_RXC ; USART RX прием завершен(выключен)

nop ;rjmp USART_UDRE ; Регистр данных USART пуст(выключен)
nop ;rjmp USART_TXC ; USART TX Передача завершена(выключен)

rjmp ANA_COMP ; Обработка прерывания аналогового (включен)компаратора
rjmp EXT_INT2 ; Обработка внешнего прерывания IRQ2(включен)
rjmp TIM0_COMP ; Обработка совпадения (включен)таймера/счетчика T0
rjmp EE_RDY ; EEPROM готово(включен)
rjmp SPM_RDY ; Store Program memory-готово(включен)
;=======================================


RESET:
;инициализация стека
ldi R16,high(RAMEND)
out SPH,temp
ldi R16,low(RAMEND)
out SPL,temp

.......

Вот примерно применительно к Вашему куску проги , что там конкретно в точности надо выключите или включите там сами .
Сами подпрограммы обработок прерывания можете распололжить в самом конце всей проги за пределами цикла основной программы , вместе м обычными подпрограммами , так легче дописывать , изменять и переносить куски подпрограмм с одного кристалла AVR-а на другой к примеру .

общее начало...

Ваша таблица векторов ,начальная инициализация и прочее....

начало основной программы , или одной из нескольких постоянно выполняемых....

A1:

...
...
...

rjmp A1 ;конец основной программы

А далее идут уже все остальные подпрограммы
B1:
...
ret

B2:
...
ret

EXT_INT0: ;подпрограммы обработки прерываний могут быть с любыми
; именами ,помимо тех что предлагает датачет , хоть "дядя Вася"
; но всегда метка здесь в подпрограмме обработки прерывания
; и в таблице с rjmp-ами должны в точности совпадать ,чтобы
; AVR "не ушел вдаль" непонятно куда , и к тому же располагать
; сами подпрограммы обработки прерывания здесь уже можно в
;любом порядке как удобно друг за другом или даже в перемежку с
;обычными подпрограммами .
...
reti


TIM1_CAPT: ;не по порядку таблицы
...
reti


EXT_INT1:
...
reti


VASYA1: ;обычная подпрограмма ,"Вася" например
...
ret

TIM1_COMPA:
....
reti

TIM1_COMPB:
....
reti

;ну и так далее пока еще хватит памяти микроконтроллера и Вашей фантазии что он там еще должен выполнять .
Реклама:
__________________
Короче асма кода нет !

Последний раз редактировалось pinco; 21.11.2011 в 16:40.
pinco вне форума  
Старый 21.11.2011, 16:21   #172
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 7,983
Сказал спасибо: 0
Сказали Спасибо 4,941 раз(а) в 2,370 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

т.е., получив неизвестный адрес/неправильно оформленное прерывание, налетаем на nopы, потом попадается rjmp xxxx - подпрограмма прерывания и выходим по reti с восстановлением из стека неизвестного адреса/регистров? нехорошо, однако, лучше уж rjmp 0
jump вне форума  
Старый 21.11.2011, 16:32   #173
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от jump Посмотреть сообщение
получив неизвестный адрес/неправильно оформленное прерывание
При этом программа в любом случае будет работать неправильно, независимо от того, есть ли переход на Ресет или просто РЕТИ. И чем раньше это выяснится - тем лучше, поэтому использование rjmp 0 - скорее вредительство, чтобы косяк вылез слишком поздно
niXto вне форума  
Старый 21.11.2011, 16:57   #174
pinco
Гражданин KAZUS.RU
 
Регистрация: 04.04.2007
Сообщений: 941
Сказал спасибо: 571
Сказали Спасибо 113 раз(а) в 85 сообщении(ях)
pinco на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от jump Посмотреть сообщение
т.е.,... налетаем на nopы, потом попадается rjmp xxxx - подпрограмма прерывания и выходим по reti с восстановлением из стека неизвестного адреса/регистров? нехорошо, однако, лучше уж rjmp 0
Да не так - ведь при возврате из любого прерывания или подпрограммы возврат идет на след команду после команды на обработки подпрограммы или прерывания , где это возникло , поэтому даже если обработается "не свое " прерывания то потом контроллер снова возвращается на прежнее место основной проги откуда уходил на обработку и работает себе спокойно дальше , все адреса вх и вых в основную прогу по прерыванию или просто в подпрограммы для этого и фиксируются в стеке , автоматически , поэтому никакого сбоя не возникает , там в начальных постах рекомендовали где-то Евстифеева по Тини и Мега , про механизм обработки прерываний и уход-выход из подпрограмм у него подробно описан , ну и в датачетах конечно , если сомневаетесь - можно еще и там посмотреть .

P.S. Для проверки еще создал ситуацию когда именно все вектора прерывания забиты nop ,но прерывания разрешены и в SREG и в локальных местах блоков , тогда контроллер вообще не натыкаясь ни на одну обработку спускается по проге по NOP-ам вниз до RESET и сбросившись снова начинает инициализироваться и работать по проге как во время включения , поэтому уж если такого поведения контролера в своем устройстве Вы не допускаете то вместо NOP пишите RETI для забития векторов прерывания , в этом случае перезагрузки по RESET не происходит и прога через 4-5 тактов всегда возвращается для продолжения прежней работы со всеми несброшенными данными в то же место основной проги где прервалась .
__________________
Короче асма кода нет !

Последний раз редактировалось pinco; 21.11.2011 в 18:20.
pinco вне форума  
Старый 21.11.2011, 18:14   #175
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от pinco Посмотреть сообщение
поэтому даже если обработается "не свое " прерывания то потом контроллер снова возвращается на прежнее место основной проги откуда уходил на обработку и работает себе спокойно дальше
Это эпик фэйл. Не надо обрабатывать чужое! Неизвестно к чему это приведет. Банальный reti и то в разы лучше. Какая разница - nop прописать или reti в вектора?
Правильный же способ - определить все обработчики, даже неиспользуемые. И писать например лог. Потому как это ненормально - вызов того, что вызываться не должно. К сожалению ядро авр уже устарело. Оно не дает возможности собрать все на один обработчик - просто не узнать какой вектор сработал. Впрочем на асме можно извратиться, надо вместо rjmp использовать rcall. В обработчике считать со стеке адрес возврата, это и будет вектор, точнее вектор + 2. Ну в общем вычисляется при желании. Но отдельные лучше, не все прерывания сбрасывают запрос при переходе на вектор. Например UART - что по приему, что по опустошению регистра передачи. Если просто выйти - ту же зайдем обратно. Основной цикл банально встанет. Так что
отдельные обработчики это правильно. Бывает в них зацикливание и вывод на ножку генерации с разной скважностью. Позволяет определить вектор без отладчика, просто по осциллографу. Во время отладки - полезно. В готовом девайсе лучше лог, очистка условия входа в прервание и выход.
kison вне форума  
Старый 21.11.2011, 19:27   #176
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Прикольный спор получается... каждый о своём... и по своему...

Сообщение от niXto Посмотреть сообщение
При этом программа в любом случае будет работать неправильно, независимо от того, есть ли переход на Ресет или просто РЕТИ. И чем раньше это выяснится - тем лучше, поэтому использование rjmp 0 - скорее вредительство, чтобы косяк вылез слишком поздно
Это с чего вдруг???
Это же уже обсуждалось... и не раз... Нельзя такое рассматривать в отрыве от контекста работы девайса и заложенной степени его надёжности...
А если дело не в проге??? А если "залёт" по причине воздействия ЭМИ... или ионизирующего излучения??? И к чему может привести попытка дальнейшей работы на подпорченном ОЗУ и регистрах???
st_1 вне форума  
Старый 21.11.2011, 23:21   #177
DAVE_ELEKTRIK
Прописка
 
Аватар для DAVE_ELEKTRIK
 
Регистрация: 18.10.2010
Адрес: Planet Earth )
Сообщений: 120
Сказал спасибо: 14
Сказали Спасибо 11 раз(а) в 11 сообщении(ях)
DAVE_ELEKTRIK на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Да в принципе я всегда использую прерывания! И хотел бы перейти на МК меги, ну и т. д. Проблема в том, что допустим, я понимаю в общем работу МК, рассматривая его поблочно. Часть команд знаю уже наизусть. Но как коснется алгоритма я не знаю с чего начать и как писать. Например есть алгоритм но как применить на этот МК, а не другой? Открываешь датачит и начинаешь смотреть что есть внутри и что с этими внутренностями делать?
В классик МК этого не было, вот почему я задал это вопрос про эти биты! Я пока с этим не сталкивался. Но ясного ответа я не получил. Пример может кто то показать, зачем эти два бита? Как их устанавливать по моему римеру.
Цитата:
Прикольный спор получается...
Из споров получается истина! Мне очень интересно сделать какой нибудь вывод.
__________________
Мозги кипят, ядрить твою валентность!!! Пойду закладывать остальные ингредиенты...
DAVE_ELEKTRIK вне форума  
Старый 21.11.2011, 23:52   #178
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от DAVE_ELEKTRIK Посмотреть сообщение
Но ясного ответа я не получил. Пример может кто то показать, зачем эти два бита? Как их устанавливать по моему римеру.
Никак. Пока не приспичит написать свой загрузчик - биты эти можно оставить в покое. Это перенос векторов прерываний из начального адреса в область загрузчика, ну или обратно. Важно именно загрузчику, обычной программе это не нужно. Если граблей нет - стоит ли их искать и раскладывать впереди самостоятельно?
kison вне форума  
Старый 22.11.2011, 00:10   #179
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,532
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от st_1 Посмотреть сообщение
АСМовые вставки в СИ - видел...
СИшные вставки в АСМе - не попадались...
http://www.microchip.su/showthread.p...969#post147969 Это не пример, но желание заставляет улыбнуться
realid вне форума  
Старый 22.11.2011, 00:50   #180
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

Сообщение от st_1 Посмотреть сообщение
Это с чего вдруг???
jmp 0 это все же не сброс. Не все и не всегда инициализируют всю неиспользуемую периферию. Пример с UART - взвелся флажок прерывания, попали на вектор, не предусмотренный программой. Ну не собирался программист использовать UART. Там сидит (r)jmp 0. Перешли, начали сначала. Разрешили прерывания и.. опять пошли в обработчик. Оттуда на 0 и опять. Если есть собака - и то не поможет. Обычно при старте она как раз и сбрасывается. Другой пример - обработчики есть на все, даже ненужное. В нем можно зациклиться и сброситься по WDR - это хотя бы очистит запрос прерывания.
kison вне форума  
Закрытая тема

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите начинающему (PIC16F84A). Slava-martyn Микроконтроллеры, АЦП, память и т.д 11 09.09.2010 21:55
помогите начинающему по WinAVR umkamaks Микроконтроллеры, АЦП, память и т.д 4 05.05.2010 21:01
Помогите начинающему! kolira Микроконтроллеры, АЦП, память и т.д 6 30.01.2010 15:22
Помогите советом начинающему eler Делимся опытом 64 11.09.2008 17:28
Помогите начинающему!!!! sma-etu Микроконтроллеры, АЦП, память и т.д 2 13.12.2006 18:31


Часовой пояс GMT +4, время: 07:19.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot