roboforum.ru

Технический форум по робототехнике.

направление источника звука

Re: направление источника звука

HarryStar » 13 окт 2011, 00:31

Я вам написал четкий алгоритм. У вас в программе совсем другое, хотя вы утверждаете обратное.

Re: направление источника звука

chinga » 13 окт 2011, 10:22

Код: Выделить всёРазвернуть
    /*****************************************************
    Chip type : ATmega32
    Program type : Application
    AVR Core Clock frequency: 16,000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 512
    *****************************************************/

    #include <mega32.h>
    #include <stdlib.h>
    #include <delay.h>
    #include <stdio.h>
    #include <math.h>
    #include <lcd.h>
    #define F_CPU 16000000;

    #asm
    .equ __lcd_port=0x12; PORTB
    #endasm

    void main(void){

    unsigned char ch1[20];

    int t = 0;
    float beta1;
    float beta;

    PORTA=0xFF;
    DDRA=0x00;

    PORTB=0x00;
    DDRB=0x00;

    PORTC = 0x00;
    DDRC = 0xFF;

    lcd_init(16);

    while (1){

            if(PINA.0 == 0){
                PORTC = 0b00000000;
                PORTC.1 = 1;

            while(PINA.1 != 0){
                t++;
                delay_us(1);
            }           
                   
            beta1 = 0.3*t/970;
            beta = beta1*180.0/3.14;
            sprintf( ch1,"beta= %u", beta );
           
            lcd_gotoxy(0,1);
            lcd_puts(ch1);
            lcd_gotoxy(0,0);
            lcd_puts("in the right");
            delay_ms(2000);
            PORTC = 0b00000000;
            lcd_clear();
        }

        if(PINA.1 == 0){
            PORTC = 0b00000000;
            PORTC.0 = 1;
            while(PINA.0 != 0){
                t++;
                delay_us(10);
            }

            beta1 = 0.3*t/970;
            beta = beta1*180.0/3.14;
            sprintf( ch1,"beta= %u", beta );
           
            lcd_gotoxy(0,1);
            lcd_puts(ch1);
            lcd_gotoxy(0,0);
            lcd_puts("in the left");
            delay_ms(2000);
            PORTC = 0b00000000;
            lcd_clear();
            }

    PORTC = 0b11110000;
    lcd_gotoxy(0,0);
    lcd_puts("out IF");

    }
    }


вот прога. ждем пока на одой ножке не будет 0 - это услышал звук. затем включаем таймер что бы считывал до попадания на следующую ножу.

Re: направление источника звука

Radist » 13 окт 2011, 10:31

Ну насчет таймера вы погорячились - считаете число задержек. Так в теории сделать можно (оправданно, если с таймерами работать не умеете), но на практике не могу гарантировать точность - кто его знает как компилятор наоптимизирует. На асемблере такой метод точно сработает.

Re: направление источника звука

chinga » 13 окт 2011, 10:36

а как с таймером работать в моем случае?)

Re: направление источника звука

boez » 13 окт 2011, 11:28

Michael_K писал(а):Написана, имхо, шляпа. Очевидно, oldport всегда равен нулю?

Правильно, нефиг верить всяким теоретикам, выкладывающим код из головы :)

Имелось в виду это:
Код: Выделить всёРазвернуть
//Ждем двух нулей
while((PINA & 3) != 0x00);
//Ждем не нуля на любой ноге
while((oldport=PINA & 3) == 0x00);

if (oldport != 0x03) { //01 или 10
    //Ждем чего-нибудь другого (по-хорошему, 11 ждем)
    while ((newport=PINA) == oldport) cnt++;

    dir=0;
    if (newport == 0x03) {
        if (oldport == 0x01) dir=1;
        if (oldport == 0x02) dir=2;
    }
}
else {
    count=0; //Точно промеж глаз
    dir=1;   //Условно
}

Re: направление источника звука

Michael_K » 13 окт 2011, 11:47

Да я в общем так и понял :)
Просто неблагодарное дело писать код за топикстартера - его ж потом "удаленно" отлаживать придется :)

Re: направление источника звука

chinga » 13 окт 2011, 12:07

