اطلاعیه

Collapse
No announcement yet.

کمک برای حل مشکل RFM12B ...

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

    کمک برای حل مشکل RFM12B ...

    سلام به همه.... یه کمک میخوام در مورد کار با ماجول RFM12B ... حالا مشکل چیه....
    من با استفاده از ماجول های رادیویی ار اف ام 12 بی و دو تا میکروی مگا 16 تصمیم دارم تبادل اطلاعات کنم....
    اول یه سری کد بود برداشتم قسمت های به گمان زادش رو حذف کردم.... حالا یه مشکلی هست این که من از ست فرستنده تعریف کردم آقای میکروکنترلر بنده اگر فلان پایه رو صفر کردم شما فلان کد رو بفرست اگر صفر نکردم اون یکی کد رو بفرست.... حالا سمت گیرنده هم ست کردم که آقای گینده اگر فلان کد اومد این ال ای دی رو روشن کن اگر اون یکی کد اومد اون یکی ال ای دی رو روشن کن....
    همه اینارو گفتیم و مدار رو بستیم و پروگرم کردیم...اما مساله اینجا بود که آقای فرستنده یه چیزایی میفرستاد و آقای گیرنده میگیرفت و در هر حال کی از ال ای دی ها بدون تغییر روشن میموند... اول فکر کردم کلا کار نمیکنه برای همین خواستم تست کنم ببینم قضیه از کجاس کلا توهم هست یا یه چیزی میاد بعد توهم میگیره.... بنابر این فرستنده رو قطع کردم کل مدار رو ریست کردم دیدم گیرنده ال ای دی رو روشن نکرد....به محض اینکه فرستنده رو دوباره روشن کردم گیرنده همون توهم رو زد...حالا کمک میخوام ببینم کجای کار لنگ میزند....
    مرسی
    این هم کد ها

    فرستنده :


    #define F_CPU 12000000L /* evaluation board runs on 4MHz */

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <avr/wdt.h>
    #include <util/delay.h>

    /* RFM12B INTERFACE */
    #define SCK 7 // SPI clock
    #define SDO 5 // SPI Data output (RFM12B side)
    #define SDI 6 // SPI Data input (RFM12B side)
    #define CS 4 // SPI SS (chip select)
    #define NIRQ 2 // (PORTD)
    /* IO CONTROL */
    #define HI(x) PORTB |= (1<<(x))
    #define LO(x) PORTB &= ~(1<<(x))
    #define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
    /* LED */
    #define LED 6
    #define LED_OFF() PORTD &= ~(1<<LED)
    #define LED_ON() PORTD |= (1<<LED)
    void
    delay_ms(uint16_t ms)
    {
    while ( ms )
    {
    _delay_ms(1);
    ms--;
    }
    }
    void portInit() {
    HI(CS);
    HI(SDI);
    LO(SCK);
    DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
    DDRD = (1<<LED);
    }
    unsigned int writeCmd(unsigned int cmd) {
    unsigned char i;
    unsigned int recv;
    recv = 0;
    LO(SCK);
    LO(CS);
    for(i=0; i<16; i++) {
    if(cmd&0x8000) HI(SDI); else LO(SDI);
    HI(SCK);
    recv<<=1;
    if( PINB&(1<<SDO) ) {
    recv|=0x0001;
    }
    LO(SCK);
    cmd<<=1;
    }
    HI(CS);
    return recv;
    }
    void rfInit() {
    writeCmd(0x80E7); //EL,EF,868band,12.0pF
    writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,!ew,DC
    writeCmd(0xA640); //frequency select
    writeCmd(0xC647); //4.8kbps
    writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
    writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
    writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
    writeCmd(0xCED4); //SYNC=2DD4 , AG
    writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
    writeCmd(0x9850); //!mp,90kHz,MAX OUT
    writeCmd(0xCC17); //OB1 , ACOB0, LPX,Iddy,CDDIT,CBW0
    writeCmd(0xE000); //NOT USED
    writeCmd(0xC800); //NOT USED
    writeCmd(0xC040); //1.66MHz,2.2V
    }
    void rfSend(unsigned char data)
    {
    WAIT_NIRQ_LOW();
    writeCmd(0xB800 + data);
    }
    int main() {
    unsigned char KEY;
    volatile unsigned int i,j;
    asm("cli"
    for(i=0;i<1000;i++)for(j=0;j<123;j++);
    portInit();
    rfInit();
    while(1){
    LED_ON();
    writeCmd(0x0000);
    rfSend(0xAA); // PREAMBLE
    rfSend(0xAA);
    rfSend(0xAA);
    rfSend(0x2D); // SYNC
    rfSend(0xD4);
    for(i=0; i<16; i++) {
    rfSend(0x30+i);
    }
    KEY= PINA & (1<<5);
    if (KEY==0x20)
    rfSend(0x01);
    else
    rfSend(0x03);
    delay_ms(2000);

    LED_OFF();
    for(i=0; i<10000; i++) // some not very
    for(j=0; j<123; j++); // sophisticated delay
    }
    }

    این هم کد گیرنده :


    #define F_CPU 8000000L /* evaluation board runs on 4MHz */

    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <avr/wdt.h>
    #include <util/delay.h>
    /* RFM12B INTERFACE */
    #define SCK 7 // SPI clock
    #define SDO 5 // SPI Data output (RFM12B side)
    #define SDI 6 // SPI Data input (RFM12B side)
    #define CS 4 // SPI SS (chip select)
    #define NIRQ 2 // (PORTD)
    /* IO CONTROL */
    #define HI(x) PORTB |= (1<<(x))
    #define LO(x) PORTB &= ~(1<<(x))
    #define WAIT_NIRQ_LOW() while(PIND&(1<<NIRQ))
    /* LED */
    #define LED 6
    #define LED_OFF() PORTD &= ~(1<<LED)
    #define LED_ON() PORTD |= (1<<LED)
    #define BAUDRATE 25 // 19200 at 8MHz
    void
    delay_ms(uint16_t ms)
    {
    while ( ms )
    {
    _delay_ms(1);
    ms--;
    }
    }
    void portInit() {
    HI(CS);
    HI(SDI);
    LO(SCK);
    DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
    DDRD = (1<<LED);
    }
    unsigned int writeCmd(unsigned int cmd) {
    unsigned char i;
    unsigned int recv;
    recv = 0;
    LO(SCK);
    LO(CS);
    for(i=0; i<16; i++) {
    if(cmd&0x8000) HI(SDI); else LO(SDI);
    HI(SCK);
    recv<<=1;
    if( PINB&(1<<SDO) ) {
    recv|=0x0001;
    }
    LO(SCK);
    cmd<<=1;
    }
    HI(CS);
    return recv;
    }

    void rfInit() {
    writeCmd(0x80E7); //EL,EF,868band,12.0pF
    writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
    writeCmd(0xA640); //freq select
    writeCmd(0xC647); //4.8kbps
    writeCmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
    writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
    writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR (FIFO level = 8)
    writeCmd(0xCED4); //SYNC=2DD4;
    writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
    writeCmd(0x9850); //!mp,90kHz,MAX OUT
    writeCmd(0xCC17); //!OB1,!OB0, LPX,!ddy,DDIT,BW0
    writeCmd(0xE000); //NOT USE
    writeCmd(0xC800); //NOT USE
    writeCmd(0xC040); //1.66MHz,2.2V
    }
    unsigned char rfRecv() {
    unsigned int data;
    while(1) {
    data = writeCmd(0x0000);
    if ( (data&0x8000) ) {
    data = writeCmd(0xB000);
    return (data&0x00FF);
    }
    }
    }
    void FIFOReset() {
    writeCmd(0xCA81);
    writeCmd(0xCA83);
    }
    int main(void) {
    unsigned char data, i;
    LED_OFF();
    portInit();
    rfInit();
    FIFOReset();
    while(1) {
    //waitForData();
    for (i=0; i<16; i++) {
    data = rfRecv();
    if (data==0x01)
    PORTD&=~(1<<5);
    else
    PORTD|=(1<<5);
    if (data==0x03)
    PORTD&=~(1<<4);
    else
    PORTD|=(1<<4);

    delay_ms(2000);
    }
    FIFOReset();
    }
    return 0;
    }

    #2
    پاسخ : کمک برای حل مشکل RFM12B ...

    بفرمایین
    تست شدس :mrgreen:
    فایل های پیوست شده
    علم چندانکه بيشتر خواني چون عمل در تو نيست ناداني

    دیدگاه


      #3
      پاسخ : کمک برای حل مشکل RFM12B ...

      سلام دوست عزیز...بابت کمک هاتون واقعا ممنونم ... من کد شما رو روی مدار پرگرام کردم اما فقط روی ال سی دی اسم چند تا بیمارستان میومد و بعد صفحه خالی می موند تا آخر...
      یه توضیح کوچیک راجه به کد و کارکردش اگر میشه بدید...و اینکه اگر ماژولها با هم ارتباط برقرار می کنند از کجا بفهمم؟

      دیدگاه


        #4
        پاسخ : کمک برای حل مشکل RFM12B ...

        خوب این اسم یه بیمارستان رو میفرسته و اون یکی میگیره
        اگه اسم رو گیرندت نشون بده یعنی کار کرده دیگه
        نترس این برنامه مثل توپ کار میکنه
        علم چندانکه بيشتر خواني چون عمل در تو نيست ناداني

        دیدگاه

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