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

Обсуждаем контроллеры компании Atmel.
andrestudio
Открыл глаза
Сообщения: 50
Зарегистрирован: Вт сен 04, 2007 18:06:40

Сообщение andrestudio »

Nata ну и задачка, вот только для АТ89С51 у себя смог найти, и то есть сомнения что то вобще будет работать

кстати уважаемые коты :) нашёл книгу в сети
Микроконтроллеры AVR - Хартов В.Я.,
нужна была математика для AVR, так многие мои вопросы будут сняты, скан хороший кому нужна лежит сдесь http://www.gsm-forum.name/forum/viewtopic.php?t=421&sid=b988de95e3e72db4dd35bfccaf2152da
Вложения
IDE_USB_kontroller.rar
Контроллер жесткого диска для USB порта
(52.94 КБ) 489 скачиваний
ДА будет свет!
Nata
Родился
Сообщения: 2
Зарегистрирован: Ср ноя 12, 2008 21:54:13

Сообщение Nata »

Спасибо, этот пример я уже находила. :) Я затрудняюсь деассемблировать tsk файл.Подскажите пожалуйста как это можно сделать, если можно. А вобще хотелось бы исходник :(
ipkin
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт июл 10, 2007 23:15:17
Откуда: Магнитогорск

Сообщение ipkin »

хочу посчитать импульсы приходящие на вход tinny2313
допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи
в мк51 я пользовался JNB и JB
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ipkin писал(а):хочу посчитать импульсы приходящие на вход tinny2313
допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи
в мк51 я пользовался JNB и JB
в AVR для этого можно использовать SBIS и SBIC
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
ipkin
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вт июл 10, 2007 23:15:17
Откуда: Магнитогорск

Сообщение ipkin »

спасибо попробую
poff
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс авг 10, 2008 00:41:08

Сообщение poff »

Доброго времени суток... Пытаюсь освоить Mega8535. Для начала решил помигать светодиодами. Обнаружил следующее: при обращении к одной и той же подпрограмме два и более раза подряд програмуля не работает. К примеру:

.cseg
.org 0

rjmp Reset

;****************************

Reset: ldi temp,high(RAMEND)
out SPH,temp

ldi temp,low(RAMEND)
out SPL,temp

ldi Temp,0b00000000 ;настройка портов
out DDRA,Temp
ldi Temp,0b00001111 ;настройка портов
out DDRB,Temp
ldi Temp,0b00111111 ;настройка портов
out DDRC,Temp
ldi Temp,0b00000011 ;настройка портов
out DDRD,Temp

; основная программа

ldi temp3,0b11101111

start: dec temp
brne sin
rcall delay
rcall delay
ldi temp,9
rol temp3
out portc,temp3
rjmp start

sin: rcall delay
out portb,temp
rcall delay
rjmp start

;подпрограмма задержки

Delay: ldi temp1,0
ldi temp2,0

Loop: dec temp1
brne Loop

dec temp2
brne Loop

ret

Если оставить одну строку rcall delay (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

poff писал(а):Доброго времени суток...
Если оставить одну строку rcall delay (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.

Во-первых, что значит не работает? симптомы опишите.
Во воторых в подпрограмме у вас изменяется статус регистр (SREG) засчет арифметических операций над регистрами. В этом случае это может не влиять на работостпособность, но лучше точно знать, что находится в SREG после вызова подпрограммы.
Замечание: для оформления кода используйте теги code
dremov
Родился
Сообщения: 10
Зарегистрирован: Чт сен 25, 2008 20:41:17

Сообщение dremov »

poff писал(а):Доброго времени суток... Пытаюсь освоить Mega8535. Для начала решил помигать светодиодами. Обнаружил следующее: при обращении к одной и той же подпрограмме два и более раза подряд програмуля не работает.

По первому впечатлению ситуация малореальна. Попробовал в эмуляторе (Vmlab) - все работает, светодиоды мигают, никакой разницы между одним вызовом и двумя не обнаружил. Хотя нужно сказать - довольно рискованно надеятся, что флаг С через который происходит сдвиг регистра никто не попортит. Я бы его в стек запихнул.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

poff писал(а):Доброго времени суток.... Где грабли зарыты? Заранее благодарен.

Вот еще мыслишка появилась с учетом результатов симуляции dremov. Не занаю есть ли в меге8535 WDT, но если есть и если его можно жестко включить фьюзами, то возможно задержка осуществляемая двумя подпрограммами больше периода WDT и он просто напросто срабатывает и сбрасывает контроллер.
poff
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс авг 10, 2008 00:41:08

Сообщение poff »

Благодарен dremov и smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall :shock:
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

poff писал(а):Благодарен dremov и smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall :shock:

Проверьте фьюзы я уточнил сторожевой таймер в меге8535 есть, и если он включен (запрограммирован фьюз WDTON), то может быть описанное вами поведение. Проверить перезагружается ли контроллер просто - сделайте на один из портов подтяжку из резистора (пусть будет 5 кОм) и в вашей программе сразу после инициализации стека настраивайте эту ногу на выход и устанавливайте в 0. В результате если происходит ресет то на ноге будут периодические переходы из 1 в 0. Если не чем посмотреть (я имею ввиду осциллограф) то можно сделать так как в файле вложения (естестевенно ногу, подключенную к светодиоду, как и в первом случае нужно настроить на выход и установить в 0, сразу после инициализации стека) если светодиод будет "гореть в полнакала" или мигать, то значит происходит сброс (по какой-либо из причин) и переинициализируется регистр temp в результате он может никогда не достигнуть 0. Если светодиод будет гореть ровно значит грабли в другом месте :)
Сказанное относительно светодиода справедливо если, кроме как в начале программы, вы больше нигде не будете "шевелить ногой", подключенной к светодиоду.
Вложения
text2415.png
отладочный светодиод
(2.95 КБ) 745 скачиваний
poff
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс авг 10, 2008 00:41:08

Сообщение poff »

:shock: to Smac Все проверил WDT выключен. Очевидно, грабли в другом месте. Попытался проделать тоже на MEGA32 - эфект тот-же. :shock:
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

poff писал(а)::shock: to Smac Все проверил WDT выключен. Очевидно, грабли в другом месте. Попытался проделать тоже на MEGA32 - эфект тот-же. :shock:

Еще два предположения:
1) Нестабильное или шумное питание контроллера проверить можно только осциллографом или использовать заведомо "хорошее" питание. например можно от 3 батареек 1,5 В запитать. Такре проверьте что у вас с встроенным супервизором питания (BOD)
2)Попробуйте переместить основную программу "подальше" от векторов прерываний (ну мало-ли что) сделать это можно так:

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

