PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کمک فوری برای ارسال و دریافت صدا باavr



nadergh007
08-09-2012, 12:23
سلام به همه عزیزان
برای پروژم مدار فرستنده و گیرنده صوتی با AVR در نظر گرفتم.
کدهای برنامه های ارسال و دریافت و شماتیک مدار رو براتون میذارم. امیدوارم بتونید کمکم کنید.
مشکلم اینه که مدار توی فرکانسهای خیلی پایین خروجی مناسبی داره(کمتز از 100 هرتز)
نمیدونم کجای مدار یا برنامه ایرادی داره. اگه سوالی داشتید یا جاییش مبهم بود بپرسید تا جواب بدم.
عمل کرد کلی مدار هم به این صورته که سیگنال آنالوگ یا همون صوت وارد پبن ورودی میکرویی که با برنامه ارسال پروگرم شده میشه.بعد توسط ADC دیجیتالی مشه و با استفاده از پروتکل UART به پین خروجی ارسال میشه. پین خروجی به پین ورودی میکرویی که با برنامه دریافت صوت پروگرم شده وصل و در نهایت به پورت خوجی فرستاده میشه. خروجی دیجیتال هم با DAC آنالوگ مشه.
(توی شماتیک مدار همه چی مشخصه)
You can see links before reply

برنامه ارسال:

#include <mega32.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <delay.h>

//set baud for 27.7 kbps
#define baudnum 36
#define halfbaudnum 18

//set ADC reference to AREF
#define ADC_VREF_TYPE 0x20

//timeout value for task1 voice sampler
//a value of 1 ensures the task executes at
//every overflow
#define t1 1

//global variables
char bitcnt; // bit counter
char Txbyte; // data to be transmitted
char sb; // number of stop bits (1, 2, ...)
char carry; // carry bit
unsigned char reload; // timer 0 reload
int time1; // timeout counter
unsigned char temp; // temporary data holder

//the task subroutine
void task1(void);

//the data transmit subroutine
void put(void);

//************************************************** ********
//timer 0 overflow ISR
interrupt [TIM0_OVF] void timer0_overflow(void)
{
//reload to force overflow period
TCNT0=reload;

//decrement the time if not zero
if (time1>0) --time1;
}

// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
// Read the 8 most significant bits
// of the AD conversion result and
// transfer to the transmit byte
Txbyte=ADCH;
temp=Txbyte;
put();
}

//************************************************** ********
//Task 1
void task1(void)
{
time1=t1; //reset the task timer
ADCSR.6=1; //initiate ADC conversion
PORTB=temp; //send result to PORTB for debugging
}

//Transmit Byte
void put(void)
{
bitcnt=9+sb; //initiate bit counter

Txbyte=~Txbyte; //invert byte for easier handling

carry=1; //set carry to 1 for start bit

//while loop transmits the data bits using delay
while(bitcnt>0)
{
//transmit opposite of what is in carry
if (carry)
{
PORTD.1=0;
}
else
{
PORTD.1=1;
#asm("nop")
}

delay_us(baudnum); //1 bit delay

carry=(Txbyte&0b00000001); //move LSB to carry1

Txbyte=Txbyte>>1; //shift transmit byte right

bitcnt--; //decrement bitcnt, 1 bit sent
}
}

void main(void)
{
//set up timer 0
reload=256-21; //value for about 1/3 Msec at 16 MHz
TCNT0=reload; //initial reload
TIMSK=1; //turn on timer 0 overflow ISR
TCCR0=4; //prescalar to 256

//init the task timers
time1=t1;

DDRB=0xff; //direction for debugging port
DDRD=0b00000010; //direction for UART pins

sb=1; // set to 1 stop bit

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE;
ADCSR=0x8F;

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

//infinite loop ensures task1 executes at evey overflow
//ISRs do the rest of the work
while (1)
{
//execute task1 when time1 is 0
if (time1==0) task1();
}
}


برنامه دریافت:


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

//set baud to 27.7 kbps
#define baudnum 36
#define halfbaudnum 18

//global variables
char bitcnt; // bit counter
char Rxbyte; // received data
char sb; // number of stop bits (1, 2, ...)
char k; // debugging counter

//the data receive subroutine
void get(void);

//Receive Byte
void get(void)
{
Rxbyte = 0x00; //clear receive byte

bitcnt=9+sb; //initialize bit counter

k=0; //initialize debug counter

//while loop waits for start bit
while(PIND.0 != 0)
{
k=k+1;// hang out
}

//delay to middle of start bit
delay_us(halfbaudnum);

//while loop samples at middle of bits
//stops at bitcnt of 2 to avoid shifting
//in stop bit
while(bitcnt>2)
{
delay_us(baudnum); //1 bit delay

Rxbyte=Rxbyte>>1; //shift receive byte right 1

//sample bit
//move value to MSB of receive byte
if (PIND.0)
{
Rxbyte=Rxbyte | 0b10000000;
}
else
{
Rxbyte=Rxbyte & 0b01111111;
}

bitcnt--; //decrement bitcnt, 1 bit received
}

//blast received byte out PORTB
PORTB = Rxbyte;
}

void main(void)
{
DDRD=0b00000010; //direction for UART pins
DDRB=0xff; //direction for output port

sb=1; // set to 1 stop bit

//infinite loop constantly calls get() to receive bytes
while (1)
{
//receive bytes
get();

//delay 1 bit to get past stop bit
delay_us(baudnum);
}
}