вот я сейчас таймером играюсь. и один вопрос, как включать таймер в определенное место кода, и как остановить?
Код: Выделить всёРазвернуть
/*****************************************************
Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>
#include <delay.h>

// Alphanumeric LCD Module functions
#include <alcd.h>
unsigned int k = 0;

// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
    TCNT1H=0;
    TCNT1L=0;
    k++; 
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xff;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x26;
OCR1AL=0xAB;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

TIMSK=0x10;

UCSRB=0x00;

ACSR=0x80;
SFIOR=0x00;

ADCSRA=0x00;

SPCR=0x00;

TWCR=0x00;

lcd_init(16);

// Global enable interrupts
#asm("sei")

while (1){

    if(k == 1500){
        PORTC.0 = 1;
    }
    if(k == 2500){
        PORTC.0= 0; 
        k = 0;
    }

  lcd_gotoxy(0,0); 
  lcd_putchar(k/10+0x30);
  lcd_putchar(k%10+0x30);
     
}
}

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

Re: направление источника звука

Radist » 13 окт 2011, 12:24

Чтобы включить таймер - надо в его регистр записать некое число, чтобы выключить - надо записать в этот же регистр другое число. Какие это будут числа - зависит от задачи. Как узнать, что это за числа - читать раздел даташита про таймер.

Re: направление источника звука

chinga » 13 окт 2011, 12:43

а вот есть такая простая задача, включить таймер и что бы до k=40000 дошел, и выключить просто. а в таймере k++ скажем.

Re: направление источника звука

Strijar » 13 окт 2011, 13:25

Народ, у кого с обработкой сигнала нормально? Теоретический вопрос. Если сделать как я ранее предлагал - оцифровывать сразу оба канала и делать свертку между ними. Чувствую, что можно будет отслеживать много источников звучащих одновременно. Или я ошибаюсь?

Re: направление источника звука

chinga » 13 окт 2011, 13:33

Strijar писал(а):Народ, у кого с обработкой сигнала нормально? Теоретический вопрос. Если сделать как я ранее предлагал - оцифровывать сразу оба канала и делать свертку между ними. Чувствую, что можно будет отслеживать много источников звучащих одновременно. Или я ошибаюсь?

вопрос такой возник, вот в этом строчке
Код: Выделить всёРазвернуть
adc1 = read_adc(0); 
adc2 = read_adc(1);


он сначала берет данные с ножки А0, потом с ножки А1? а в это время когда он будет брать данные с А0, А1 не исчезнет? или он сохранит до следующего вызова? прост звук слишком быстро двигается, и хватит ли мига что бы взять точные данные с обоих ножек?

и я не понимаю что тут непонятного. можете сказать что тут не правильно? только не надо ругаться)
Код: Выделить всёРазвернуть
#asm("sei")
while (1){

    if(PINA.0 == 0){                 //если с права пришел сигнал первым
        PORTC.1 = 1;                 //горит светодиод ( что бы проверять)
        time = 0;                    // таймер = 0
        lcd_clear();                 //очищаем ЛСД
       
        while(PINA.1 != 0){}           //ждем когда на левый микрофон придт звук и в это время запускается таймер с 0
        sprintf( ch1,"time=%u", time );  //записываем результат в массив
        lcd_gotoxy(0,1);
        lcd_puts(ch1);                   //выводим массив
        lcd_gotoxy(0,0);
        lcd_puts("in the right");       //выводим с какой стороны звук
        delay_ms(2000);                 //ждем 2с
        PORTC = 0b00000000;             //отключаем все светодиоды
        lcd_clear();                    //очищаем ЛСД
    } else
       
    if(PINA.1 == 0){                   //если с лева пришел сигнал первым
        PORTC.0 = 1;                   //зажигаем светодиод
        time = 0;                       //таймер = 0
        lcd_clear();                    //очищаем
       
        while(PINA.0 != 0){}              // ждем пока на правый не поступи сигнал в это время таймер идет
                                         
        sprintf( ch1,"time=%u", time );   //зписываем текущий результат таймера
        lcd_gotoxy(0,1);                   
        lcd_puts(ch1);                     //выводим данные
        lcd_gotoxy(0,0);
        lcd_puts("in the left");           //выводим информацию с какой стороны звук
        delay_ms(2000);                    //ждем 2с
        PORTC = 0b00000000;                //отключаем светодиоды
        lcd_clear();                       //очищаем ЛСД
    }           
         
    PORTC = 0b11110000;                    //зажигаем светодиод
    lcd_gotoxy(3,0);                       
    lcd_puts("waiting...");                //выводим состояние ожидания
     
}

Re: направление источника звука

HarryStar » 13 окт 2011, 15:06

У вас в корне неправильно написана программа. Вам уже писали неоднократно алгоритм и даже куски кода.
Нежелание подумать и анализировать отбивает желание помогать.

Re: направление источника звука

Radist » 13 окт 2011, 15:14

chinga писал(а): можете сказать что тут не правильно? только не надо ругаться)


Могу. Есть переменная "время", что-то вы с ней непонятное делаете (в Сях не силен). Никакого измерения времени не происходит. Я знаю куда вам надо - на сайт
www.proavr.narod.ru

Re: направление источника звука

chinga » 13 окт 2011, 15:15

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

Добавлено спустя 1 минуту 10 секунд:
Есть переменная "время", что-то вы с ней непонятное делаете (в Сях не силен). Никакого измерения времени не происходит

я прост думал что каждый микросекунд будет делать к++, и выйдет время.
а проавр я уже читал


Rambler\'s Top100 Mail.ru counter