реклама на сайте
подробности

 
 
> Вопрос по AVRstudio, Это баг или я чего-то незнаю?
Potter
сообщение Feb 21 2007, 21:08
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 151
Регистрация: 27-05-06
Из: Харьков
Пользователь №: 17 508



Собственно вопрос вот в чем....

Тело вектора прерывания:

.org ovf0addr
rjmp Timer0


Timer0:
cli

ldi r16, 0x94 ; 148
out TCNT0, r16

sei

reti

Почему после того как выполнилось все тело прерывания по команде "reti" щетчик переходит по нулевому адресу?

И почему после следующих операций:

ldi r16, 0x94 ; 148
out TCNT0, r16

Число 0x94 не заносится в регистр TCNT0?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Dopler
сообщение Feb 21 2007, 22:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 23-04-05
Из: Таганрог
Пользователь №: 4 425



Мой код, это тоже самое, что и у вас.

1. Подключаем файл mega128
2. Даем регистрам имена, под которым они будут использоваться в программе ( с помошью .equ )
3. Директива .org говорит по какому адресу размещать код .org 0 - размещать с нуля
3. Дальше идем в даташит на страницу 61, раздел Interrupts и видим все вектора прерываний и инициализацию стека, как это рекомендует Atmel (видим код). Т.е. видим список всех прерываний меги128.
4. У меги 128 нет команды rjmp, так как она не перекрывает все адресное пространство. Используется команда jmp.
5. В прерываниях, которые нам нужны, раскоментирован jmp, которые не нужны - reti (если вдруг в программе по недосмотру нежелательное прерывание произойдет, то ничего страшного не случится, так как будет сразу reti ). Необходимо помнить, что команда jmp занимает в памяти программ два слова (4 байта), поэтому .org наращивается на 4.
6. После сброса программа прыгает на 0, там видит jmp и переходит на RESET. Программа начинается с инициализации стека. Т.е. в регистр стека SPH:SPL записывается последняя ячейка ОЗУ меги, так как стек у AVR растет сверху вниз.
7. Дальше инициализируется таймер на прерывание по сравнению, вы можете поменять это место на свою инициализацию таймера (лучше не меняйте, а разберитесь с мнемоникой <<).
8. Разрешаются прерывания.
9. Главный бесконечный цикл.
10. При срабатывании прерывания, программа прыгает на вектор 001E, видит там jmp и переходит на обработчик.
11. В обработчике может написать любой тестовый код вместо моего (мой выводит байт в UART, смысла для вас не имеет), например inc tmp.
Go to the top of the page
 
+Quote Post
Qwertty
сообщение Feb 22 2007, 00:25
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 408
Регистрация: 21-10-06
Из: Санкт-Петербург
Пользователь №: 21 527



Цитата(Dopler @ Feb 21 2007, 22:42) *
Мой код, это тоже самое, что и у вас.
...
4. У меги 128 нет команды rjmp, так как она не перекрывает все адресное пространство. Используется команда jmp.

Правильнее наверно так - векторы прерывания рассчитаны на команду JMP. RJMP у меги тоже есть, и ее можно применять и в этом случае, если определять векторы через их имена - .org OVF0addr
Цитата(Dopler @ Feb 21 2007, 22:42) *
ldi tmp, (1<<WGM01)|(0b111<<CS00)

Честно говоря загадочная конструкция. Точнее вот эта часть - (0b111<<CS00)
Не подскажите, что она значит? Понятно, что работать будет, но <<CS00 зачем???
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Potter   Вопрос по AVRstudio   Feb 21 2007, 21:08
- - beer_warrior   ЦитатаПочему после того как выполнилось все тело п...   Feb 21 2007, 21:18
|- - Potter   Цитата(beer_warrior @ Feb 21 2007, 22:18)...   Feb 21 2007, 21:24
- - Potter   Блин... Ну подскажите... Я в тупике....   Feb 21 2007, 21:44
- - Dopler   На самом деле даже в приведенном коде много что не...   Feb 21 2007, 21:45
- - Potter   Вот код всей прогаммы: .include "m128def.inc...   Feb 21 2007, 21:54
|- - Dopler   Цитата(Potter @ Feb 21 2007, 21:54) Ну ...   Feb 21 2007, 22:04
- - beer_warrior   ЦитатаЧто значит переполнение стека? при вызове пр...   Feb 21 2007, 21:58
- - Potter   Dopler... Будьте добры... Пожалуйста прокоментируй...   Feb 21 2007, 22:23
- - Potter   Спасибо... ведь не обязательно в программе писать ...   Feb 21 2007, 23:58
- - beer_warrior   Цитатаведь не обязательно в программе писать все а...   Feb 22 2007, 00:04
- - Potter   И последнее... почему все таки у меня не получаетс...   Feb 22 2007, 00:47
|- - SasaVitebsk   Цитата(Potter @ Feb 22 2007, 01:47) И пос...   Feb 22 2007, 01:01
- - beer_warrior   ЦитатаНе подскажите, что она значит? Понятно, что ...   Feb 22 2007, 00:55
- - Qwertty   Цитата(beer_warrior @ Feb 22 2007, 00:55)...   Feb 22 2007, 01:18
- - Dopler   Цитата(Qwertty @ Feb 22 2007, 01:18) Цита...   Feb 22 2007, 08:14


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 20:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016