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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

1. чем команда "OR" отличается от "ORI" ??? я вроде так понял, что первая для констант, вторая для регистров.... объясните, пожалуйста.?
Наоборот. Первая работает регистр-регистр, вторая - регистр-константа
#ifndef F_CPU
#error "F_CPU must be defined!"
#endif
Если константа F_CPU не задана, вывести ошибку с текстом "F_CPU must be defined!"
#if F_CPU < 4000000
#warning "F_CPU too low, possible wrong delay"
#endif
Если константа F_CPU меньше 4000000 вывести ошибку с текстом "F_CPU too low, possible wrong delay"
#define ...
задать константу такую-то
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Пн май 19, 2008 17:06:45
Откуда: Казахстан, Семипалатинск

Сообщение Tanat »

Челюскин писал(а):

#ifndef F_CPU
#error "F_CPU must be defined!"
#endif


Это значит, что F_CPU должно было быть описано выше командой #define, иначе компилятор выдаст ошибку с прекращением компиляции и выводом строки #error "F_CPU must be defined!"

Челюскин писал(а):
#if F_CPU < 4000000
#warning "F_CPU too low, possible wrong delay"
#endif


Тут при компиляции будет варниг с сообщением что частота F_CPU слишком мала и возможно будет ошибочная длительность задержки

Челюскин писал(а): #define CYCLES_PER_US (F_CPU/1000000)
#define C4PUS (CYCLES_PER_US/4)
#define DVUS(x) (C4PUS*x)
Эти определения вычисляют значения для подстановки их в подпрограммы организации задержки.
Например:
#define F_CPU 4000000 //(4MHz)

// CYCLES_PER_US (F_CPU/1000000) 4000000/1000000 результат 4
//C4PUS (4/4) результат = 1 (4-ка получена выше)


//А вот эта команда и провернет все выше описанное
r18 = DVUS(x)

// (((F_CPU/1000000)/4)*x) где х-переменная или константа
//и в нашем случае r18 будет равно х
Проверить, внимательно посмотреть по даташитам и ещё проверить!
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

Сообщение Челюскин »

Спасибо огромное. вроде понял. может подскажете, где можно почитать про такие функции типа #error и #ifnde.????
Лень - двигатель прогресса!
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 24
Зарегистрирован: Пн май 19, 2008 17:06:45
Откуда: Казахстан, Семипалатинск

Сообщение Tanat »

Челюскин писал(а):Спасибо огромное. вроде понял. может подскажете, где можно почитать про такие функции типа #error и #ifnde.????
НЕ ФУНКЦИИ - это директивы, которые компилятор использует при компиляции кода.
Поищите справочник по языку которым пользуетесь.
Проверить, внимательно посмотреть по даташитам и ещё проверить!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 209
Зарегистрирован: Ср ноя 03, 2010 14:46:17

Сообщение Челюскин »

понял, что ничё пока не знаю про этот язык. спасибо еще раз всем за терпение и Ваши объяснения. буду дальше вникать в ассемблер...
Лень - двигатель прогресса!
Реклама
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

Здравствуйте, господа.
Пишу программу на ассемблере можно сказать первую в жизни,
есть обработчик прерывания АЦП он срабатывает все нормально в конце обработчика стоит как положено reti (не ret).
в начале программы так же стоит инициализация стека.
все работает нормально.

но если в обработчике прерывания я использую команду
CP либо CPI вываливается ошибка
Program counter at unprogrammed flash location
и программа не возвращается в бесконечный цикл, вообщем она теряет место от куда была вызвана.
подскажите почему так происходит.
Реклама
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Программу приведите, мы не научились обладать экстрасенсорными способностями...
Не умеешь - не берись, но не взявшись не научишься...
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Наверное надо показать обработчик.
После CP есть условные переходы (BRxx) куда-то? Они верны?
Сам по себе CP не может никак повлиять на ход выполнения программы, он всего лишь устанавливает флаги...
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

вот текст, убрал все что не относиться к ошибке



.include "C:\VMLAB\include\m8535def.inc"


.def temp =r16
.def temp2 =r17
.def temp3 =r26

.cseg
.org 0

rjmp start
reti ; Addr $01
reti ; Addr $02
rjmp timer2comp ; Addr $03 - вектор прерывания по таймеру 2 (сравнение с числом в регистре)
reti ; Addr $04
reti ; Addr $05
reti ; Addr $06
reti ; Addr $07
reti ; Addr $08
reti ; Addr $09
reti ; Addr $0A
reti ; Addr $0B
reti ; Addr $0C
reti ; Addr $0D
rjmp ADC_ConversionComplite ; Addr $0E
reti ; Addr $0F
reti ; Addr $10
reti ; Addr $11
reti ; Addr $12
reti ; Addr $13
reti ; Addr $14


