Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

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

 
Опции темы

Помогите начинающему по ATmega8515

Непрочитано 21.11.2011, 15:34  
pinco
Гражданин KAZUS.RUN
 
Регистрация: 04.04.2007
Сообщений: 937
Сказал спасибо: 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  
jump
Почётный гражданин KAZUS.RUN
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,011
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

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

Сообщение от jump Посмотреть сообщение
получив неизвестный адрес/неправильно оформленное прерывание
При этом программа в любом случае будет работать неправильно, независимо от того, есть ли переход на Ресет или просто РЕТИ. И чем раньше это выяснится - тем лучше, поэтому использование rjmp 0 - скорее вредительство, чтобы косяк вылез слишком поздно
niXto вне форума  
Непрочитано 21.11.2011, 16:57  
pinco
Гражданин KAZUS.RUN
 
Регистрация: 04.04.2007
Сообщений: 937
Сказал спасибо: 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  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Помогите начинающему по ATmega8515

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

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

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

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

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

Сообщение от st_1 Посмотреть сообщение
АСМовые вставки в СИ - видел...
СИшные вставки в АСМе - не попадались...
http://www.microchip.su/showthread.p...969#post147969 Это не пример, но желание заставляет улыбнуться
realid вне форума  
Непрочитано 22.11.2011, 00:50  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
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 Делимся опытом 100 11.09.2008 17:28
Помогите начинающему!!!! sma-etu Микроконтроллеры, АЦП, память и т.д 2 13.12.2006 18:31


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.