Перейти к содержанию
    

Добрый день osnwt

 

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

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

 

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

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

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

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

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

 

De}{teR

Изменено пользователем KBB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

 

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

 

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Brown-Out Detector (BOD).

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто подскажет, что это такое. Имеется контроллер двигателя на базе 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к к земле.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто подскажет, что это такое. Имеется контроллер двигателя на базе 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;}

}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

while (1) PORTB ^=0xff;

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

while (1) PORTB ^=0xff;

 

угу.

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

 

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

 

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кто подскажет, что это такое. Имеется контроллер двигателя на базе 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к к земле.

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...