.cseg 
.org 0

rjmp Reset

;****************************

.org 0x100 ; размещаем дальнейшую программу с адреса 100 hex

Reset: ldi temp,high(RAMEND)
out SPH,temp

ldi temp,low(RAMEND)
out SPL,temp
 и далее ваша программа.

также можно таблицу прерываний заполнить, хотя в этом случае они не используются.
Кстати вы проверку перезагрузки (см. мой предыдущий пост) сделали?
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

poff писал(а):Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall

Что значит "останавливается" ????? Она может зациклиться на каком-либо блоке, или одной команде с переходом. Не в спящий же режим переходит!

Кстати, вот это:

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

rcall delay ldi temp,9
чё ещё за извращение, разбей на 2 строки. Или это только здесь, на форуме опечатка?

А вот про это уже говорили выше:

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

rol temp3

Ты крутишь temp3 через флаг C, в котором на момент команды может быть хоть 1, хоть 0, а вовсе не 7-ой бит сдвинутый предыдущей прокруткой.
Лучше заменить например на это:

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

bst temp3,7
lsl temp3
bld temp3,0
Последний раз редактировалось YurkaM Вс ноя 30, 2008 14:05:56, всего редактировалось 1 раз.
poff
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс авг 10, 2008 00:41:08

Сообщение poff »

