Обсуждаем контроллеры компании Atmel.
Ответить

Сб ноя 15, 2008 20:21:56

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

кстати уважаемые коты :) нашёл книгу в сети
Микроконтроллеры AVR - Хартов В.Я.,
нужна была математика для AVR, так многие мои вопросы будут сняты, скан хороший кому нужна лежит сдесь http://www.gsm-forum.name/forum/viewtopic.php?t=421&sid=b988de95e3e72db4dd35bfccaf2152da
Вложения
IDE_USB_kontroller.rar
Контроллер жесткого диска для USB порта
(52.94 KiB) Скачиваний: 399

Пн ноя 17, 2008 11:15:21

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

Чт ноя 20, 2008 23:43:05

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

Чт ноя 20, 2008 23:46:31

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

Чт ноя 20, 2008 23:51:21

спасибо попробую

Ср ноя 26, 2008 01:05:06

Доброго времени суток... Пытаюсь освоить 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

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

Во-первых, что значит не работает? симптомы опишите.
Во воторых в подпрограмме у вас изменяется статус регистр (SREG) засчет арифметических операций над регистрами. В этом случае это может не влиять на работостпособность, но лучше точно знать, что находится в SREG после вызова подпрограммы.
Замечание: для оформления кода используйте теги code

Ср ноя 26, 2008 23:14:22

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

По первому впечатлению ситуация малореальна. Попробовал в эмуляторе (Vmlab) - все работает, светодиоды мигают, никакой разницы между одним вызовом и двумя не обнаружил. Хотя нужно сказать - довольно рискованно надеятся, что флаг С через который происходит сдвиг регистра никто не попортит. Я бы его в стек запихнул.

Чт ноя 27, 2008 11:08:04

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

Вот еще мыслишка появилась с учетом результатов симуляции dremov. Не занаю есть ли в меге8535 WDT, но если есть и если его можно жестко включить фьюзами, то возможно задержка осуществляемая двумя подпрограммами больше периода WDT и он просто напросто срабатывает и сбрасывает контроллер.

Пт ноя 28, 2008 00:14:48

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

Пт ноя 28, 2008 00:53:34

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

Проверьте фьюзы я уточнил сторожевой таймер в меге8535 есть, и если он включен (запрограммирован фьюз WDTON), то может быть описанное вами поведение. Проверить перезагружается ли контроллер просто - сделайте на один из портов подтяжку из резистора (пусть будет 5 кОм) и в вашей программе сразу после инициализации стека настраивайте эту ногу на выход и устанавливайте в 0. В результате если происходит ресет то на ноге будут периодические переходы из 1 в 0. Если не чем посмотреть (я имею ввиду осциллограф) то можно сделать так как в файле вложения (естестевенно ногу, подключенную к светодиоду, как и в первом случае нужно настроить на выход и установить в 0, сразу после инициализации стека) если светодиод будет "гореть в полнакала" или мигать, то значит происходит сброс (по какой-либо из причин) и переинициализируется регистр temp в результате он может никогда не достигнуть 0. Если светодиод будет гореть ровно значит грабли в другом месте :)
Сказанное относительно светодиода справедливо если, кроме как в начале программы, вы больше нигде не будете "шевелить ногой", подключенной к светодиоду.
Вложения
text2415.png
отладочный светодиод
(2.95 KiB) Скачиваний: 679

Пт ноя 28, 2008 01:29:32

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

Пт ноя 28, 2008 09:37:09

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
 и далее ваша программа.

также можно таблицу прерываний заполнить, хотя в этом случае они не используются.
Кстати вы проверку перезагрузки (см. мой предыдущий пост) сделали?

Пт ноя 28, 2008 13:02:04

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 раз.

Вс ноя 30, 2008 05:15:58

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

ЗЫ. Все началось с того, что я написал и сделал часы на 2313 (http://www.radiokot.ru/forum/viewtopic. ... &start=340) а потом решил их улучшить - добавить календарь, термометр, индикацию года и пр. Для этого понадобился процик помощнее. Вот так и поимел грабли... :shock:

Вс ноя 30, 2008 07:25:09

Код не влезал? А то вычислительных мощностей вроде больше и некуда на часы-то? =)

Вс ноя 30, 2008 12:59:29

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

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

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

Скорей всего именно это!

Вт дек 02, 2008 01:34:37

to smac. Прописал полностью таблицу прерываний и все заработало!!! Огромное спасибо всем соучасникам. Постараюсь в предь не вести себя по козлиному и тоже делиться тем чего знаю. А то иногда и знаешь как проблема решается, но по клаве стычать облом. Всех поздравляю... :)

Вт дек 02, 2008 08:56:12

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