start:
;настройка АЦП и таймера
ldi temp,0b0110000
out ADMUX,temp
ldi temp,0b11101111
out ADCSRA,temp
ldi temp,0b00001111
ldi temp,0b00000000
out TCNT2,temp
ldi temp,5
out OCR2,temp
ldi temp,0b10000000
out TIMSK,temp
ldi temp,RamEnd
out SPL,temp

sei

forever:
nop
nop
nop
nop
rjmp forever

timer2comp:
nop
nop
reti

ADC_ConversionComplite:
in temp,ADCH
mov temp2,temp
ldi temp,255
;******ЕСЛИ ЗАКОММЕНТИРОВАТЬ ЭТИ ДВЕ СТРОКИ ТО РАБОТАЕТ
; а с ними ошибка
cp temp2,temp
brsh label1
;*******************************************************
label1:
nop
nop
reti
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Ну а какой смысл с участка

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

cp temp2,temp
brsh label1
;*******************************************************
label1:
nop
Ваше условие в данном слу-ча-е... БЕСПОЛЕЗНО! :)))
Если между brsh label1 и label1 вписать что нибудь полезное, то тогда будут два действия в зависимости от того, temp2 больше или меньше temp1
Типа так:

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

cp temp2, temp
brsh label1
; действие, если temp2 < temp
reti
Label1:
;Действие, если temp2 >= temp
reti
Вот и всё
Последний раз редактировалось DX168B Вс янв 29, 2012 23:24:41, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

дело не в условии а в том что, ошибка в ходе выполнения.
после reti не возвращается в бесконечный цикл.
там можно вообще без brsh написать все равно.

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

Сообщение DX168B »

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

Сообщение ploop »

ааааа... опять симуляторы...
В железке-то не пытались запустить?

То, что между метками, как-то использует стек? Или прямо этот код (как вы привели, с пустотой между метками) не компилится? Если второе - глюк симулятора 100%
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

ploop писал(а):глюк симулятора 100%
Вот с этим я соглашусь на 300%. Имел я дело с этим симулятором. У него кажется какие - то проблемы с кодировками символов в исходниках или сам он "БАГ на БАГе"
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

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

Сообщение DX168B »

В коде нет ошибки. Меняйте среду разработки. Используйте среду AVR Studio 4.
Это официальная среда от ATMEL. Бесплатная. У них на сайте её уже нет, ищите на торрентах.
А если хочется ещё и потыкать по виртуальным кнопкам или помигать виртуальными светодиодами и многое-многое другое, то пользуйтесь программой Proteus.
У меня когда-то этот VMLAB часто на ровном месте спотыкался. Пришлось отказаться от него.

Блин... Не заметил.
В меге 8535 инициализация стека делается так:

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

ldi temp, Low(RAMend)
out SPL, temp
ldi temp, High(RAMend)
out SPH, temp
Последний раз редактировалось DX168B Вс янв 29, 2012 23:50:28, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

тот код что выложил именно в нем ошибка.
Ну, уже ответили. VMLAB тоже пробовал, что-то он вообще не в тему оказался... Уж лучше (чур меня) протеус.

Блин, и как я умудряюсь по 4К кода в одном блокноте писать... Иногда страницы 2-3 нафигаришь, зашьёшь, а он не то, что бы скомпилился без ошибки, так еще и работает! :)
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

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

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

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

sei

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

Сообщение ploop »

Угу, теперь вижу. Тоже не заметил, в куче всё написано, хотя обычно его выделяют как-то...
Встал на лапы
Сообщения: 100
Зарегистрирован: Ср дек 24, 2008 11:59:24
Откуда: Москва

Сообщение AaNnDdRrEeYy »

копирнул исходник в AVR stodio 4 так он мне сразу ругнулся на заголовочный файл
.include "C:\VMLAB\include\m8535def.inc"

выташил от туда эти строки

;UCSRA
.equ RXC =7
.equ TXC =6
.equ UDRE =5
.equ FE =4

+++РУГАЕТСЯ ВОТ НА ЭТУ СТРОКУ
.equ OR =3 ; old name kept for compatibilty
+++


думаю что дело не в компиляторе а в заголовочных файлов на другом контроллере наверно работало бы.
Ответить

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