to YurkaM . Програмуля писалась специально для форума, чтобы с минимальными затратами показать форумчанам размер граблей. При переносе кода в форум случайно слились две строки, что не меняет суть. Программа работает только при использовании однократного обращения к подпрограмме Delay.
to Smac. Фузы перепроверены много раз. На своем лабораторном источнике питания я отладил не один проект - проблема с питанием отпадает. Пробовал переносить (по Вашему совету) программу на 100 шагов вперед - даже рабочий код вообще не работает !!! Думаю стоит поблагодарить всех за терпение и внимание и хорошенько переспать с этим горем. Но если появятся идеи буду рад.

ЗЫ. Все началось с того, что я написал и сделал часы на 2313 (http://www.radiokot.ru/forum/viewtopic. ... &start=340) а потом решил их улучшить - добавить календарь, термометр, индикацию года и пр. Для этого понадобился процик помощнее. Вот так и поимел грабли... :shock:
Аватара пользователя
bsyomov
Нашел транзистор. Понюхал.
Сообщения: 179
Зарегистрирован: Вт ноя 04, 2008 11:15:49
Откуда: Санкт-Петербург
Контактная информация:

Сообщение bsyomov »

Код не влезал? А то вычислительных мощностей вроде больше и некуда на часы-то? =)
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

poff писал(а):... Пробовал переносить (по Вашему совету) программу на 100 шагов вперед - даже рабочий код вообще не работает !!!...

Вот это очень странно. Такое может быть если код не влезает в кристалл.
В общем, заполните таблицу прерываний, и попробуйте еще раз рабочий код переместить, если рабочий код с начала флеш работает а с середины нет, значит что-то не так. Попробуйте верификацию флеша сделать после программирования или контроллер поменять. В общем у меня след. подозрения - или флеш битый или места в кристалле не хватает. Правда по своему опыту скажу, что все бывает намного прозаичней и проблема зачастую бывает не в коде и не в контроллере, а например в плате. Т. е. обычно проблема заключается в человеческой невнимательности.
Попробуйте еще раз все перепроверить с самого начала. Ну например, убедившись в наличии питания и генерации, сделать простейшую программу мигания светодиодом используя при этом два (или более) вызова подпрограммы Delay, приведенной в Вашем посте выше. Например так:

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

.cseg
.org 0

rjmp Reset

;****************************

Reset: ldi temp,high(RAMEND)
out SPH,temp

ldi temp,low(RAMEND)
out SPL,temp

ser Temp   ; настраиваем
out DDRB,Temp   ; порт B на вывод
 

; основная программа

clr temp
ldi temp3, (1<<PORTB4); маска для "мигания" выводом PORTB4

start:
in temp, PORTB   ; читаем порт
eor temp, temp3   ; применяем маску тем самым инвертируем нужный бит
out PORTB, temp   ; выводим в порт
rcall Delay
rcall Delay
rjmp start

;подпрограмма задержки

Delay: ldi temp1,0
ldi temp2,0

Loop: dec temp1
brne Loop

dec temp2
brne Loop

ret

П. С. Сейчас пришла еще одна мысль. У Вас пин AVCC и оба GND подключены? Если нет, то подключите AVCC к VCC, оба GND заведите на землю. И еще, на всякий случай, приведите определения регистров temp, temp1, temp2, temp3.
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

И всё таки чтобы как-то помочь найти проблему, хотелось бы понять,
что значит
"программа останавливается"?
и что значит
"код вообще не работает"?
Как определяешь, что останавливается или не работает? По каким признакам? В смиуляторе-то всё нормально! (ну кроме команды ROL - об этом выше говорилось).

обычно проблема заключается в человеческой невнимательности

Скорей всего именно это!
poff
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Вс авг 10, 2008 00:41:08

Сообщение poff »

to smac. Прописал полностью таблицу прерываний и все заработало!!! Огромное спасибо всем соучасникам. Постараюсь в предь не вести себя по козлиному и тоже делиться тем чего знаю. А то иногда и знаешь как проблема решается, но по клаве стычать облом. Всех поздравляю... :)
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

И тем не менее, причину ты не выяснил. Просто методом тыка устранил следствие.
И это не есть правильно.. :(
Ответить

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