Страница 114 из 280

Re: Proteus: вопросы и ответы

Добавлено: Пн мар 12, 2012 18:31:17
otest
GND горчичник на симуляцию не влияет. Причина в том что пример для ARESa - разводка ПП.

Re: Proteus: вопросы и ответы

Добавлено: Пн мар 12, 2012 22:37:20
ooogo
пытаюсь запустить проект отсюда http://steelrats.net/articles.php?article_id=194 генератор не воспроизводит wav файл
Изображение
пробовал запихнуть ему другой wav файл ведет себя аналогично, подскажите в чем может быть дело?
XP SP3, Proteus 7.9 SP1 ENG, если из проекта убрать виртуальный терминал, то генератор начинает нормально воспроизводить wav файл.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 13, 2012 07:27:44
Soir
ooogo писал(а):...если из проекта убрать виртуальный терминал, то генератор начинает нормально воспроизводить wav файл.
Присвойте терминалу Component Reference, например U4.

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 13, 2012 18:23:11
firewall
Добрый день ув. форумчане. В протеус работаю недавно, поэтому строго не судите. Уже недели две пытаюсь схему собрать (http://ra4nal.qrz.ru/battery.shtml), вроде почти собрал (по поводу правильности не знаю, т.к. некоторые элементы заменял) но ошибок куча. Ошики по мк. ATtiny15L, что-то вроде "program stack overflow", "program stack underflow"... Прошивку уже готовую брал, обязана быть правильной. Где я сделал ошибку? Уверен что ошибку сделал я)

п.с уж очень надеюсь на Вашу помощь!

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 13, 2012 22:17:15
ooogo
Soir писал(а):Присвойте терминалу Component Reference, например U4.
Спасибо, помогло, а то час просидел уже головой об стол начал биться! :))

Re: Proteus: вопросы и ответы

Добавлено: Вт мар 13, 2012 22:36:05
Soir
firewall писал(а):Ошики по мк. ATtiny15L, что-то вроде "program stack overflow", "program stack underflow"... Прошивку уже готовую брал, обязана быть правильной. Где я сделал ошибку? Уверен что ошибку сделал я)
Не спешите посыпать себе голову пеплом.
Тут как раз похоже на ошибку в прошивке. Возможно в железе она и проскакивает безнаказанно (это в общем-то предупреждение), а Proteus здесь более строгий. Хотя, конечно, бывает и Proteus ошибается. По крайней мере, Вашей ошибки я здесь не вижу. Для более точного диагноза надо ковыряться в прошивке, только дело это хлопотное...

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 00:00:14
Murka
Soir, да там, кажись, в модели тини_15 глюк по стеку, я не долго долбался купил тини_13 и переделал всё под неё.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 07:31:33
Soir
Murka писал(а):Soir, да там, кажись, в модели тини_15 глюк по стеку, я не долго долбался купил тини_13 и переделал всё под неё.
Вполне может быть.
Я проверил несколько прошивок взятых из сайта автора для этого МК, но для других устройств - та же история. Наобум взятых из Internet - такого нет.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 08:51:19
Engineer_Keen
1) Proteus не сбрасывает указатель стека после ресета;
2) В одном из циклов всегда срабатывает watchdog-ресет, возможно из-за неправильной эмуляции его периода;
3) После 3х сбросов из-за пунктов 1 и 2 стек ломается.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 11:43:00
skeef
Engineer_Keen писал(а):
skeef писал(а):Посмотрел - нет, загрузка 8-16% (при генерации в т.ч.)
Не знаю в чем дело конкретно в этом проекте, только что "собрал" схему из другой книги - генерация прямоугольного импульса также по таймеру - все совпадает (частота полупериоды ...)
Проблема решилась? У вас делитель частоты (фьюз CLKDIV8) включен, поэтому и частоты не те, и загрузка процессора совсем маленькая.
Если вы про CLKDIV8, что в Протеусе (по двойному клику на МК) - то там по умолчанию стоит: (0)Programmed.
В самой программе CLKDIV8 вообще не упоминается. Менял на др значения - ничего не происходит

Кстати, сейчас вот проверил, если у контроллера менять частоту в Advanced Properties - Clock Frequency - то ничего не происходит, контроллер продолжает все относительно первой частоты. Т.е. чтобы изменить частоту контроллера приходится его выкидывать из схемы, вставлять новый и устанавливать уже ему нужную частоту. Тогда все работает верно. Это какая-то особенность Протеуса или нужно где-то что-то нажать?

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 12:08:51
skeef
Вот код, во вложении простая схема и некоторые настройки
(тескт немного посокращал по вертикали)

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

#include <tiny2313.h>

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{ PORTD.5=~PORTD.5;  }

void main(void)
{
#pragma optsize-
CLKPR=0x80;    CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTA=0x00;  DDRA=0x00;
PORTB=0x00; DDRB=0xFF;
PORTD=0x00; DDRD=0x7F;

TCCR0A=0x02; TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00; OCR0B=0x00;

TCCR1A = TCCR1B = TCNT1H = TCNT1L = ICR1H = ICR1L = OCR1AH = OCR1AL = OCR1BH = OCR1BL = 0x00;

GIMSK = MCUCR = 0x00;
TIMSK=0x01;
USICR=0x00;
ACSR=0x80;

#asm("sei")
while (1)   { };
}
Размышления:
Кварц 4MHz. Делю делителем до 3906 kHz (TCCR0A=0x02; TCCR0B=0x05;). Таймер более не считает (OCR0A=0x00; OCR0B=0x00;), т.е. сразу происходит прерывание. Частота на выходе должна составлять 3906, а частотомер показывает ровно вдвое меньше: 3906/2=1953

