Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT90PWM3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3
Сергей Борщ
Цитата(osnwt @ Mar 21 2007, 12:42) *
Setting the BOD fuses to have 4.3v BOD level (and 5v power supply), I have the following problem: setting via ADMUX Aref=AVcc leads to device reset. AREF pin is decoupled with external capacitor only.
А на питании какая блокировочная емкость, как далеко она от ног питания и насколько длинные дорожки от выходного электролита блока питания до блокировочного конденсатора по питанию? Я к тому, что не может ток зарядки емкости на ARef просаживать питание и вызывать честное срабатывание BOD?
osnwt
Цитата(Сергей Борщ @ Mar 21 2007, 14:47) *
А на питании какая блокировочная емкость, как далеко она от ног питания и насколько длинные дорожки от выходного электролита блока питания до блокировочного конденсатора по питанию? Я к тому, что не может ток зарядки емкости на ARef просаживать питание и вызывать честное срабатывание BOD?

За основу макета была взята типовая схема ATAVRMC100, так что емкость на AREF та же - 100nF. По питанию стоит как керамика, так и электролиты. Всё достаточно близко от ног. Какая же это должна быть емкость, чтобы ТАК просадить питание smile.gif

На самом деле мне просто лень искать конкретную схему и вообще обсуждать это дело. Будет намного проще, если кто-то попрбует повторить названное и скажет - есть эффект или нет. Мне это интересно исключительно с точки зрения общего развития, но кому-то, может, поможет.
DeXteR
Цитата(osnwt @ Mar 21 2007, 17:52) *
На самом деле мне просто лень искать конкретную схему и вообще обсуждать это дело. Будет намного проще, если кто-то попрбует повторить названное и скажет - есть эффект или нет. Мне это интересно исключительно с точки зрения общего развития, но кому-то, может, поможет.


Я попробую Но к сожалению нескоро
Контроллеры везут Схема и плата макетницы разводится

Как заработает макет - напишу
KBB
зажила PWMка . целый день потраттил.
с кривым программатором.
вообщем дальше лело времени.
работать с ней можно, соблюдая меры предосторожности.
будет правильны программатор, посмотрю чтос фузами PSC
пока же думаю применять меры предосторожности на стороне силы. автономно.
DeXteR
Цитата(KBB @ Mar 29 2007, 19:28) *
зажила PWMка . целый день потраттил.
с кривым программатором.
вообщем дальше лело времени.
работать с ней можно, соблюдая меры предосторожности.
будет правильны программатор, посмотрю чтос фузами PSC
пока же думаю применять меры предосторожности на стороне силы. автономно.


Поздравляю
А я только сегодня макетную плату заказал - небыло времени
И счет за кристалы толька вчера оплатили
Но думаю к следующиму понедельнику присоединюсь к экспериментам =)
KBB
Цитата(DeXteR @ Mar 29 2007, 23:51) *
Поздравляю
А я только сегодня макетную плату заказал - небыло времени

