Технический форум по робототехнике.
/*****************************************************
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");
}
}
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; //Условно
}
/*****************************************************
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);
}
}
Strijar писал(а):Народ, у кого с обработкой сигнала нормально? Теоретический вопрос. Если сделать как я ранее предлагал - оцифровывать сразу оба канала и делать свертку между ними. Чувствую, что можно будет отслеживать много источников звучащих одновременно. Или я ошибаюсь?
adc1 = read_adc(0);
adc2 = read_adc(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..."); //выводим состояние ожидания
}
chinga писал(а): можете сказать что тут не правильно? только не надо ругаться)
Есть переменная "время", что-то вы с ней непонятное делаете (в Сях не силен). Никакого измерения времени не происходит