Почему так?
PS
Учился получать нужную частоту, и все время получаю вдвое меньше :(((

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 12:31:57
Engineer_Keen
skeef писал(а): Почему так?
PS
Учился получать нужную частоту, и все время получаю вдвое меньше :(((
А вы не подумали, что ваша функция

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

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{ PORTD.5=~PORTD.5;  }
идентична T-триггеру, который входные импульсы делит на 2?

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 12:44:22
skeef
Engineer_Keen писал(а): А вы не подумали, что ваша функция

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

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{ PORTD.5=~PORTD.5;  }
идентична T-триггеру, который входные импульсы делит на 2?
Стоп, при чем тут деление и таймер?
В данной функции, насколько я понимаю производится инверсия ПОРТА.
Команда инверсии, опять же ИМНО, выполняется за один такт (ну пусть даже за несколько тактов). Так почему же происходит деление частоты таймера?
Ну или как делать правильно, т.е. чтобы деление не происходило?

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 12:52:19
Engineer_Keen
Таймер ваш "совпадает" с частотой F, с этой-же частотой происходит инверсия пина PD5. Первое совпадение - пин в 1, второе - в 0, третье в 1, четвертое в 0. Вот и получается что на нем частота в 2 раза меньше. И не важно за сколько тактов происходит инверсия (таки да, за 1 - ASM("SBI PIND,PD5")).
Можете убедиться: приведите функцию к виду пин в 1 - ASM("NOP") - пин в 0, и частота будет как рассчитывали, но уже не меандр. Хотите меандр - делайте частоту в 2 раза больше.

На будущее. Не обязательно для такого режима использовать прерывание. Достаточно правильно настроить TCCR0A (старшие 4 бита, см. таблицу в даташите) и контроллер сам будет дергать ногой при совпадении - экономим память и такты (особенно если нужны частоты повыше).

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 13:08:41
skeef
Engineer_Keen писал(а):Таймер ваш "совпадает" с частотой F, с этой-же частотой происходит инверсия пина PD5. Первое совпадение - пин в 1, второе - в 0, третье в 1, четвертое в 0. Вот и получается что на нем частота в 2 раза меньше. И не важно за сколько тактов происходит инверсия (таки да, за 1 - ASM("SBI PIND,PD5")).
Можете убедиться: приведите функцию к виду пин в 1 - ASM("NOP") - пин в 0, и частота будет как рассчитывали, не уже не меандр.
Не привык спорить с ГУРУ но, как там .... истина дороже :)
Тогда как вы объясните такой феномен:

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

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{ 
PORTD.5=!PORTD.5; 
      PCAT = cat[ct];
      PSEG = bufer[ct];
      ct++;
      if(ct>3)  
         ct = 0;
}

...

TCCR0A=0x02;
TCCR0B=0x05;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

...
Я добавил управление динамической индикацией (более ничего не менял) и частота PORTD.5 стала 3906?
ct - глобальная переременная текущий разряд
PCAT и PSEG - порты разрядов и сегментов соответственно
массив cat содержит коды для порта разрядов
bufer - массив содержит коды сегментов для выводимого текущего числа

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 13:14:48
Engineer_Keen
Осциллограф к порту подсоедините и покажите осциллограмму или hex выложите.

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 13:24:05
skeef
Engineer_Keen писал(а):Осциллограф к порту подсоедините и покажите осциллограмму или hex выложите.
Вы абсолютно правы, не меандр. Надо теперь это все переварить ....
Спасибо за помощь :)

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 13:29:20
Engineer_Keen
Вот наглядная иллюстрация того, о чем я говорил.
А вот что там у вас компилятор намутил, и почему он так выводом управляет, это надо разбираться...

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 13:32:47
skeef
Да я уже понял, что на бога надейся, а верблюда привязывай :)
Спасибо :)
А еще такой вопрос по теме: шириной этого короткого импульса можно управлять используя программную задержку внутри прерывания, я правильно думаю?

Re: Proteus: вопросы и ответы

Добавлено: Ср мар 14, 2012 13:41:42
Engineer_Keen
В принципе правильно (хотя в прерывании желательно задержек не делать), но вот я сейчас смотрю дизассемблированный кусок кода и вижу что там какой-то пипец :facepalm:
Ну для начала, компилятор оказывается не знает, что у тини2313 порт можно переключать регистром PIN и вместо одной команды фигачит:

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

SBIS $12,$05
RJMP $+06
CBI $12,5
RJMP $+4
SBI $12,5
Дальше он там что-то читает из флеша и в итоге PD5 все-равно ставится в 1, я так понимаю это из-за того, что вы определили на управление индикатором ноги порта D (PCAT?), но при выводе не разделяете из маской. Наверняка если вы перепишите массив cat чтобы в нем неиспользованные биты были не 1, а 0, то осциллограмма изменится на: _|_|_|_|_|_|_ :))) В общем нужно делать что-то вроде: PCAT = (PORTD & 0x70)|cat[ct], и чтобы в массиве cat были 0 в старших 4 разрядах.