Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Вы нарвались на его старую ошибку. Исправьте OR на DOR и всё будет ОК. :)
Атмеловцы ошиблись при написании заголовочника и не дописали один символ. Это единственная его ошибка.
Последний раз редактировалось DX168B Пн янв 30, 2012 00:01:56, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

У студии свои заголовочные файлы. Просто оставь .include "m8535def.inc"
Или оставь как было, а стек поправь, попробуй в VMLAB'e. Но студия всё равно удобней.
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

DX168B писал(а):AaNnDdRrEeYy неправильно стек инициализировал.
Указал только младшую часть адреса ОЗУ под стек.

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

ldi temp,0b10000000
out TIMSK,temp
ldi temp,RamEnd ;Вот тут
out SPL,temp

sei

forever:
я старшую пробовал нулями инициализировать
вот так

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

ldi temp,0b00000000 
out SPH,temp
все равно не работало.
а так вообще можно?
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Для МК с увеличенным объёмом памяти так делать НУЖНО. только не нулями, а High(RAMend)
Можете даже в даташите на вашу мегу удостовериться.

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

0x015 RESET: ldi r16,high(RAMEND) ; Main program start
0x016 out SPH,r16 ; Set Stack Pointer to top of RAM
0x017 ldi r16,low(RAMEND)
0x018 out SPL,r16
В МК есть один (для большинства тинек) или два регистра указателей стека.
По сути, мы засовываем в них адрес ОЗУ, с которого будет начинаться стек. Обычно это концовка оперативки.
Адресное пространство ОЗУ является 16-битным, то есть, адрес состоит из двух байтов.
Это старший байт High(RAMend) и младший байт Low(RAMend)
RAMend - это 16-битная константа или просто указанный последний адрес ОЗУ. Описан в заголовочнике на МК.
Последний раз редактировалось DX168B Пн янв 30, 2012 00:17:56, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

пытаюсь откомпилировать в avr studio 4, ругается на ramEnd посмотрел там адрес $25F вбил его в ручную вместо ramend , выдает ошибку
error: Operand(s) out of range in 'ldi r22,0x25f'. это он мне говорит что нет такого адреса?

прошу прошения понял, он не может загрузить шеснадцатиразрядное число восьми разрядный РОН

все заработало написал так

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

ldi r16,high(RAMEND) 
out SPH,r16 
ldi r16,low(RAMEND)
out SPL,r16
в VMLAB тоже работает.
спасибо большое.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Создайте новый проект.
В первом шаге выберите AVR Assembler. Отметьте галочки Create initial file и Create Folder.
Введите название проекта латинскими буквами. Название АСМ файла установится автоматом по названию проекта
Впишите путь к проектам Location, например на диск D:\ Студия не любит папок с русскими символами.
В процессе создания выберите AVR Simulator слева и МК ATMEGA8535 справа в мастере новых проектов.
Потом откомпилируйте следующий код.

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

.include "m8535def.inc"
;-------------------------------------------
.cseg
.org 0x0000
rjmp RESET

.org INT_VECTORS_SIZE

;-------------------------------------------
RESET:
ldi r16, Low(RAMend)
out SPL, r16
ldi r16, High(RAMend)
out SPH, r16

LOOP:
rjmp LOOP
Всё должно работать. У меня работает.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

Добрый Вечер! Возник вопрос по таймеру:
Запускаю таймер, разрешаю прерывание "по совпадению" в режиме СТС (то есть сброс при совпадении). В обработчике прерывания просто мигаю светодиодом. НЕ МИГАЕТСЯ!!!
и как понимать? :) может что подскажете?
Вот прога

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

; выполняемые функции: выполняется прерывание каждую секунду (резонатор =4МГц)

.device   ATmega8515
.nolist 
.include   "m8515def.inc"
.list

;================
; Объявления 
.def temp = r16

; FLASH =======
.CSEG ; Кодовый сегмент

;====== Таблица векторов прерываний================

	 .ORG 0x0000 ; RESET - Аппаратный сброс
      RJMP Init
 	 .ORG 0x0001 ; INT0 - External Interrupt0 Vector Address; Внешнее прерывание 0 ;
	  RETI 
     .ORG 0x0002 ; INT1 - External Interrupt1 Vector Address; Внешнее прерывание 1 ;
	  RETI       ; Ничего не делаем, возвращаемся в основную программу
     .ORG 0x0003 ; ICP1 - Input Capture1 Interrupt Vector Address; Событие захват Таймера/Счетчика 1  ;
	  RETI
     .ORG 0x0004 ; OC1A - Output Compare1A Interrupt Vector Address ;Событие "совпадение A" Таймера/Счетчика 1  ;
	  rjmp Sravnenie ;RETI
     .ORG 0x0005 ; OC1B - Output Compare1B Interrupt Vector Address; Событие "совпадение B" Таймера/Счетчика 1  ;
	  RETI
     .ORG 0x0006 ; OVF1 - Overflow1 Interrupt Vector Address; Переполнение Таймера/Счетчика 1  ;
	  RETI
     .ORG 0x0007 ; OVF0 - Overflow0 Interrupt Vector Address; Переполнение Таймера/Счетчика 0  ;
	  RETI
     .ORG 0x0008 ; SPI  - SPI Interrupt Vector Address; Передача данных по SPI завершена
	  RETI
     .ORG 0x0009 ; URXC - UART Receive Complete Interrupt Vector Address; Прием данных по UART завершена
	  RETI;RJMP RX_OK ; Переходим к обработчику прерывания
     .ORG 0x000a ; UDRE - UART Data Register Empty Interrupt Vector Address; Регистр данных UART пуст
	  RETI
     .ORG 0x000b ; UTXC - UART Transmit Complete Interrupt Vector Address; Передача данных по UART завершен
	  reti;
     .ORG 0x000c ; ACI  - Analog Comparator Interrupt Vector Address; Готов результат аналогового компаратора
	  RETI
     .ORG 0x000d ; INT2  - External Interrupt2 Vector Address
	  RETI
     .ORG 0x000e ; OC0 - Output Compare0 Interrupt Vector Address
	  RETI
     .ORG 0x000f ; ERDY -  EEPROM Interrupt Vector Address
	  RETI
     .ORG 0x0010 ; SPM - SPM complete Interrupt Vector Address
	  RETI
     ;.ORG 0x0011 ; SPMR - SPM complete Interrupt Vector Address
	 ; RETI

    ; .ORG INT_VECTORS_SIZE 

;================ ; Конец таблицы векторов прерываний===

;============ Блок подпрограмм обработки прерываний ===========
Sravnenie:
in temp, PortB
eor temp,r17
out PortB,temp
sbi PortB, 4
reti

;================
 Init:cli     ; Первая выполняемая команда
;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++
;==== Инициализация ядра: Память; Регистры; Стек =============
.include "INITCORE.inc"
;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
;================
  
ldi temp , 0b11111111  ; определяем входы\выходы порта В, 
out DDRB , temp        ; 1 делает вывод выходом, 0 - входом!
ldi temp , 0b00000000  ; определяем в\в порта D
out DDRD , temp

ldi temp , 0b11111111  ; включаем подтяжку (1) для входов порта В 
out portB , temp       ; и задаем начальние состояния выходов
ldi temp , 0b11111111  ; то же самое для D
out portD , temp

ldi temp , 0b00001011 ; запуск таймера T\C1 изменено!
out TCCR1B,temp

ldi temp, 0xFF;42
out OCR1AL,temp
ldi temp, 0xFF;0x1F
out OCR1AH,temp

ldi temp,(1<<OCIE1A)   ; разрешение прерывание по сравнению
out TIMSK,temp

ldi r17 , 0b00000010
sei
;================
; Основное тело программы
Start: 
nop
rjmp Start
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

С векторами у вас что-то намудрено. И где инициализация стека?

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

.cseg
.org 0x0000
rjmp RESET
.org OC1Aaddr
rjmp TIM_OC1A
.org INT_VECTORS_SIZE
;--------------------------------
TIM_OC1A:
....
reti
;--------------------------------
RESET:
ldi r16, Low(RAMend)
out SPL, r16
ldi r16, High(RAMend)
out SPH, r16
.....
....
sei
;---------------------------------
LOOP: rjmp LOOP
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Сообщение slavik.ksu »

Ах да, забыл содержание "INITCORE.INC" показать:

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

;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++
;==== Инициализация ядра: Память; Регистры; Стек =============
;================= Инициализация Памяти ====
RAM_Flush: LDI ZL,Low(SRAM_START)  ; Адрес начала ОЗУ в индекс
           LDI ZH,High(SRAM_START)
           CLR R16                 ; Очищаем R16
Flush:     ST Z+,R16               ; Сохраняем 0 в ячейку памяти
           CPI ZH,High(RAMEND)     ; Достигли конца ОЗУ?
           BRNE Flush              ; Нет! Крутимся дальше!
		                           ; Старший байт достиг конца ОЗУ!!!
								   ; Заполняем оставшиеся 255 байт ОЗУ нулями.
		   CPI ZL,Low(RAMEND)      ; Младший байт достиг конца ОЗУ?
           BRNE Flush              ; Нет! Крутимся дальше, до конца ОЗУ.
           ST Z , r16              ; Да? тогда очиаем последний адрес и выходим из цикла
		   
