Спасибо, этот пример я уже находила. Я затрудняюсь деассемблировать tsk файл.Подскажите пожалуйста как это можно сделать, если можно. А вобще хотелось бы исходник
хочу посчитать импульсы приходящие на вход tinny2313
допустим portb1 кроме того некоторые разряды этого порта работают на вывод подскажите какими командами (ассемблер) воспользоваться для реализации данной задачи
в мк51 я пользовался JNB и JB
ipkin писал(а):хочу посчитать импульсы приходящие на вход 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 (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
poff писал(а):Доброго времени суток...
Если оставить одну строку rcall delay (выделено красным), то програмуля работает, а если две подряд, то нехочет. Где грабли зарыты? Заранее благодарен.
Во-первых, что значит не работает? симптомы опишите.
Во воторых в подпрограмме у вас изменяется статус регистр (SREG) засчет арифметических операций над регистрами. В этом случае это может не влиять на работостпособность, но лучше точно знать, что находится в SREG после вызова подпрограммы.
Замечание: для оформления кода используйте теги code
poff писал(а):Доброго времени суток... Пытаюсь освоить Mega8535. Для начала решил помигать светодиодами. Обнаружил следующее: при обращении к одной и той же подпрограмме два и более раза подряд програмуля не работает.
По первому впечатлению ситуация малореальна. Попробовал в эмуляторе (Vmlab) - все работает, светодиоды мигают, никакой разницы между одним вызовом и двумя не обнаружил. Хотя нужно сказать - довольно рискованно надеятся, что флаг С через который происходит сдвиг регистра никто не попортит. Я бы его в стек запихнул.
poff писал(а):Доброго времени суток.... Где грабли зарыты? Заранее благодарен.
Вот еще мыслишка появилась с учетом результатов симуляции dremov. Не занаю есть ли в меге8535 WDT, но если есть и если его можно жестко включить фьюзами, то возможно задержка осуществляемая двумя подпрограммами больше периода WDT и он просто напросто срабатывает и сбрасывает контроллер.
Благодарен dremov и smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall
poff писал(а):Благодарен dremov и smak за сочуствие в моем небольшом горе... В симуляторах свою програмулю я тоже проверял, все работает. На макете диоды мигают только если на подпрограмму ссылаться один раз. Рассавлял програмные метки типа sbi/cbi по ходу программы - должны были зажигаться/гаснуть дополнительные светодиоды при проходе определенных мест в программе. Так вот,приналичии двух обращений к подпрограмме, программа останавливается перед перед первым переходом rcall
Проверьте фьюзы я уточнил сторожевой таймер в меге8535 есть, и если он включен (запрограммирован фьюз WDTON), то может быть описанное вами поведение. Проверить перезагружается ли контроллер просто - сделайте на один из портов подтяжку из резистора (пусть будет 5 кОм) и в вашей программе сразу после инициализации стека настраивайте эту ногу на выход и устанавливайте в 0. В результате если происходит ресет то на ноге будут периодические переходы из 1 в 0. Если не чем посмотреть (я имею ввиду осциллограф) то можно сделать так как в файле вложения (естестевенно ногу, подключенную к светодиоду, как и в первом случае нужно настроить на выход и установить в 0, сразу после инициализации стека) если светодиод будет "гореть в полнакала" или мигать, то значит происходит сброс (по какой-либо из причин) и переинициализируется регистр temp в результате он может никогда не достигнуть 0. Если светодиод будет гореть ровно значит грабли в другом месте
Сказанное относительно светодиода справедливо если, кроме как в начале программы, вы больше нигде не будете "шевелить ногой", подключенной к светодиоду.
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
и далее ваша программа.
также можно таблицу прерываний заполнить, хотя в этом случае они не используются.
Кстати вы проверку перезагрузки (см. мой предыдущий пост) сделали?
Ты крутишь temp3 через флаг C, в котором на момент команды может быть хоть 1, хоть 0, а вовсе не 7-ой бит сдвинутый предыдущей прокруткой.
Лучше заменить например на это:
to YurkaM . Програмуля писалась специально для форума, чтобы с минимальными затратами показать форумчанам размер граблей. При переносе кода в форум случайно слились две строки, что не меняет суть. Программа работает только при использовании однократного обращения к подпрограмме Delay.
to Smac. Фузы перепроверены много раз. На своем лабораторном источнике питания я отладил не один проект - проблема с питанием отпадает. Пробовал переносить (по Вашему совету) программу на 100 шагов вперед - даже рабочий код вообще не работает !!! Думаю стоит поблагодарить всех за терпение и внимание и хорошенько переспать с этим горем. Но если появятся идеи буду рад.
ЗЫ. Все началось с того, что я написал и сделал часы на 2313 (http://www.radiokot.ru/forum/viewtopic. ... &start=340) а потом решил их улучшить - добавить календарь, термометр, индикацию года и пр. Для этого понадобился процик помощнее. Вот так и поимел грабли...
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.
И всё таки чтобы как-то помочь найти проблему, хотелось бы понять,
что значит
"программа останавливается"?
и что значит
"код вообще не работает"?
Как определяешь, что останавливается или не работает? По каким признакам? В смиуляторе-то всё нормально! (ну кроме команды ROL - об этом выше говорилось).
обычно проблема заключается в человеческой невнимательности
to smac. Прописал полностью таблицу прерываний и все заработало!!! Огромное спасибо всем соучасникам. Постараюсь в предь не вести себя по козлиному и тоже делиться тем чего знаю. А то иногда и знаешь как проблема решается, но по клаве стычать облом. Всех поздравляю...