для старта, как выяснилось, кит можно было не покупать.
сгодился , конечно.
понять логику чужого текста всегда сложно.
bezobraznik натолкнул на мысль, спасибо ему, дальше само покатилось.
тараканчик, действительно , в чем-то удобен для источников. к нему надо привыкнуть. хотя, чуем моя печень - это ещё не последние грабли. как в прочем и со всем атмелом. бытовуха, что тут сказать ещё?
KBB
из базового супостатского примера соорудил-таки рулилку.
есть вопрос . как максимально быстро опрокинуть PSC . т.е. выходы в 0, счетчики стоп и при этом считать состояние последних. дабы знать до куда досчитал шим. хочется попробовать от комаратора рабртать "напрямую". соорудить некий аналог шим контроллера (3845напрмер).
зачем пока не решил, но уже хочу.
SasaVitebsk
Цитата(osnwt @ Mar 21 2007, 13:42) *
1) How to identify the device revision (A or cool.gif?
My device is marked as:

90PWM3-16SQ
0540 04103AW


Согласно ответам из одной из веток точки опоры у вас ревизия "А". Согласно описанию такое определение действует на все кристаллы.
bvn123
Цитата(KBB @ Mar 29 2007, 19:28) *
зажила PWMка . целый день потраттил.
с кривым программатором.
вообщем дальше лело времени.
работать с ней можно, соблюдая меры предосторожности.
будет правильны программатор, посмотрю чтос фузами PSC
пока же думаю применять меры предосторожности на стороне силы. автономно.


Не мудрено, что программатор может быть кривым - в pdf на AT90PWM3 в главе Serial Downloading несоответствие размера загружаемой страницы размеру памяти (можно сравнить с такими же по размеру памяти МК, например, ATmega8535), программатор работает, если в обслуживающем его приложении установить соотв. памяти размер страницы (не такой, как в pdf)
KBB
Цитата(SasaVitebsk @ Apr 2 2007, 04:09) *
Согласно ответам из одной из веток точки опоры у вас ревизия "А". Согласно описанию такое определение действует на все кристаллы.

мои железки в корпусах 24 и 32 ноги, а подписаны одинаково.
надо фирмачей спросить

тут мен сказали, что ATAVRISP2 программирует всё правильно, но только из AVRstudio4.258 , а я его не ползую. Ну не люблю. грустно.
DeXteR
Цитата(KBB @ Apr 2 2007, 21:16) *
тут мен сказали, что ATAVRISP2 программирует всё правильно, но только из AVRstudio4.258 , а я его не ползую. Ну не люблю. грустно.


Что Только этот програматор способен правильно шить АТ90ПВМ3 ??
AVR910 неможет ???
KBB
Цитата(DeXteR @ Apr 3 2007, 17:17) *
Что Только этот програматор способен правильно шить АТ90ПВМ3 ??
AVR910 неможет ???

ХБЗ. cranky.gif
мене сказали, имеется ввиду фицияльный ответ. w00t.gif
DeXteR
Notes for AT90PWM2/3
The Analog Comparators, Power Stage Controllers and the DAC are not simulated.

When writing to UCSRC, the value will be copied to UBRRH unless bit 7 is set. This behaviour should not happen on devices that have separate locations for these registers. A workaround is to write UBRRH after UCSRC.

The ADC noise reduction function is not supported. Setting the ADIF flag will not wake the CPU from sleep mode.


Сегодня нашел это в хелпе по АВРстудио
Кашмар
Как же его симулировать то .....
Помоиму в Атмеле тоже нефсе знают как работает PWM3 =)
KBB
[quote name='DeXteR' date='Apr 4 2007, 23:45' post='232702']

Кашмар
Как же его симулировать то .....
а чего его симулировать?
я обыкновенно по кусочкам в железе... maniac.gif
muravei
А в Алгоритм Билдере он есть.smile.gif
DeXteR
Цитата(muravei @ Apr 5 2007, 10:33) *
А в Алгоритм Билдере он есть.smile.gif

И переферия симулируется ?
PSC ?
DAC ?
muravei
Цитата(DeXteR @ Apr 5 2007, 13:47) *
И переферия симулируется ?
PSC ?
DAC ?

Думаю, Вам лучше скачать Билдер и самому поиграться.Я не вникал в тему.
Про PSC что-то есть.
KBB
Цитата(muravei @ Apr 5 2007, 22:47) *
Думаю, Вам лучше скачать Билдер и самому поиграться.Я не вникал в тему.
Про PSC что-то есть.

так, что-то не догнал. о каком таком билдере речь идёт?
muravei
Цитата(KBB @ Apr 5 2007, 20:37) *
так, что-то не догнал. о каком таком билдере речь идёт?

Об этом
KBB
Цитата(muravei @ Apr 6 2007, 01:05) *

посмотрел на билдер.
не впечатлил. на ассемблере уже лет 15 не пишу, а к "C" это отношения вроде не имеет.
да и на "C" текст , как-то естественнее выглядит. по человечачьи.
muravei
Цитата(KBB @ Apr 5 2007, 21:24) *
а к "C" это отношения вроде не имеет.

И Слава Богу! Это ассемблер.
KBB
Цитата(muravei @ Apr 6 2007, 01:40) *
И Слава Богу! Это ассемблер.

