Страница 120 из 400

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

Добавлено: Вс янв 29, 2012 23:58:51
DX168B
Вы нарвались на его старую ошибку. Исправьте OR на DOR и всё будет ОК. :)
Атмеловцы ошиблись при написании заголовочника и не дописали один символ. Это единственная его ошибка.

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

Добавлено: Пн янв 30, 2012 00:00:19
ploop
У студии свои заголовочные файлы. Просто оставь .include "m8535def.inc"
Или оставь как было, а стек поправь, попробуй в VMLAB'e. Но студия всё равно удобней.

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

Добавлено: Пн янв 30, 2012 00:00:51
AaNnDdRrEeYy
DX168B писал(а):AaNnDdRrEeYy неправильно стек инициализировал.
Указал только младшую часть адреса ОЗУ под стек.

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

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

sei

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

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

ldi temp,0b00000000 
out SPH,temp
все равно не работало.
а так вообще можно?

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

Добавлено: Пн янв 30, 2012 00:03:50
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-битная константа или просто указанный последний адрес ОЗУ. Описан в заголовочнике на МК.

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

Добавлено: Пн янв 30, 2012 00:15:04
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 тоже работает.
спасибо большое.

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

Добавлено: Пн янв 30, 2012 00:24:04
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
Всё должно работать. У меня работает.

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

Добавлено: Чт фев 02, 2012 19:03:08
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

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

Добавлено: Чт фев 02, 2012 19:16:11
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

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

Добавлено: Чт фев 02, 2012 20:51: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 +++++++++++++++++
С вашей версией определения векторов такая же ситуация, то есть проблема не в этом, другие ж прерывания как надо работают .

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

Добавлено: Чт фев 02, 2012 20:59:59
GP1
ploop писал(а):... попробуй в VMLAB'e. Но студия всё равно удобней.
не согласен, с точки зрения отладки VMLab гораздо удобней студии и несоизмеримо проще протеуса.
ну где вы видели в студии осцилограф или семисегментник?
нет VMLab все-таки удобная вещь.
применение ограничивает куцый набор камней и куча косяков, но м8, м16 нормально симулирует, а для старта - самое оно, на себе проверял :))) .

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

Добавлено: Чт фев 02, 2012 21:06:13
ploop
ну где вы видели в студии осцилограф или семисегментник?
А в VMLAB'e это есть??? :shock:
Что-то быстро он мне разонравился, что я этого даже не заметил :)))

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

Добавлено: Чт фев 02, 2012 21:17:42
DX168B
Так зачем же вам чистить всю RAM и все регистры? Сначала вершину стека объявите, а уж потом остальное. Тем более, вам надо помигать светодиодом.
Сейчас я её проверю сам...

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

Добавлено: Чт фев 02, 2012 21:22:24
GP1
ну где-то так
я не говорил что там полноценный осцил :)))
семисегментник, lcd, I2C монитор - через user define, в 3.15 включены в комплект.

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

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

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

Добавлено: Чт фев 02, 2012 21:49:49
GP1
ploop писал(а): А в VMLAB'e это есть??? :shock:
вот нашел в старом проекте

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

Добавлено: Чт фев 02, 2012 21:50:02
DX168B
Да кстати, код работает. :))) Но мигает он очень быстро. :))) :))) :)))

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

Добавлено: Чт фев 02, 2012 22:20:37
ploop
GP1, ясно.
Но всё равно костыль! :)))

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

Добавлено: Пт фев 03, 2012 07:31:53
GP1
согласен.
но для прикидки пойдет

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

Добавлено: Чт фев 09, 2012 06:30:51
ВитГо
вопрос вроде детский, но найти ответ на него не могу уже второй день:

пишу на ассемблере, 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
В этом ассемблере есть какой нить символ переноса данных на следующую строку ?
обратный слеш пробовал - не получилось (может не правильно пробовал ?)

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

Добавлено: Чт фев 09, 2012 06:55:58
pyzhman
Пишем диплом? "Отверженных"? "Войну и мир"? Не думаю. А стало быть даем краткие и понятные имена. В том числе константам.