Спасибо, этот пример я уже находила. Я затрудняюсь деассемблировать tsk файл.Подскажите пожалуйста как это можно сделать, если можно. А вобще хотелось бы исходник
хочу посчитать импульсы приходящие на вход tinny2313
допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи
в мк51 я пользовался JNB и JB
хочу посчитать импульсы приходящие на вход tinny2313 допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи в мк51 я пользовался JNB и JB
в AVR для этого можно использовать SBIS и SBIC
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Доброго времени суток... Пытаюсь освоить 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 (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
Доброго времени суток... Если оставить одну строку rcall delay (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
Во-первых, что значит не работает? симптомы опишите.
Во воторых в подпрограмме у вас изменяется статус регистр (SREG) засчет арифметических операций над регистрами. В этом случае это может не влиять на работостпособность, но лучше точно знать, что находится в SREG после вызова подпрограммы.
Замечание: для оформления кода используйте теги code
Зарегистрирован: Чт сен 25, 2008 20:41:17 Сообщений: 10
Рейтинг сообщения:0
poff писал(а):
Доброго времени суток... Пытаюсь освоить Mega8535. Для начала решил помигать светодиодами. Обнаружил следующее: при обращении к одной и той же подпрограмме два и более раза подряд програмуля не работает.
По первому впечатлению ситуация малореальна. Попробовал в эмуляторе (Vmlab) - все работает, светодиоды мигают, никакой разницы между одним вызовом и двумя не обнаружил. Хотя нужно сказать - довольно рискованно надеятся, что флаг С через который происходит сдвиг регистра никто не попортит. Я бы его в стек запихнул.
Доброго времени суток.... Где грабли зарыты? Заранее благодарен.
Вот еще мыслишка появилась с учетом результатов симуляции dremov. Не занаю есть ли в меге8535 WDT, но если есть и если его можно жестко включить фьюзами, то возможно задержка осуществляемая двумя подпрограммами больше периода WDT и он просто напросто срабатывает и сбрасывает контроллер.
Благодарен dremov и smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall
Благодарен dremov и smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall
Проверьте фьюзы я уточнил сторожевой таймер в меге8535 есть, и если он включен (запрограммирован фьюз WDTON), то может быть описанное вами поведение. Проверить перезагружается ли контроллер просто - сделайте на один из портов подтяжку из резистора (пусть будет 5 кОм) и в вашей программе сразу после инициализации стека настраивайте эту ногу на выход и устанавливайте в 0. В результате если происходит ресет то на ноге будут периодические переходы из 1 в 0. Если не чем посмотреть (я имею ввиду осциллограф) то можно сделать так как в файле вложения (естестевенно ногу, подключенную к светодиоду, как и в первом случае нужно настроить на выход и установить в 0, сразу после инициализации стека) если светодиод будет "гореть в полнакала" или мигать, то значит происходит сброс (по какой-либо из причин) и переинициализируется регистр temp в результате он может никогда не достигнуть 0. Если светодиод будет гореть ровно значит грабли в другом месте Сказанное относительно светодиода справедливо если, кроме как в начале программы, вы больше нигде не будете "шевелить ногой", подключенной к светодиоду.
Вложения:
Комментарий к файлу: отладочный светодиод text2415.png [2.95 KiB]
Скачиваний: 724
:shock: 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 и далее ваша программа.
также можно таблицу прерываний заполнить, хотя в этом случае они не используются.
Кстати вы проверку перезагрузки (см. мой предыдущий пост) сделали?
Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03 Сообщений: 151 Откуда: Казахстан
Рейтинг сообщения:0
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 раз.
to YurkaM . Програмуля писалась специально для форума, чтобы с минимальными затратами показать форумчанам размер граблей. При переносе кода в форум случайно слились две строки, что не меняет суть. Программа работает только при использовании однократного обращения к подпрограмме Delay.
to Smac. Фузы перепроверены много раз. На своем лабораторном источнике питания я отладил не один проект - проблема с питанием отпадает. Пробовал переносить (по Вашему совету) программу на 100 шагов вперед - даже рабочий код вообще не работает !!! Думаю стоит поблагодарить всех за терпение и внимание и хорошенько переспать с этим горем. Но если появятся идеи буду рад.
ЗЫ. Все началось с того, что я написал и сделал часы на 2313 (http://www.radiokot.ru/forum/viewtopic. ... &start=340) а потом решил их улучшить - добавить календарь, термометр, индикацию года и пр. Для этого понадобился процик помощнее. Вот так и поимел грабли...
... Пробовал переносить (по Вашему совету) программу на 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.
Карма: 1
Рейтинг сообщений: 3
Зарегистрирован: Пн сен 01, 2008 14:49:03 Сообщений: 151 Откуда: Казахстан
Рейтинг сообщения:0
И всё таки чтобы как-то помочь найти проблему, хотелось бы понять,
что значит
"программа останавливается"?
и что значит
"код вообще не работает"?
Как определяешь, что останавливается или не работает? По каким признакам? В смиуляторе-то всё нормально! (ну кроме команды ROL - об этом выше говорилось).
Цитата:
обычно проблема заключается в человеческой невнимательности
to smac. Прописал полностью таблицу прерываний и все заработало!!! Огромное спасибо всем соучасникам. Постараюсь в предь не вести себя по козлиному и тоже делиться тем чего знаю. А то иногда и знаешь как проблема решается, но по клаве стычать облом. Всех поздравляю...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения