Проблема была в микрофоне.
16. ОЛЕГ - 11 Марта, 2009 - 20:09:02 - перейти к сообщению
Поставил другой усилитель- та же херь. Подпаял другой микрофон- все пашет! 
Проблема была в микрофоне.
Проблема была в микрофоне.
17. VCOM - 11 Марта, 2009 - 20:50:14 - перейти к сообщению
Зто. ты народу то хоть скажи, с каким работает с каким нет Ж))))
18. ОЛЕГ - 11 Марта, 2009 - 21:21:14 - перейти к сообщению
Микрофон без маркировки, неизвестного производителя. Элекретный двухконтактный. Товарищ выковырял из обломка компьютерного микрофона. Он на работе компьютерным браком занимается.
Я свой, который неправильный, покупал в магазине на Трамвайном, 12. Продавался под видом микрофона для радиотелефона.
Выглядят одинаково.
Кстати, VCOM, спасибо Вам- с мосфетом разобрался, сейчас сижу активатором дрыгаю.
Я свой, который неправильный, покупал в магазине на Трамвайном, 12. Продавался под видом микрофона для радиотелефона.
Выглядят одинаково.
Кстати, VCOM, спасибо Вам- с мосфетом разобрался, сейчас сижу активатором дрыгаю.
19. VCOM - 12 Марта, 2009 - 08:52:27 - перейти к сообщению
Гы гы гы! О как оно бывает, брак работает лучше чем не брак
Насчет мосфета, какой марки? Не греетса? Я так понимаю сейчас осталось компаратор с контроллером объединить и активатором и будет автоматическая люлька?
20. ОЛЕГ - 12 Марта, 2009 - 11:08:31 - перейти к сообщению
Мосфет я по Вашему, VCOM, совету взял IRLR024N. Висит на проводочках, чуть тепленький.
Я все уже объединил.
Сегодня плату на лазернике печатать поеду. Так что, думаю, к выходным робозыбка будет готова.
Нарисовалась следующая проблема- забыл на ночь отключить питание. Приблуда всю ночь вслушивалась в тишину. А сейчас в микрофон гаркнул- активатор только один раз сработал, а по программе должен был 10.
Перепрошил- все снова работает как положено. Думаю, что глюк в программе:
while (t < 10)
{ // Бесконечный цикл
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
t ++; // если 0, тогда значение t увеличиваем на 1
else
t = 0; // в противном случае t будет обнулен, сколько бы он ни был
_delay_ms(20); // ждем
}
Такой мегаконструкцией
я измеряю длительность импульса.
Подарите мне, пожалуйста, кусочек кода, чтобы это таймером, по-джедайски, делать?
(Добавление)
Отбой, разобрался.
Ввиду того, что у меня все пока сделано на соплях, я не сделал подтягивающий резистор к RESET. Если отключить программатор (откуда идет "+" на RESET), МК каждый раз перезагружается, когда срабатывает активатор. Поэтому активатор и дергает только один раз. Подпайка резистора решила проблему.
Я все уже объединил.
Нарисовалась следующая проблема- забыл на ночь отключить питание. Приблуда всю ночь вслушивалась в тишину. А сейчас в микрофон гаркнул- активатор только один раз сработал, а по программе должен был 10.
while (t < 10)
{ // Бесконечный цикл
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
t ++; // если 0, тогда значение t увеличиваем на 1
else
t = 0; // в противном случае t будет обнулен, сколько бы он ни был
_delay_ms(20); // ждем
}
Такой мегаконструкцией
Подарите мне, пожалуйста, кусочек кода, чтобы это таймером, по-джедайски, делать?
(Добавление)
Отбой, разобрался.
Ввиду того, что у меня все пока сделано на соплях, я не сделал подтягивающий резистор к RESET. Если отключить программатор (откуда идет "+" на RESET), МК каждый раз перезагружается, когда срабатывает активатор. Поэтому активатор и дергает только один раз. Подпайка резистора решила проблему.
21. Белый Волк - 12 Марта, 2009 - 13:18:12 - перейти к сообщению
ОЛЕГ
Вы используете ATmega8?
Вы используете ATmega8?
22. ОЛЕГ - 12 Марта, 2009 - 13:46:30 - перейти к сообщению
Да, ее самую.
23. VCOM - 12 Марта, 2009 - 14:31:03 - перейти к сообщению
Ну типа круто! Видео потом выложи Ж))))
24. Белый Волк - 12 Марта, 2009 - 15:44:15 - перейти к сообщению
CODE:
#include <avr/io.h>
#define OSC 8000000 //тактовая частота
//процедура задержки на указанное в мс время
void timer_delay(unsigned int time)
{
TCNT1 = 65535-(time*OSC/1024000);
TCCR1B = 5;
while(!(TIFR & 4));
TCCR1B = 0;
TIFR = (1 << TOV1);
}
//инициализация таймера
void timer_delay_init()
{
TIMSK |= (1 << TOIE1);
}
int main(void)
{
timer_delay_init();
timer_delay(1000);
}
#include <avr/io.h>
#define OSC 8000000 //тактовая частота
//процедура задержки на указанное в мс время
void timer_delay(unsigned int time)
{
TCNT1 = 65535-(time*OSC/1024000);
TCCR1B = 5;
while(!(TIFR & 4));
TCCR1B = 0;
TIFR = (1 << TOV1);
}
//инициализация таймера
void timer_delay_init()
{
TIMSK |= (1 << TOIE1);
}
int main(void)
{
timer_delay_init();
timer_delay(1000);
}
25. ОЛЕГ - 13 Марта, 2009 - 02:18:02 - перейти к сообщению
Белый Волк, спасибо, что уделили время, но, видать, я не джедай.
Я четыре часа сидел разбирался и самое большое что у меня получилось- это мигать светодиодиком с помощью Вашего кода.
Помогите мне, пожалуйста, разобраться.
Куда мне вставить строчку
(!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
чтобы при условии продолжительности "0", скажем, 200мс, начинала выполняться вот такая последовательность, причем еще я не понял, как ограничить ее по времени (5 минут, скажем):
PORTC |= _BV(PC1); // подаем питание
_delay_ms(200); // ждем
PORTC &= ~_BV(PC1); // выключаем питание
_delay_ms(200); // ждем
Просто понимаете, та программа, которую написал я- она мне интуитивно понятна, поскольку я же ее и придумал. А здесь, вероятно, применяются какие-то прописные истины, которые нужно просто запомнить. Потому я и не въезжаю, как это работает.
Спасибо.
Я четыре часа сидел разбирался и самое большое что у меня получилось- это мигать светодиодиком с помощью Вашего кода.
Помогите мне, пожалуйста, разобраться.
Куда мне вставить строчку
(!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
чтобы при условии продолжительности "0", скажем, 200мс, начинала выполняться вот такая последовательность, причем еще я не понял, как ограничить ее по времени (5 минут, скажем):
PORTC |= _BV(PC1); // подаем питание
_delay_ms(200); // ждем
PORTC &= ~_BV(PC1); // выключаем питание
_delay_ms(200); // ждем
Просто понимаете, та программа, которую написал я- она мне интуитивно понятна, поскольку я же ее и придумал. А здесь, вероятно, применяются какие-то прописные истины, которые нужно просто запомнить. Потому я и не въезжаю, как это работает.
Спасибо.
26. Белый Волк - 13 Марта, 2009 - 06:59:11 - перейти к сообщению
Попробуйте такой вариант. Спросите, если что-то не понятно.
CODE:
#include <avr/io.h>
#define OSC 8000000 //тактовая частота
//процедура задержки на указанное в мс время
void timer_delay(unsigned int time)
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(time*OSC/1024000);
while(!(TIFR & 4));
}
//Засечение секунды
void timer_delay_for_sec()
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(OSC/1024);
}
//инициализация таймера
void timer_delay_init()
{
TIMSK |= (1 << TOIE1);
TCCR1B = 5;
}
int main(void)
{
timer_delay_init();
unsigned char count = 0;
while(1)
{
while((!(PIND & 2)) && (count <= 10))
{
count++;
timer_delay(10);
}
if (count == 10)
{
int real_time = 300; //засечём 300 секунд реального времени
while(real_time > 0)//пока real_time больше 0
{
if (TIFR & 4) timer_delay_for_sec(), real_time--;
PORTC |= _BV(PC1); // подаем питание
if (TIFR & 4) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем
if (TIFR & 4) timer_delay_for_sec(), real_time--;
PORTC &= ~_BV(PC1); // выключаем питание
if (TIFR & 4) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем
}
}
count = 0;
}
}
#include <avr/io.h>
#define OSC 8000000 //тактовая частота
//процедура задержки на указанное в мс время
void timer_delay(unsigned int time)
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(time*OSC/1024000);
while(!(TIFR & 4));
}
//Засечение секунды
void timer_delay_for_sec()
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(OSC/1024);
}
//инициализация таймера
void timer_delay_init()
{
TIMSK |= (1 << TOIE1);
TCCR1B = 5;
}
int main(void)
{
timer_delay_init();
unsigned char count = 0;
while(1)
{
while((!(PIND & 2)) && (count <= 10))
{
count++;
timer_delay(10);
}
if (count == 10)
{
int real_time = 300; //засечём 300 секунд реального времени
while(real_time > 0)//пока real_time больше 0
{
if (TIFR & 4) timer_delay_for_sec(), real_time--;
PORTC |= _BV(PC1); // подаем питание
if (TIFR & 4) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем
if (TIFR & 4) timer_delay_for_sec(), real_time--;
PORTC &= ~_BV(PC1); // выключаем питание
if (TIFR & 4) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем
}
}
count = 0;
}
}
27. ОЛЕГ - 14 Марта, 2009 - 05:12:54 - перейти к сообщению
Белый Волк, спасибо Вам большое!
Вроде разобрался, нашел где и чего менять.
Единственное что Вы забыли- это сконфигурировать порты. А я голову ломал, почему ничего не работает.
Потом догадался.
Спасибо за помощь!
(Добавление)
Белый Волк, а почему не получается использовать как вход PIND1?
У меня запланировано два управляющих сигнала, с PIND2 все в порядке, если его сконфигурировать в Вашей программе как вход, а с PIND1 не получается ничего.
Что мне поправить (кроме мозга
)?
Спасибо.
Вроде разобрался, нашел где и чего менять.
Единственное что Вы забыли- это сконфигурировать порты. А я голову ломал, почему ничего не работает.
Спасибо за помощь!
(Добавление)
Белый Волк, а почему не получается использовать как вход PIND1?
У меня запланировано два управляющих сигнала, с PIND2 все в порядке, если его сконфигурировать в Вашей программе как вход, а с PIND1 не получается ничего.
Что мне поправить (кроме мозга
Спасибо.
28. Белый Волк - 14 Марта, 2009 - 20:32:48 - перейти к сообщению
Расскажите точнее, какие сигналы поступают в микроконтроллер и что он должен сделать в ответ на них.
29. ОЛЕГ - 14 Марта, 2009 - 21:00:38 - перейти к сообщению
PIND2- поступает сигнал с компаратора, в ответ качаем 5 минут и выключаемся, ждем нового сигнала.
PIND1- поступает (поступал бы) сигнал с кнопки с фиксацией (постоянный сигнал), в ответ качаем до тех пор, пока кнопка не будет отжата.
А почему не работает PIND1?
Спасибо, Белый Волк.
PIND1- поступает (поступал бы) сигнал с кнопки с фиксацией (постоянный сигнал), в ответ качаем до тех пор, пока кнопка не будет отжата.
А почему не работает PIND1?
Спасибо, Белый Волк.
30. Белый Волк - 15 Марта, 2009 - 05:29:44 - перейти к сообщению
Думаю, Вы неверно ведёте счёт для PIND. Биты в порту нумеруются с 0, то есть PIND0-PIND7. Попробуйте этот код.
CODE:
#include <avr/io.h>
#define OSC 8000000 //тактовая частота
//процедура задержки на указанное в мс время
void timer_delay(unsigned int time)
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(time*OSC/1024000);
while(!(TIFR & TOV1));
}
//Засечение секунды
void timer_delay_for_sec()
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(OSC/1024);
}
//инициализация таймера
void timer_delay_init()
{
TIMSK |= (1 << TOIE1);
TCCR1B = (1 << CS10) | (1 << CS12);
}
void port_init()
{
DDRD = 0;
DDRC |= (PC1 << 1);
}
int main(void)
{
timer_delay_init();
port_init();
unsigned char count = 0;
while(1)
{
while(!(PIND & (PIND1 << 1)))
{
PORTC |= _BV(PC1); // подаем питание
timer_delay(200); // ждем 200 мс
PORTC &= ~_BV(PC1); // выключаем питание
timer_delay(200); // ждем 200 мс
}
while((!(PIND & (PIND2 << 1))) && (count <= 10))
{
count++;
timer_delay(10);
}
if (count == 10)
{
int real_time = 300; //засечём 300 секунд реального времени
while(real_time > 0)//пока real_time больше 0
{
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
PORTC |= _BV(PC1); // подаем питание
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
PORTC &= ~_BV(PC1); // выключаем питание
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем 200 мс
}
}
count = 0;
}
}
#include <avr/io.h>
#define OSC 8000000 //тактовая частота
//процедура задержки на указанное в мс время
void timer_delay(unsigned int time)
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(time*OSC/1024000);
while(!(TIFR & TOV1));
}
//Засечение секунды
void timer_delay_for_sec()
{
TIFR = (1 << TOV1);
TCNT1 = 65535-(OSC/1024);
}
//инициализация таймера
void timer_delay_init()
{
TIMSK |= (1 << TOIE1);
TCCR1B = (1 << CS10) | (1 << CS12);
}
void port_init()
{
DDRD = 0;
DDRC |= (PC1 << 1);
}
int main(void)
{
timer_delay_init();
port_init();
unsigned char count = 0;
while(1)
{
while(!(PIND & (PIND1 << 1)))
{
PORTC |= _BV(PC1); // подаем питание
timer_delay(200); // ждем 200 мс
PORTC &= ~_BV(PC1); // выключаем питание
timer_delay(200); // ждем 200 мс
}
while((!(PIND & (PIND2 << 1))) && (count <= 10))
{
count++;
timer_delay(10);
}
if (count == 10)
{
int real_time = 300; //засечём 300 секунд реального времени
while(real_time > 0)//пока real_time больше 0
{
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
PORTC |= _BV(PC1); // подаем питание
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
PORTC &= ~_BV(PC1); // выключаем питание
if (TIFR & TOV1) timer_delay_for_sec(), real_time--;
timer_delay(200); // ждем 200 мс
}
}
count = 0;
}
}