;=============== Инициализация регистров ===
	       ; Очищаем 32 индексных регистра R0-R31
		   ldi ZL, 30 ; ZL есть регистр R30
           CLR ZH ; ZH есть регистр R31
           dec Zl
           st  Z,ZH
           BRNE PC-2

;================ Инициализация стека ======	  
	       LDI R16,Low(RAMEND) ; Обязательно!!!
           OUT SPL,R16 
           LDI R16,High(RAMEND)
           OUT SPH,R16
		   CLR R16
;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
С вашей версией определения векторов такая же ситуация, то есть проблема не в этом, другие ж прерывания как надо работают .
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

ploop писал(а):... попробуй в VMLAB'e. Но студия всё равно удобней.
не согласен, с точки зрения отладки VMLab гораздо удобней студии и несоизмеримо проще протеуса.
ну где вы видели в студии осцилограф или семисегментник?
нет VMLab все-таки удобная вещь.
применение ограничивает куцый набор камней и куча косяков, но м8, м16 нормально симулирует, а для старта - самое оно, на себе проверял :))) .
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

ну где вы видели в студии осцилограф или семисегментник?
А в VMLAB'e это есть??? :shock:
Что-то быстро он мне разонравился, что я этого даже не заметил :)))
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Так зачем же вам чистить всю RAM и все регистры? Сначала вершину стека объявите, а уж потом остальное. Тем более, вам надо помигать светодиодом.
Сейчас я её проверю сам...
I am DX168B and this is my favourite forum on internet!
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

ну где-то так
я не говорил что там полноценный осцил :)))
семисегментник, lcd, I2C монитор - через user define, в 3.15 включены в комплект.
Вложения
003-осцилограф.png
(189.71 КБ) 461 скачивание
Последний раз редактировалось GP1 Чт фев 02, 2012 21:26:57, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

slavik.ksu писал(а):Добрый Вечер! Возник вопрос по таймеру:
Запускаю таймер, разрешаю прерывание "по совпадению" в режиме СТС (то есть сброс при совпадении). В обработчике прерывания просто мигаю светодиодом. НЕ МИГАЕТСЯ!!!
и как понимать? :) может что подскажете?
Вот прога
Уверен?
может он просто очень быстро мигает :wink:
с частотой, скажем :roll: , около 244 Гц? (исправил 60 Гц, в симуляторе стояла тактовая 1 МГц)
Последний раз редактировалось GP1 Чт фев 02, 2012 21:52:04, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

ploop писал(а): А в VMLAB'e это есть??? :shock:
вот нашел в старом проекте
Вложения
VMLab_3.15.PNG
(29.52 КБ) 464 скачивания
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Да кстати, код работает. :))) Но мигает он очень быстро. :))) :))) :)))
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

GP1, ясно.
Но всё равно костыль! :)))
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

согласен.
но для прикидки пойдет
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Вымогатель припоя
Сообщения: 680
Зарегистрирован: Ср фев 24, 2010 19:16:07

Сообщение ВитГо »

вопрос вроде детский, но найти ответ на него не могу уже второй день:

пишу на ассемблере, gnu gcc
нужно задать значение регистра которое вычисляется из констант, чтото вроде

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

MOV R0 , CONST_VERY_LONG_NAME_1 + CONST_VERY_LONG_NAME_2 + CONST_VERY_LONG_NAME_3 + CONST_VERY_LONG_NAME_4 + CONST_VERY_LONG_NAME_5
Как видно - параметров много и будучи записанными в строку в редакторе на экран они не влазят (перенос только здесь при выводе на экран)..

каким образом мне записать это в виде

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

MOV R0 , CONST_VERY_LONG_NAME_1 + 
             CONST_VERY_LONG_NAME_2 + 
             CONST_VERY_LONG_NAME_3 + 
             CONST_VERY_LONG_NAME_4 + 
             CONST_VERY_LONG_NAME_5
В этом ассемблере есть какой нить символ переноса данных на следующую строку ?
обратный слеш пробовал - не получилось (может не правильно пробовал ?)
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Пишем диплом? "Отверженных"? "Войну и мир"? Не думаю. А стало быть даем краткие и понятные имена. В том числе константам.
Docendo discimus
Контактная информация:
Ответить

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