ага, ассемблер, этакий язык домохозяек. ninja.gif
Хороший человек прислал мне новую версию программки для старого, доброго AVRISP santa2.gif
AVR-ISP II. (не путать с терминатором-2). та вот , применительно к PWMке. на вскидку , видит все биты и пр. т.д. медленный малость cranky.gif . ну текст пишется ещё дольше, даже на "C". maniac.gif
вообщем , почти Ура!. laugh.gif
VladimirYU
Шить PWM3 спокойно можно AVReal..ом, это не проблема. Предлагаю обсудить грабли и непонятки. Например, сделал проект на PWM3 (кручу вентильный двигатель), все вроде нормально, но AMP1 синхронизировать от PSC не получается, приходится выворачиваться через (_|_).
KBB
Цитата(VladimirYU @ Apr 6 2007, 17:05) *
Шить PWM3 спокойно можно AVReal..ом, это не проблема.
у меня было тлько : ponic, атмеловский кит, не помню какой, аргусовтовскийи упомянутый Isp.
теперь он вроде залюбил pwmку. при том, что агусофтовский не различал релитз мелкосхемы, а это видит как надо, то вдвойне приятно.

Предлагаю обсудить грабли и непонятки. Например, сделал проект на PWM3 (кручу вентильный двигатель), все вроде нормально, но AMP1 синхронизировать от PSC не получается, приходится выворачиваться через (_|_).

ну, как бы сложно это обсудить не видя схемы, текста и пр. зачастую объясняя ( точнее сказать, вдалбливая) непонятливому оппненту что к чкму, как в том анектодте, наконец сам поймешь .
т.е. без контекста - безпредметно. btzobraznik в меня контекстом бросил, что и сподвинуло на быстрый подъем. ещё пару - тройку дней выделю и ага.. cheers.gif
DeXteR
Добрый день osnwt

Сегодня собрал макетную платку с ПВМ3
Решил проверить то о чем вы пишите

1. Легко запускается АЦП при любых значениях БОД (проверял до 4,5) вольта
Питание платы 5.05 В питании ацп резстор 23 ома и емкость 0,15 - думаю что причиной вашего сброса была неудачная разводка платы или прерывание АЦП не имеющее обработчика

Может я чегото непонимаю
Инициализирую АЦП так
ADMUX = _0b01100000;
ADCSRA = _0b11000111;

2. Про фьюзы абсолютно с вами согласен - прямо противоположное поведение - Ведать ошиблись =)

С усилителем попробую позже

De}{teR
KBB
Цитата(DeXteR @ Apr 16 2007, 22:07) *
Добрый день osnwt

думаю что причиной вашего сброса была неудачная разводка платы или прерывание АЦП не имеющее обработчика
{ ДА капризулька по земле! надо внимательнее! }

2. Про фьюзы абсолютно с вами согласен - прямо противоположное поведение - Ведать ошиблись =)
{ при чем в разных апнотах по разному. }
С усилителем попробую позже
{ с усилителем тоже всё нормально
одно напрягает. нет асинхронного компаратора. }

De}{teR
osnwt
Цитата(DeXteR @ Apr 16 2007, 17:07) *
Сегодня собрал макетную платку с ПВМ3

Какой ревижн чипа?

Цитата
1. Легко запускается АЦП при любых значениях БОД (проверял до 4,5) вольта
Питание платы 5.05 В питании ацп резстор 23 ома и емкость 0,15 - думаю что причиной вашего сброса была неудачная разводка платы или прерывание АЦП не имеющее обработчика

Насчет неудачной разводки ничего не скажу, поскольку разводил не я, а сам не сильно силен в таких вопросах. Однако, не очень представляю, как влияет наличие установленного BOD на прерывание АЦП. А серьезно если, то прерывания в тестовом примере я вообще не разрешал, что вполне логично для выяснения причин проблемы.

Как я инициализировал - уже смотреть не хочется, давно то было, и я не использую битовые константы, я обычно пишу нечто вроде вот такого:

Цитата
ADMUX &= ~ADMUX_MASK;
ADMUX |= ADC_VOLTAGE_CHANNEL;
ADCSRA = (1<<ADEN)|(1<<ADSC)|ADC_PRESCALER;


Цитата
2. Про фьюзы абсолютно с вами согласен - прямо противоположное поведение - Ведать ошиблись =)

Но при этом так и не признали наличия бага. Отсюда могу предположить, что и наличие других проблем точно также будет прикрыто, если таковые реально имелись.
KBB
BOD собственно, при кривых землях, будет влиять на всё. звон по земле иногда вызывает непредсказуемые вещи.
для борьбы с оными пользую следующее.
земли в оной точке и не под кристалом.
под кристаллом не д.б. проходных шин питания. он д.б. последним, скажем так.
на входе критичных ног Rка в сотню ом. входная емкость около 50 Pf. всяко помеху снизит.
длинные цепи(>100мм) шинкую Rками Ом по 10 или на проволочке бусина ферритовая (из старой ферритовой памяти).
ну и текст примера показал бы весь(т.е. с def и пр), вдруг какой флаг забыл.
DeXteR
Цитата(osnwt @ Apr 16 2007, 23:55) *
Какой ревижн чипа?
Насчет неудачной разводки ничего не скажу, поскольку разводил не я, а сам не сильно силен в таких вопросах. . А серьезно если, то прерывания в тестовом примере я вообще не разрешал, что вполне логично для выяснения причин проблемы.

Как я инициализировал - уже смотреть не хочется, давно то было, и я не использую битовые константы, я обычно пишу нечто вроде вот такого:
Но при этом так и не признали наличия бага. Отсюда могу предположить, что и наличие других проблем точно также будет прикрыто, если таковые реально имелись.


Кристал без буквы Б (как и написано)

Однако, не очень представляю, как влияет наличие установленного BOD на прерывание АЦП

Я имел ввиду вот что

При разрешенных прирываниях возможно при инициализации АЦП происходим переход по вектору не имеющему обработчика и процнссор перезапускался (хотя без БОД все было хорошо - значит такой вариант отпадает)

А по поводу техподдержки - АВРки очень популярны и если бы атмел держал поддержку каждого пользователя ПВМ3 стоил бы не 4 доллара а 400

Ну а по поводу багов - они есть везде - какойто математик доказал что небывает системы без ошибки smile.gif
KBB
[quote name='DeXteR' date='Apr 17 2007, 21:25' post='238200']
Кристал без буквы Б (как и написано)

При разрешенных прирываниях возможно при инициализации АЦП происходим переход по вектору не имеющему обработчика и процнссор перезапускался (хотя без БОД все было хорошо - значит такой вариант отпадает)
Brown-Out Detector (BOD).
При исползовании BOD , BODLEVEL. Задаем уровни. Если выбираем максимальный, жди сюрприза.

2. что с WDT. Есть вариант выбора генератора и BOD , когда незапрещенный WDT через свои 4 ms рубит всё. т.е. первой командой запрети WDT/ smile3009.gif
VladimirYU
Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не cool.gif, одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант:
.....
#define RUN PINB_Bit2
#define STOP PIND_Bit6

Далее в инициализации

DDRB_Bit2 = 0; // вход
PORTB_Bit2= 0; // HI-Z

DDRD_Bit6 = 0; // вход
PORTD_Bit6= 0; // HI-Z

Все работает

Второй вариант:

#define RUN PINB_Bit3
#define STOP PINB_Bit4

Далее в инициализации

DDRB_Bit3 = 0; // вход
PORTB_Bit3= 0; // HI-Z

DDRB_Bit4 = 0; // вход
PORTB_Bit4= 0; // HI-Z

Ни хрена не работает.
Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле.
Альтернативные функции пинов в программе не используются. Ничего не понимаю. Пробовал на трех кристаллах
в разных платах .
KBB
Цитата(VladimirYU @ Apr 18 2007, 18:37) *
Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не cool.gif, одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант:
.....
#define RUN PINB_Bit2
#define STOP PIND_Bit6

Далее в инициализации

DDRB_Bit2 = 0; // вход
PORTB_Bit2= 0; // HI-Z

DDRD_Bit6 = 0; // вход
PORTD_Bit6= 0; // HI-Z

Все работает

Второй вариант:

#define RUN PINB_Bit3
#define STOP PINB_Bit4

Далее в инициализации

