داشتم یه mp3 player با DFplayer mini و یه ATmega32a و یه lcd 16*2 کاراکتری درست میکردم . همه چی خوب پیش رفت تا اینکه به مدار کلید های next track و previous track رو اضافه کردم و اینکار هم با موفقیت انجام شد اما زمانی که خواستم از پایه busy ماژول استفاده کنم و اونو به وقفه خارجی 1 دادم مشکلاتی شروع شد
مشکل اینجاست که در حالی که مدار داره فایل های صوتی mp3 شماره 1 تا 11 رو که روی میکرو اس دی ریخته شده رو به ترتیب اجرا میکنه (با استفاده از پایه busy و int1 میکرو ) اگر از کلیدهای next یا previous استفاده کنم عدد track که روی lcd نمایش داده میشه به سرعت کم یا زیاد میشه و اینکار مرتب ادامه پیدا میکنه (اگر از کلیدهای دیگر مدار استفاده کنم مشکلی پیش نمیاد یعنی صدا کم و زیاد میشه و اکولایزر هم تغییر میکنه)
به نظر میاد که مدار مرتب اینتراپت میخوره ... این در حالیه که وقتی وقفه سراسری رو غیر فعال میکنم مدار کاملا درست کار میکنه و کلید های next و previous کاملا درست کار میکنن
و همونطور که در برنامه هم می بینید سعی کردم با غیر فعال کردن موقت وقفه سراسری و پرچم وقفه 1 جلو این موضوع رو بگیرم که نشد .
پایه های مدار :
portc.0 = LED
portc.1 = next track
portc.2 = previous track
portc.3 = change_equalizer
portc.6 = increase_volume
portc.7 = decrease_volume
portd.0 = txd
portd.1 = rxd
portd.3 = busy
lcd کاراکتری به پورت b وصل شده
و اینتراپت 1 در لبه بالارونده تنظیم شده و بین پایه int1 و busy یک مقاومت 10k گذاشتم
برنامه :
مشکل اینجاست که در حالی که مدار داره فایل های صوتی mp3 شماره 1 تا 11 رو که روی میکرو اس دی ریخته شده رو به ترتیب اجرا میکنه (با استفاده از پایه busy و int1 میکرو ) اگر از کلیدهای next یا previous استفاده کنم عدد track که روی lcd نمایش داده میشه به سرعت کم یا زیاد میشه و اینکار مرتب ادامه پیدا میکنه (اگر از کلیدهای دیگر مدار استفاده کنم مشکلی پیش نمیاد یعنی صدا کم و زیاد میشه و اکولایزر هم تغییر میکنه)
به نظر میاد که مدار مرتب اینتراپت میخوره ... این در حالیه که وقتی وقفه سراسری رو غیر فعال میکنم مدار کاملا درست کار میکنه و کلید های next و previous کاملا درست کار میکنن
و همونطور که در برنامه هم می بینید سعی کردم با غیر فعال کردن موقت وقفه سراسری و پرچم وقفه 1 جلو این موضوع رو بگیرم که نشد .
پایه های مدار :
portc.0 = LED
portc.1 = next track
portc.2 = previous track
portc.3 = change_equalizer
portc.6 = increase_volume
portc.7 = decrease_volume
portd.0 = txd
portd.1 = rxd
portd.3 = busy
lcd کاراکتری به پورت b وصل شده
و اینتراپت 1 در لبه بالارونده تنظیم شده و بین پایه int1 و busy یک مقاومت 10k گذاشتم
برنامه :
[FONT=Yekan]/*[/FONT]Project :
#include <mega32a.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
int default_buffer[8] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Default Buffer
int buffer_data[8] = {0x7E , 0xFF , 0x06 , 0x00 , 0x00 , 0x00 , 0x00 , 0xEF}; // Sending Buffer
int vol=30;
int eq=0;
int track_number=1;
void send_buffer(void) {
int i;
for( i=0; i< 8; i++){
putchar(buffer_data[i]);
buffer_data[i] = default_buffer[i];
}
}
void play(void){
buffer_data[3] = 0x0D;
send_buffer();
}
void stop(void){
buffer_data[3] = 0x16;
send_buffer();
}
void pause(void){
buffer_data[3] = 0x0E;
send_buffer();
}
void play_next(void){
track_number++;
if (track_number>11){track_number=1;};
buffer_data[3] = 0x01;
send_buffer();
delay_ms(10);
//GIFR=(1<<INTF1);
}
void play_pre(void){
track_number--;
if (track_number<1){track_number=11;};
buffer_data[3] = 0x02;
send_buffer();
delay_ms(10);
//GIFR=(1<<INTF1);
}
void set_volume( int volume ) {
buffer_data[3] = 0x06;
buffer_data[6] = volume;
send_buffer();
}
void increase_volume(void) {
vol++;
if (vol>30){vol=30;}
buffer_data[3] = 0x06;
buffer_data[6] = vol;
send_buffer();
}
void decrease_volume(void) {
vol--;
if (vol<0){vol=0;}
buffer_data[3] = 0x06;
buffer_data[6] = vol;
send_buffer();
}
void play_track(int track_id) {
buffer_data[3] = 0x03;
if(track_id < 256) {
buffer_data[6] = track_id;
} else {
buffer_data[5] = track_id / 256;
buffer_data[6] = track_id - 256 * buffer_data[6];
}
send_buffer();
}
void change_eq(void){
eq++;
if (eq>5){eq=0;}
buffer_data[3] = 0x07;
buffer_data[6] = eq;
send_buffer();
}
void blinking_led(void){
PORTC = (1<<PORTC.0);
delay_ms(100);
PORTC = (0<<PORTC.0);
delay_ms(100);
}
void show_lcd(void){
char buffer[16];
lcd_gotoxy(7,0);
lcd_puts(" ");
sprintf(buffer,"Track %d",track_number);
lcd_gotoxy(0,0);
lcd_puts(buffer);
sprintf(buffer,"Eq %d",eq);
lcd_gotoxy(12,0);
lcd_puts(buffer);
lcd_gotoxy(8,1);
lcd_puts(" ");
sprintf(buffer,"Volume %d",vol);
lcd_gotoxy(0,1);
lcd_puts(buffer);
delay_ms(5);
}
interrupt [EXT_INT1] void ext_int1_isr(void)
{
track_number++;
if (track_number>11){track_number=1;}
play_track(track_number);
delay_ms(100);
play();
show_lcd();
}
void main(void)
{
delay_ms(1500);
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=(1<<INT1) | (0<<INT0) | (0<<INT2);
MCUCR=(1<<ISC11) | (1<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);
GIFR=(1<<INTF1) | (0<<INTF0) | (0<<INTF2);
#asm("sei")
DDRD = (1<<DDD1);
PORTD = (1<<PORTD.0)|(1<<PORTD.1);
DDRC = (1<<DDC0)|(0<<DDC1)|(0<<DDC2)|(0<<DDC3)|(0<<DDC6)|(0<<DDC7);
PORTC = 0b11001110;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
//////////////////////////// play track 1
delay_ms(100);
buffer_data[3] = 0x06;
buffer_data[6] = vol;
send_buffer();
play_track(track_number);
delay_ms(100);
play();
lcd_init(16);
lcd_clear();
show_lcd();
while (1)
{
if (PINC.1==1){
//#asm("cli")
play_next();
blinking_led();
show_lcd();
//#asm("sei")
}
if (PINC.2==1){
//#asm("cli")
play_pre();
blinking_led();
show_lcd();
//#asm("sei")
}
if (PINC.3==1){
change_eq();
blinking_led();
show_lcd();
}
if (PINC.6==1){
increase_volume();
blinking_led();
show_lcd();
}
if (PINC.7==1){
decrease_volume();
blinking_led();
show_lcd();
}
}
}
[FONT=Yekan] [/FONT]
دیدگاه