Страница 8 из 400
Добавлено: Сб ноя 15, 2008 20:21:56
andrestudio
Nata ну и задачка, вот только для АТ89С51 у себя смог найти, и то есть сомнения что то вобще будет работать
кстати уважаемые коты

нашёл книгу в сети
Микроконтроллеры AVR - Хартов В.Я.,
нужна была математика для AVR, так многие мои вопросы будут сняты, скан хороший кому нужна лежит сдесь
http://www.gsm-forum.name/forum/viewtop ... ccaf2152da
Добавлено: Пн ноя 17, 2008 11:15:21
Nata
Спасибо, этот пример я уже находила.

Я затрудняюсь деассемблировать tsk файл.Подскажите пожалуйста как это можно сделать, если можно. А вобще хотелось бы исходник

Добавлено: Чт ноя 20, 2008 23:43:05
ipkin
хочу посчитать импульсы приходящие на вход tinny2313
допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи
в мк51 я пользовался JNB и JB
Добавлено: Чт ноя 20, 2008 23:46:31
ARV
ipkin писал(а):хочу посчитать импульсы приходящие на вход tinny2313
допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи
в мк51 я пользовался JNB и JB
в AVR для этого можно использовать SBIS и SBIC
Добавлено: Чт ноя 20, 2008 23:51:21
ipkin
спасибо попробую
Добавлено: Ср ноя 26, 2008 01:05:06
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 (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
Добавлено: Ср ноя 26, 2008 10:21:07
smac
poff писал(а):Доброго времени суток...
Если оставить одну строку rcall delay (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
Во-первых, что значит не работает? симптомы опишите.
Во воторых в подпрограмме у вас изменяется статус регистр (SREG) засчет арифметических операций над регистрами. В этом случае это может не влиять на работостпособность, но лучше точно знать, что находится в SREG после вызова подпрограммы.
Замечание: для оформления кода используйте теги code
Добавлено: Ср ноя 26, 2008 23:14:22
dremov
poff писал(а):Доброго времени суток... Пытаюсь освоить Mega8535. Для начала решил помигать светодиодами. Обнаружил следующее: при обращении к одной и той же подпрограмме два и более раза подряд програмуля не работает.
По первому впечатлению ситуация малореальна. Попробовал в эмуляторе (Vmlab) - все работает, светодиоды мигают, никакой разницы между одним вызовом и двумя не обнаружил. Хотя нужно сказать - довольно рискованно надеятся, что флаг С через который происходит сдвиг регистра никто не попортит. Я бы его в стек запихнул.
Добавлено: Чт ноя 27, 2008 11:08:04
smac
poff писал(а):Доброго времени суток.... Где грабли зарыты? Заранее благодарен.
Вот еще мыслишка появилась с учетом результатов симуляции
dremov. Не занаю есть ли в меге8535 WDT, но если есть и если его можно жестко включить фьюзами, то возможно задержка осуществляемая двумя подпрограммами больше периода WDT и он просто напросто срабатывает и сбрасывает контроллер.
Добавлено: Пт ноя 28, 2008 00:14:48
poff
Благодарен
dremov и
smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall

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

Проверьте фьюзы я уточнил сторожевой таймер в меге8535 есть, и если он включен (запрограммирован фьюз WDTON), то может быть описанное вами поведение. Проверить перезагружается ли контроллер просто - сделайте на один из портов подтяжку из резистора (пусть будет 5 кОм) и в вашей программе сразу после инициализации стека настраивайте эту ногу на выход и устанавливайте в 0. В результате если происходит ресет то на ноге будут периодические переходы из 1 в 0. Если не чем посмотреть (я имею ввиду осциллограф) то можно сделать так как в файле вложения (естестевенно ногу, подключенную к светодиоду, как и в первом случае нужно настроить на выход и установить в 0, сразу после инициализации стека) если светодиод будет "гореть в полнакала" или мигать, то значит происходит сброс (по какой-либо из причин) и переинициализируется регистр temp в результате он может никогда не достигнуть 0. Если светодиод будет гореть ровно значит грабли в другом месте
Сказанное относительно светодиода справедливо если, кроме как в начале программы, вы больше нигде не будете "шевелить ногой", подключенной к светодиоду.
Добавлено: Пт ноя 28, 2008 01:29:32
poff
to Smac Все проверил WDT выключен. Очевидно, грабли в другом месте. Попытался проделать тоже на MEGA32 - эфект тот-же.

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

Еще два предположения:
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
и далее ваша программа.
также можно таблицу прерываний заполнить, хотя в этом случае они не используются.
Кстати вы проверку перезагрузки (см. мой предыдущий пост) сделали?
Добавлено: Пт ноя 28, 2008 13:02:04
YurkaM
poff писал(а):Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall
Что значит "останавливается" ????? Она может зациклиться на каком-либо блоке, или одной команде с переходом. Не в спящий же режим переходит!
Кстати, вот это:
чё ещё за извращение, разбей на 2 строки. Или это только здесь, на форуме опечатка?
А вот про это уже говорили выше:
Ты крутишь temp3 через флаг C, в котором на момент команды может быть хоть 1, хоть 0, а вовсе не 7-ой бит сдвинутый предыдущей прокруткой.
Лучше заменить например на это:
Добавлено: Вс ноя 30, 2008 05:15:58
poff
to
YurkaM . Програмуля писалась специально для форума, чтобы с минимальными затратами показать форумчанам размер граблей. При переносе кода в форум случайно слились две строки, что не меняет суть. Программа работает только при использовании однократного обращения к подпрограмме Delay.
to
Smac. Фузы перепроверены много раз. На своем лабораторном источнике питания я отладил не один проект - проблема с питанием отпадает. Пробовал переносить (по Вашему совету) программу на 100 шагов вперед - даже рабочий код вообще не работает !!! Думаю стоит поблагодарить всех за терпение и внимание и хорошенько переспать с этим горем. Но если появятся идеи буду рад.
ЗЫ. Все началось с того, что я написал и сделал часы на 2313 (
http://www.radiokot.ru/forum/viewtopic. ... &start=340) а потом решил их улучшить - добавить календарь, термометр, индикацию года и пр. Для этого понадобился процик помощнее. Вот так и поимел грабли...

Добавлено: Вс ноя 30, 2008 07:25:09
bsyomov
Код не влезал? А то вычислительных мощностей вроде больше и некуда на часы-то? =)
Добавлено: Вс ноя 30, 2008 12:59:29
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.
Добавлено: Вс ноя 30, 2008 14:02:19
YurkaM
И всё таки чтобы как-то помочь найти проблему, хотелось бы понять,
что значит
"программа останавливается"?
и что значит
"код вообще не работает"?
Как определяешь, что останавливается или не работает? По каким признакам? В смиуляторе-то всё нормально! (ну кроме команды ROL - об этом выше говорилось).
обычно проблема заключается в человеческой невнимательности
Скорей всего именно это!
Добавлено: Вт дек 02, 2008 01:34:37
poff
to
smac. Прописал полностью таблицу прерываний и все заработало!!! Огромное спасибо всем соучасникам. Постараюсь в предь не вести себя по козлиному и тоже делиться тем чего знаю. А то иногда и знаешь как проблема решается, но по клаве стычать облом. Всех поздравляю...

Добавлено: Вт дек 02, 2008 08:56:12
YurkaM
И тем не менее, причину ты не выяснил. Просто методом тыка устранил следствие.
И это не есть правильно..