DDRB_Bit3 = 0; // вход
PORTB_Bit3= 0; // HI-Z

DDRB_Bit4 = 0; // вход
PORTB_Bit4= 0; // HI-Z

Ни хрена не работает.
Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле.
Альтернативные функции пинов в программе не используются. Ничего не понимаю. Пробовал на трех кристаллах
в разных платах .


а что в самом-то тексте.?
так тоже не работает:?
char i=0;
PORTB=0x00;
DDRB=0x00;

while(1){
if(i){PORTB=0x00; i=0;}
if(!i){PORTB=0xff; i=1;}
}
//очень тупой, но эффективный тест.
VladimirYU
Ну это можно и так:

while (1) PORTB ^=0xff;

Только поясни пожалуйста, что даст постоянное переключение порта с входа на выход и обратно?

Сорри, не свхода на выход, а включение и отключение внутренней подтяжки на 5в?
KBB
Цитата(VladimirYU @ Apr 18 2007, 19:59) *
Ну это можно и так:

while (1) PORTB ^=0xff;

угу.
сравни ассемблерные листинги.

Только поясни пожалуйста, что даст постоянное переключение порта с входа на выход и обратно?

Сорри, не свхода на выход, а включение и отключение внутренней подтяжки на 5в?

подтяжку как раз дает DDRB (направление передачи)
кстати, можно и так портом рулить. только держать в регистре единичку.

PORTB же определяет состояние порта на выводе
PINB на вводе.(чтение состояния защелки)
VladimirYU
11.2.1 Configuring the Pin
Each port pin consists of three register bits: DDxn, PORTxn, and PINxn. As shown in “Register Description for I/O-Ports” on page 77, the DDxn bits are accessed at the DDRx I/O address, the PORTxn bits at the PORTx I/O address, and the PINxn bits at the PINx I/O address.The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one, Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is configured as an input pin.If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pinThe port pins are tri-stated when reset condition becomes active, even if no clocks are running
If PORTxn is written logic one when the pin is configured as an output pin, the port pin is driven high (one). If PORTxn is written logic zero when the pin is configured as an output pin, the port pin is driven low (zero).

Это из DS на PWM3, похоже в моем случае собака где то в другом месте порылась, буду искать. Заранее спасибо всем откликнувшимся.
=GM=
Цитата(VladimirYU @ Apr 18 2007, 09:37) *
Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не cool.gif, одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант:
.....
#define RUN PINB_Bit2
#define STOP PIND_Bit6

Далее в инициализации

DDRB_Bit2 = 0; // вход
PORTB_Bit2= 0; // HI-Z

DDRD_Bit6 = 0; // вход
PORTD_Bit6= 0; // HI-Z

Все работает

Второй вариант:

#define RUN PINB_Bit3
#define STOP PINB_Bit4

Далее в инициализации

DDRB_Bit3 = 0; // вход
PORTB_Bit3= 0; // HI-Z

DDRB_Bit4 = 0; // вход
PORTB_Bit4= 0; // HI-Z

Ни хрена не работает.
Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле.
Альтернативные функции пинов в программе не используются. Ничего не понимаю. Пробовал на трех кристаллах
в разных платах .

А что не работает? Как вы определяете по этим двум фрагментам, что что-то не работает?
VladimirYU
В программе есть функция опроса этих двух кнопок, так вот, когда эти кнопкм подключены к одной паре пинов МК (первый выриант) все нормально, когда к другой с соответствующими с переопределениями RUN, STOP и изменениями в инициализации пинов портов функция не работает.
Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET.
Заранее спасибо за любые идеи.
=GM=
Цитата(VladimirYU @ Apr 19 2007, 03:38) *
В программе есть функция опроса этих двух кнопок, так вот, когда эти кнопкм подключены к одной паре пинов МК (первый вариант) все нормально, когда к другой с соответствующими с переопределениями RUN, STOP и изменениями в инициализации пинов портов функция не работает.
Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET.
Заранее спасибо за любые идеи.

Ну так! Прошу код опроса кнопок в студию!
DeXteR
Цитата(VladimirYU @ Apr 19 2007, 07:38) *
В программе есть функция опроса этих двух кнопок, так вот, когда эти кнопкм подключены к одной паре пинов МК (первый выриант) все нормально, когда к другой с соответствующими с переопределениями RUN, STOP и изменениями в инициализации пинов портов функция не работает.
Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET.
Заранее спасибо за любые идеи.


Попробуйде дизасемблировать оба варианта
Возможно компилятор гджето лагает
VladimirYU
__C_task int main()
{
InitWDT(); // инициализация Watchdog
__enable_interrupt(); // глобальное разрешение прерываний

/* Фоновый цикл:
1. Читаем направление с джампера J1
2. устанавливаем здание на скорость ( считываем с потенциометра)
3. Проверяем состояние кнопок J2 - пуск, J3 - стоп
*/

static bool stopBuffer = false; // буферы для опроса кнопок
static bool runBuffer = false;

static char pollCounter = POLL_QUANTITY; // счетчик опосов

while (1)
{
_WDR();
// 1.
motor.SetDirection ( motor.ReadDirection () ); // установили напраление

// 2.
motor.SetupSpeed ( adc.GetPotentiometr() ); // устанавливаем задание на скорость

/* 3. Проверяем состояние кнопок ПУСК, СТОП.
Если двигатель включен:
нажата ПУСК - ничего не делаем, нажата СТОП - переменную состояния в OFF.
Если двигатель выключен:
нажата ПУСК и не нажата СТОП - переменную состояния в ON, нажата СТОП - ничего неделаем.
Опрос проводим POLL_QUANTITY раз если результат совпадает фиксируем состояние кнопок */

// Проверяем состояние кнопок
if ( (runBuffer == RUN) && (stopBuffer == STOP) ) pollCounter--;
else { runBuffer = RUN; stopBuffer = STOP; pollCounter = POLL_QUANTITY; } // перезапускаем опрос

// Смотрим закончен ли опрос
if ( pollCounter == 0)
{
pollCounter = POLL_QUANTITY; // переустанавливаем счетчик
switch ( motor.GetState() ) // смотрим состояние двигателя
{
case ON:
{
if ( !stopBuffer ) motor.TurnOFF(); // выключаем
}
break;

case OFF:
{
if ( (!runBuffer) && stopBuffer ) motor.TurnOn(); // включаем двигатель
}
break;

default: break;
}
}
}
return 0;
}

// как определяются и инициализируются RUN и STOP см. предыдущие посты. Буду рад если ткнешь в ошибку. Есть еще более просой вариант без антидребезга, результат тот же.
KBB
мда.
при беглом просмотре не видно ..
но..
мысль про компилятор (какой к стасти?) верная м.б.
исходя из косяков IAR я бы отказался от вской возможной оптимизации
битовых констант и увеличил стэк.
это первое.
связанное с этим же:
осмелюсь предложить способ отладки.(или поиска льва в пустыне)
опять же из опыта IAR.
я бы закомментировал функции управления мотором(напрочь) и повесил светодиоды на ноги. объясняю зачем. параметры лучше передавать в явном виде и кратно двум байтам. лучше всего вообще 2 байта. повторюсь - это применительно к IAR. там же , если оптимизировать собираюсь, то писать надо как на паскале. просто до безобразия, с явной инициализацией. иначе терятся много чего.
=GM=
Цитата(VladimirYU @ Apr 19 2007, 08:47) *
__C_task int main()
{

static bool stopBuffer = false; // буферы для опроса кнопок
static bool runBuffer = false;

static char pollCounter = POLL_QUANTITY; // счетчик опосов

while (1)
{
_WDR();


// Проверяем состояние кнопок
if ( (runBuffer == RUN) && (stopBuffer == STOP) ) pollCounter--;
else { runBuffer = RUN; stopBuffer = STOP; pollCounter = POLL_QUANTITY; } // перезапускаем опрос
}
}

// как определяются и инициализируются RUN и STOP см. предыдущие посты. Буду рад если ткнешь в ошибку. Есть еще более простой вариант без антидребезга, результат тот же.

