роботы робототехника микроконтроллеры


 Страниц (3): « 1 [2] 3 »   

> Описание: прога для кровати-качалки
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Поставил другой усилитель- та же херь. Подпаял другой микрофон- все пашет! высший восторг
Проблема была в микрофоне. Замешательство
 
 Top
VCOM Супермодератор Post Id



Супермодератор


Сообщений всего: 659
Дата рег-ции: Март 2007  



Зто. ты народу то хоть скажи, с каким работает с каким нет Ж))))
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Микрофон без маркировки, неизвестного производителя. Элекретный двухконтактный. Товарищ выковырял из обломка компьютерного микрофона. Он на работе компьютерным браком занимается. не в себе
Я свой, который неправильный, покупал в магазине на Трамвайном, 12. Продавался под видом микрофона для радиотелефона.
Выглядят одинаково. Замешательство

Кстати, VCOM, спасибо Вам- с мосфетом разобрался, сейчас сижу активатором дрыгаю. Улыбка
 
 Top
VCOM Супермодератор Post Id



Супермодератор


Сообщений всего: 659
Дата рег-ции: Март 2007  



Гы гы гы! О как оно бывает, брак работает лучше чем не брак Помираю со смеху Насчет мосфета, какой марки? Не греетса? Я так понимаю сейчас осталось компаратор с контроллером объединить и активатором и будет автоматическая люлька? Помираю со смеху
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Мосфет я по Вашему, 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), МК каждый раз перезагружается, когда срабатывает активатор. Поэтому активатор и дергает только один раз. Подпайка резистора решила проблему. Улыбка
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



ОЛЕГ
Вы используете ATmega8?
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Да, ее самую. Улыбка
 
 Top
VCOM Супермодератор Post Id



Супермодератор


Сообщений всего: 659
Дата рег-ции: Март 2007  



Ну типа круто! Видео потом выложи Ж))))
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



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);
}
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Белый Волк, спасибо, что уделили время, но, видать, я не джедай. гы-гы! Замешательство
Я четыре часа сидел разбирался и самое большое что у меня получилось- это мигать светодиодиком с помощью Вашего кода.
Помогите мне, пожалуйста, разобраться. Смущение

Куда мне вставить строчку

(!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D

чтобы при условии продолжительности "0", скажем, 200мс, начинала выполняться вот такая последовательность, причем еще я не понял, как ограничить ее по времени (5 минут, скажем):

PORTC |= _BV(PC1); // подаем питание
_delay_ms(200); // ждем
PORTC &= ~_BV(PC1); // выключаем питание
_delay_ms(200); // ждем

Просто понимаете, та программа, которую написал я- она мне интуитивно понятна, поскольку я же ее и придумал. А здесь, вероятно, применяются какие-то прописные истины, которые нужно просто запомнить. Потому я и не въезжаю, как это работает. Замешательство
Спасибо. Улыбка
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Попробуйте такой вариант. Спросите, если что-то не понятно.
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;
}
}
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



Белый Волк, спасибо Вам большое! Улыбка

Вроде разобрался, нашел где и чего менять.
Единственное что Вы забыли- это сконфигурировать порты. А я голову ломал, почему ничего не работает. Замешательство Потом догадался. Ухмылка

Спасибо за помощь! Улыбка
(Добавление)
Белый Волк, а почему не получается использовать как вход PIND1?

У меня запланировано два управляющих сигнала, с PIND2 все в порядке, если его сконфигурировать в Вашей программе как вход, а с PIND1 не получается ничего. Замешательство

Что мне поправить (кроме мозга Ухмылка )?

Спасибо. Улыбка
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Расскажите точнее, какие сигналы поступают в микроконтроллер и что он должен сделать в ответ на них.
 
 Top
ОЛЕГ Супермодератор Post Id



Супермодератор


Сообщений всего: 1732
Дата рег-ции: Нояб. 2008  



PIND2- поступает сигнал с компаратора, в ответ качаем 5 минут и выключаемся, ждем нового сигнала.
PIND1- поступает (поступал бы) сигнал с кнопки с фиксацией (постоянный сигнал), в ответ качаем до тех пор, пока кнопка не будет отжата.

А почему не работает PIND1?

Спасибо, Белый Волк. Улыбка
 
 Top
Белый Волк Супермодератор Post Id



Супермодератор


Сообщений всего: 648
Дата рег-ции: Февр. 2007  



Думаю, Вы неверно ведёте счёт для 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;
}
}

 
 Top
Страниц (3): « 1 [2] 3 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru