atmega 128 прерывание по таймеру

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

BOB51 писал(а):Kavka, а в случае применения "перемещенной" таблицы векторов такой подход всегда сработает?(см. адреса переконфигурации таблиц для "больших" мег - язва я) :cry:
Ты вот про такое?

Код: Выделить всё

.include "m128def.inc"

.cseg
.org 0
		jmp RESET
.org INT0addr
		reti
.org INT1addr
		reti
.org INT2addr
		reti
.org INT3addr
		reti

.org INT_VECTORS_SIZE

RESET:
loop:
		jmp loop


.org FIRSTBOOTSTART
		jmp BOOTLOADER
.org FIRSTBOOTSTART + INT0addr
BOOT_INT0:
		reti
.org FIRSTBOOTSTART + INT1addr
BOOT_INT1:
		reti
.org FIRSTBOOTSTART + INT2addr
BOOT_INT2:
		reti
.org FIRSTBOOTSTART + INT3addr
BOOT_INT3:
		reti

.org FIRSTBOOTSTART + INT_VECTORS_SIZE

BOOTLOADER:

loop2:
		jmp loop2
Дык, как бы вот (кусочек из map-файла)

Код: Выделить всё

EQU  FIRSTBOOTSTART 0000fe00
[...злой мышъ съел...]
CSEG RESET        00000046
CSEG loop         00000046
CSEG BOOTLOADER   0000fe46
CSEG BOOT_INT0    0000fe02
CSEG BOOT_INT1    0000fe04
CSEG BOOT_INT2    0000fe06
CSEG BOOT_INT3    0000fe08
CSEG loop2        0000fe46
:))) 8)

ЗЫ: Язвы, в таких, вопросах как правило знают больше, чем остальные. Так как из-за "доставучести" своей они частенько докапываются до вешей, которые остальным не интересны. :)) :beer:
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15741
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

ага, про такие вариации :)
вот и выползла необходимость ставить не абсолютный адрес а относительный :)
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Ну, просто надо использовать возможности, которые даёт макро-ассемблер - и относительные адреса не помеха.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Друг Кота
Аватара пользователя
Сообщения: 15741
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Возможностей там много, да не все явно прописаны и/или имеют хороший комментарий, а вариаций на тему выполнения дриектив и синтаксиса еще больше :cry:
чего стоит только отсутствие локальных меток в макросах (или я их плохо искал?) :shock:
У АВРок в файле шаблоона-заготовки не помешает описание конфигурационных флагов добавить (по образцу ПИКовых шапок) - жаль только вводить их значения все равно "от руки" прийдется...
Мои образцы нацарапаны только для atmega8515, attiny2313 и attiny13/13a т.е., с которыми удобно работать (удобство совместимости с AT89c/s51/52 (dip40) и at89c2051/4051 (dip20)).
Но это скорее всего другая тема - объективный сравнительный анализ семейств MCS51, PIC10/12/16, PIC18 и ATTINY/MEGA с одной точки зрения (т.е. с одинаковым подходом ко всем, без предвзятости) 8)
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

BOB51 писал(а): чего стоит только отсутствие локальных меток в макросах
Они есть и прекрасно себя чувствуют. Я вот этот бессмысленный пример накропал, чтобы запутать компайлер, но он прекрасно разобрался что к чему, хотя я даже локальную метку "совпал" с глобальной.

Код: Выделить всё

00002f 0000      asdf:	nop
000030   +  	TST_M
000030 1701      	cp	r16,r17
000031 f409      	brne	stt
000032 cffc      	rjmp	asdf
000033 0000      stt:	nop
          	.ENDMACRO
000034   +  	TST_M
000034 1701      	cp	r16,r17
000035 f409      	brne	stt
000036 cff8      	rjmp	asdf
000037 0000      stt:	nop
          	.ENDMACRO
         
000038 d002      	rcall	stt
000039 0000      	nop
00003a cff0      	rjmp	start
         
00003b ef8f      stt:	ldi	r24,255

Реклама
Друг Кота
Аватара пользователя
Сообщения: 15741
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

я про то, что описания локальных меток нет в хелпах по асму, а как на практике- пока пробовать не приходилось :beer:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Мне тоже показалсь вначале, что их нет, :) пришлось даже в макросе ставить :( машинный код перехода куда надо , а попробовал - работает классно и без вопросов.
Друг Кота
Аватара пользователя
Сообщения: 15741
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

значит атмель как всегда описание директив не доработал :(
у мпасма и у с51asm и у кейла этот пунктик явно прописан, а тут нету :cry:
но... зато директивы условного ассемблирования натыканы... досадка работать в "недокументированном режиме", а у меня последний релиз studio 4.19 однако, - можно было бы и прописать уже к этому времени, да видно у них все внимание давно в Сии... :facepalm:
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

BOB51 писал(а):Alkul, вот это как раз и есть классическая ошибка... :shock:
в стандартном заголовочном файле avr studio обычно всегда подключается шаблон (в данном случае m128def.inc) - а там уже заявлены адреса векторов под собственными именами, которые повторно использовать не рекомендуется! А вот пользоваться этими именами весьма полезно:
Да, пользовать имена типа INT0addr, SPIaddr и пр. не стоит. Но прием совершенно правильный, просто не совсем правильно использован. А делать надо так: берем даташит на новый для себя контроллер, находим в нем после таблицы прерываний пример ассемблерного кода. Например, для Меги-8 это будет на стр. 45. - The most typical and general program setup for the Reset and Interrupt Vector
Addresses in ATmega8 is:
addressLabels Code Comments

Код: Выделить всё

$000 rjmp RESET ; Reset Handler
$001 rjmp EXT_INT0 ; IRQ0 Handler
$002 rjmp EXT_INT1 ; IRQ1 Handler
$003 rjmp TIM2_COMP ; Timer2 Compare Handler
$004 rjmp TIM2_OVF ; Timer2 Overflow Handler
. . . . . .
$011 rjmp TWSI ; Two-wire Serial Interface
Handler
$012 rjmp SPM_RDY ; Store Program Memory Ready
Handler
;
$013 RESET: ldi r16,high(RAMEND); Main program start
$014 out SPH,r16 ; Set Stack Pointer to top of RAM
$015 ldi r16,low(RAMEND)
$016 out SPL,r16
Выделяем кусок от 0х000 по 0х16 (для другого контроллера адрес будет другим, но смысл, думаю, понятен). и вставляем его в начало текста своей программы. Удаляем в начале каждой строки адрес, пробел заменяем на <tab>, пробел между rjmp (jmp) и меткой адресом перехода - тоже. Теми же табами выравниваем комментарии, чтобы они хорошо смотрелись.

Далее вставляем этот кусок еще один раз. На этот раз удаляем в начале каждой строки как адрес, так и команду rjmp (jmp) и пробел после нее. Превращаем бывшие адреса перехода в метки - вместо пробела между меткой и точкой с запятой ставим двоеточие, а комментарий, опять же, табами, отгоняем правее, чтобы красиво смотрелось После полученного набора меток ставим reti или какую-нибудь диагностическую ловушку для "левых" прерываний. И все. Полученный файлик где-нибудь сохраняем с именем, включающим название контроллера и используем для вставки в начало каждого нового проекта.

Для Меги-8 у меня получился вот такой файлик: http://yadi.sk/d/Oa7EDqKN2Epqe (что-то не нашел, как приаттачить файл к сообщению, положил его на Яндекс-Диск).

Можно подумать на тему сделать из него два .inc-файла, один для начала, второй - для таблицы "заглушек", используя директивы условного ассемблирования, но лень...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Ответить

Вернуться в «AVR»