Ну а что ж вы хотите, RUN и STOP вы определяете, как ножки, а сравниваете с булевскими переменными. Вот и получается, что в первом варианте у вас кнопки срабатывают каким-то образом, а во втором - нет. Другими словами, лучше в логическом выражении использовать логические переменные. Как можно сравнивать runBuffer (это некое число) с булевой переменной RUN (это ДА или НЕТ)?
VladimirYU
Спасибо за предложения обязательно попробую, но. Я полагал, что макросы определяющие имена PINB_Bit2 и тому подобное позволяют использовать их как булевы переменные, если я не прав, поясните доходчиво, чтобы в голове ясность наступила. Глаз на самом деле замылился, да и мозги уже клинит. Я в IAR подобные конструкции использовал не один десяток раз никогда не было проблем, может быть я удачно ходил по минному полю? Хотелось бы понять.
VladimirYU
Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая
работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и MODBUS сверху пристроил, а на фигне застрял. Заранее спасибо откликнувшимся.



__C_task int main()
{
InitWDT(); // инициализация Watchdog
__enable_interrupt(); // глобальное разрешение прерываний

/* Фоновый цикл:
1. Читаем направление с джампера J1
2. устанавливаем здание на скорость ( считываем с потенциометра)
3. Проверяем состояние кнопок J2 - пуск, J3 - стоп
*/

static char keyBuffer ; // буферы для опроса кнопок
static char keyState ; // текущее состояние кнопок

static char pollCounter = POLL_QUANTITY; // счетчик опосов

while (1)
{
_WDR();
// 1.
motor.SetDirection ( motor.ReadDirection () ); // установили направление

// 2.
// motor.SetupSpeed ( adc.GetPotentiometr() ); // устанавливаем задание на скорость

/* 3. Проверяем состояние кнопок ПУСК, СТОП.
Если двигатель включен:
нажата ПУСК - ничего не делаем, нажата любая СТОП - переменную состояния в OFF, двигатель выключаем.
Если двигатель выключен:
нажата ПУСК и не нажата ни одна СТОП - переменную состояния в ON, нажата СТОП - ничего неделаем.
Опрос проводим POLL_QUANTITY раз если результат не изменяется фиксируем состояние кнопок */

// Читаем состояние кнопок и пакуем их в keyState в формате MSB <- 0 0 0 0 STOP_FAIL STOP RUN_FAIL RUN <-LSB
// два младших бита ПУСКовые, 2 и 3 биты СТОПовые

keyState = PINB & 0x1c; // выделяем кнопки на порте B PINB_Bit4 , PINB_Bit3, PINB_Bit2
keyState >>=2; // сдвигаем
keyState |=( ( PIND & 0x40)>>3); // кнопкой с порта D (PIND_Bit6)

// Проверяем состояние кнопок
if ( keyState == keyBuffer ) pollCounter--;
else { keyBuffer = keyState; pollCounter = POLL_QUANTITY; } // перезапускаем опрос

// Смотрим закончен ли опрос
if ( pollCounter == 0)
{
pollCounter = POLL_QUANTITY; // переустанавливаем счетчик
switch ( motor.GetState() ) // смотрим состояние двигателя
{
case ON:
{ // проверяем нажата ли хоть одна кнопка СТОП
if ( (keyBuffer&0x0c) != 0x0c ) motor.TurnOFF(); // выключаем
}
break;

case OFF:
{
// проверяем условие пуска ( не нажата ни одна СТОП)&(нажата любая ПУСК)
motor.SetupSpeed(0);
if ( ( (keyBuffer&0x0c) == 0x0c ) && ( (keyBuffer&0x03) != 0x03) ) motor.TurnOn(); // включаем двигатель
}
break;

default: break;
}
}
}
return 0;
}
KBB
ну что сказать?
давай проект (если под IAR)бум смотреть.
=GM=
Цитата(VladimirYU @ Apr 20 2007, 07:54) *
Сделал теперь вот так, ввел опрос вех четырех кнопок. Стоп по любой из стоповых кнопок, запуск по любой из пусковых при усовии что не нажата ни одна из стоповых. Результат тот же, та группа, которая
работала так и работает. Из неработающей группы на ПУСК ни какой реакции, на СТОП "висяк". Вроде ушел от булевых переменных, а эффект ноль. Можно на это дело положить прибор, но хочется разобраться, уж больно контроллер удобный дляприводческих приложений. Я уже к нему и MODBUS сверху пристроил, а на фигне застрял. Заранее спасибо откликнувшимся.

