اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه ِDFplayer mini (زبان c )

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در برنامه ِDFplayer mini (زبان c )

    داشتم یه 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 گذاشتم


    برنامه :
    [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]
    جدیدترین ویرایش توسط test001; ۰۰:۴۶ ۱۳۹۸/۰۶/۰۴.

    #2
    پاسخ : مشکل در برنامه ِDFplayer mini (زبان c )

    فهمیدم چطوری درست میشه
    اولا باید قبل از فرمان next یا previous یک stop صادر کنیم و تاخیر هم بدیم وضمنا باید وقفه های سراسری رو بصورت موقت و پرچم وقفه int1 رو پاک کنیم در نتیجه برنامه بصورت زیر درست عمل میکنه :

    [FONT=Yekan]#include <mega32a.h>  [/FONT]
    #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();

    }


    void play_pre(void){
    track_number--;
    if (track_number<1){track_number=11;};
    buffer_data[3] = 0x02;
    send_buffer();

    }


    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")
    stop();
    delay_ms(100);
    play_next();
    blinking_led();
    show_lcd();
    GIFR=(1<<INTF1);
    #asm("sei")
    }

    if (PINC.2==1){
    #asm("cli")
    stop();
    delay_ms(100);
    play_pre();
    blinking_led();
    show_lcd();
    GIFR=(1<<INTF1);
    #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]

    دیدگاه


      #3
      پاسخ : مشکل در برنامه ِDFplayer mini (زبان c )

      دوستان بزرگوار اگر در برنامه اشکالی می بینید لطفا بهم گوشزد کنید چون من در زبان c کاملا مبتدی هستم

      دیدگاه

      لطفا صبر کنید...
      X