Jump to content

    
Sign in to follow this  
osnwt

AT90PWM3

Recommended Posts

Добрый день osnwt

 

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

{ ДА капризулька по земле! надо внимательнее! }

 

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

{ при чем в разных апнотах по разному. }

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

{ с усилителем тоже всё нормально

одно напрягает. нет асинхронного компаратора. }

 

De}{teR

Edited by KBB

Share this post


Link to post
Share on other sites
Сегодня собрал макетную платку с ПВМ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. Про фьюзы абсолютно с вами согласен - прямо противоположное поведение - Ведать ошиблись =)

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

Share this post


Link to post
Share on other sites

BOD собственно, при кривых землях, будет влиять на всё. звон по земле иногда вызывает непредсказуемые вещи.

для борьбы с оными пользую следующее.

земли в оной точке и не под кристалом.

под кристаллом не д.б. проходных шин питания. он д.б. последним, скажем так.

на входе критичных ног Rка в сотню ом. входная емкость около 50 Pf. всяко помеху снизит.

длинные цепи(>100мм) шинкую Rками Ом по 10 или на проволочке бусина ферритовая (из старой ферритовой памяти).

ну и текст примера показал бы весь(т.е. с def и пр), вдруг какой флаг забыл.

Share this post


Link to post
Share on other sites
Какой ревижн чипа?

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

 

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

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

 

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

 

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

 

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

 

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

 

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

 

Ну а по поводу багов - они есть везде - какойто математик доказал что небывает системы без ошибки :)

Share this post


Link to post
Share on other sites

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

 

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

Brown-Out Detector (BOD).

При исползовании BOD , BODLEVEL. Задаем уровни. Если выбираем максимальный, жди сюрприза.

 

2. что с WDT. Есть вариант выбора генератора и BOD , когда незапрещенный WDT через свои 4 ms рубит всё. т.е. первой командой запрети WDT/ :smile3009:

Share this post


Link to post
Share on other sites

Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не B), одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант:

.....

#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к к земле.

Альтернативные функции пинов в программе не используются. Ничего не понимаю. Пробовал на трех кристаллах

в разных платах .

Share this post


Link to post
Share on other sites
Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не B), одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант:

.....

#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;}

}

//очень тупой, но эффективный тест.

Share this post


Link to post
Share on other sites

Ну это можно и так:

 

while (1) PORTB ^=0xff;

 

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

 

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

Share this post


Link to post
Share on other sites
Ну это можно и так:

 

while (1) PORTB ^=0xff;

 

угу.

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

 

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

 

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

подтяжку как раз дает DDRB (направление передачи)

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

 

PORTB же определяет состояние порта на выводе

PINB на вводе.(чтение состояния защелки)

Share this post


Link to post
Share on other sites

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, похоже в моем случае собака где то в другом месте порылась, буду искать. Заранее спасибо всем откликнувшимся.

Share this post


Link to post
Share on other sites
Может кто подскажет, что это такое. Имеется контроллер двигателя на базе AT90PWM3 ( не B), одна из задач - обслуживание кнопок ПУСК и СТОП. Первый вариант:

.....

#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к к земле.

Альтернативные функции пинов в программе не используются. Ничего не понимаю. Пробовал на трех кристаллах

в разных платах .

А что не работает? Как вы определяете по этим двум фрагментам, что что-то не работает?

Share this post


Link to post
Share on other sites

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

Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET.

Заранее спасибо за любые идеи.

Share this post


Link to post
Share on other sites
В программе есть функция опроса этих двух кнопок, так вот, когда эти кнопкм подключены к одной паре пинов МК (первый вариант) все нормально, когда к другой с соответствующими с переопределениями RUN, STOP и изменениями в инициализации пинов портов функция не работает.

Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET.

Заранее спасибо за любые идеи.

Ну так! Прошу код опроса кнопок в студию!

Share this post


Link to post
Share on other sites
В программе есть функция опроса этих двух кнопок, так вот, когда эти кнопкм подключены к одной паре пинов МК (первый выриант) все нормально, когда к другой с соответствующими с переопределениями RUN, STOP и изменениями в инициализации пинов портов функция не работает.

Это выражается в отсутсвии реакции программы на нажатие кнопок, и в "зависании" контроллера. Вывести его из этого состояния удается только принудительным сбросом. Проделал эксперимент. Кнопку пуск отавил на "работающем" пине, кнопку стоп на "неработающем". Жму первый раз ПУСК - двигатель запускается, программа работает. Далее жму стоп - полный "висяк". Выход только RESET.

Заранее спасибо за любые идеи.

 

Попробуйде дизасемблировать оба варианта

Возможно компилятор гджето лагает

Share this post


Link to post
Share on other sites

__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 см. предыдущие посты. Буду рад если ткнешь в ошибку. Есть еще более просой вариант без антидребезга, результат тот же.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this