// Читаем состояние кнопок и пакуем их в keyState в формате MSB <- 0 0 0 0 STOP_FAIL STOP RUN_FAIL RUN <-LSB
// два младших бита ПУСКовые, 2 и 3 биты СТОПовые

keyState = PINB & 0x1c; // выделяем кнопки на порте B PINB_Bit4 , PINB_Bit3, PINB_Bit2
keyState >>=2; // сдвигаем
keyState |=( ( PIND & 0x40)>>3); // кнопкой с порта D (PIND_Bit6)

// Проверяем состояние кнопок
if ( keyState == keyBuffer ) pollCounter--;
else { keyBuffer = keyState; pollCounter = POLL_QUANTITY; } // перезапускаем опрос

// Смотрим закончен ли опрос
if ( pollCounter == 0)
{
pollCounter = POLL_QUANTITY; // переустанавливаем счетчик
switch ( motor.GetState() ) // смотрим состояние двигателя
{
case ON:
{ // проверяем нажата ли хоть одна кнопка СТОП
if ( (keyBuffer&0x0c) != 0x0c ) motor.TurnOFF(); // выключаем
}
break;

case OFF:
{
// проверяем условие пуска ( не нажата ни одна СТОП)&(нажата любая ПУСК)
motor.SetupSpeed(0);
if ( ( (keyBuffer&0x0c) == 0x0c ) && ( (keyBuffer&0x03) != 0x03) ) motor.TurnOn(); // включаем двигатель
}
break;

default: break;
}
}
}
return 0;
}

Ну с точки зрения грамматики си и логики вроде всё нормально стало. Единственно, вы keyBuffer не определяете при первом сравнении, но вроде не должно влиять.

Ещё обратил внимание, судя по программе, что нажатая кнопка у вас даёт логический 0, а ненажатая даёт 1. Но ранее вы писали (см.пост #81), что
Цитата(VladimirYU @ Apr 18 2007, 09:37) *
Функция опроса одна и та же, все четыре пина одинаково подтянуты через 10к к +5в и через 1к к земле.
То есть в ненажатом состоянии на ножке будет 0.45В, что явно не будет логической единицей, которая должна быть 0.6*Vcc=3В минимум. А в нажатом состоянии будет 0В. Возможно здесь кроется причина ваших бед. Померяйте напряжения при нажатой и отпущенной кнопке, если не будет соответствующих логических уровней, то оторвите резистор 1к от земли и опять померяйте.
VladimirYU
Цитата(KBB @ Apr 20 2007, 14:22) *
ну что сказать?
давай проект (если под IAR)бум смотреть.


На выходных прицеплю ПВМ3 к JTAG MKII, по твоему совету выкину все из проекта кроме кнопок,
посмотрю что будет. Результаты сообщу.
DeXteR
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

Прошу откликнуться тех кто работал с ПВМ3 (без буквы Б)

Возможно ли запустить PSC с симетричным ШИМ так чтоб один канал был в противофазе к другому ??

Как это сделать ?? (если не сложно кусочек кода)
bezobraznic
Цитата(DeXteR @ May 17 2007, 18:45) *
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

Прошу откликнуться тех кто работал с ПВМ3 (без буквы Б)

Возможно ли запустить PSC с симетричным ШИМ так чтоб один канал был в противофазе к другому ??

Как это сделать ?? (если не сложно кусочек кода)



Если без буквы Б то надо ставить внешний инвертор!! Это глюк АТМЕЛ!!
VladimirYU
Цитата(DeXteR @ May 17 2007, 19:45) *
УВАЖАЕМЫЕ СПЕЦИАЛИСТЫ

Прошу откликнуться тех кто работал с ПВМ3 (без буквы Б)

Возможно ли запустить PSC с симетричным ШИМ так чтоб один канал был в противофазе к другому ??

Как это сделать ?? (если не сложно кусочек кода)


Код не поможет, если без B, то либо внешний инвертор, а еще лучше драйвер для управления верхним и нижним транзистором IR2110, например. Кстати в СПб ЭФО B уже продает
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.