1

ホーム セキュリティ アラーム システムには、固定エンコーディング (ホップ コーディングなし、暗号化/復号化なし) を備えた PT2440 で武装したリモート コントロールと、MCU: PIC16F684 で武装した中央受信システムがあります。内部 EEPROM (256 バイト) を使用する必要があります。多くのプログラミングとテストの後、私の問題は次のようになりました。メイン ループの前に内部メモリに書き込むことができますが、メインの while ループ内では、書き込み操作が失敗しました。ここに私のメインコードがあります

    //This function Writes data to given address in internal EEPROM of PIC MCU
    void internal_EEPROM_putc(unsigned char addr, unsigned char data)
    {
       unsigned char INTCON_SAVE;
       EEADR = addr;
       EEDATA = data;
       EEPGD = 0;            // 0 = Access data EEPROM memory
       WREN = 1;             // enable writes to internal EEPROM
       INTCON_SAVE = 0x9B;   // Save INTCON register contants
       GIE = 0;              // Disable interrupts, Next two lines SHOULD run without 
                             //  interrupts
       EECON2=0x55;
       EECON2=0xAA;
       WR = 1;    // begin write to internal EEPROM
       INTCON = INTCON_SAVE; //Now we can safely enable interrupts if previously used
       delay_cycles(1); // like NOP

       while(!WR) // Wait till write operation complete
           delay_cycles(1);
       WREN=0; // Disable writes to EEPROM on write complete (EEIF flag on set PIR2 )
    }
    // This function reads data from address given in internal EEPROM of PIC
    unsigned char internal_EEPROM_getc(unsigned char addr)
    {
       EEADR = addr;
       EEPGD= 0; // 0 = Access data EEPROM memory
       RD   = 1; // EEPROM Read
       return EEDATA;       // return data
    }

    void main()
    {
        // IT WORKS!
        internal_EEPROM_putc(0x12,0x34); //Write 0x34 to EEPROM address 0x12
        delay_cycles(1);
        c = internal_EEPROM_getc(0x12); // Read EEPROM address 0x12 in to variable C
        if (c != 0x34) { 
          RC1 = ON; // activate a relay, if read and write mismatches
          delay_ms(500);
          RC1 = OFF;
        } // there is no relay activation

        while (TRUE) {
           // IT DOESN'T WORK!
           internal_EEPROM_putc(0x13,0x56); //Write 0x34 to EEPROM address 0x12
           delay_cycles(1);
           c = internal_EEPROM_getc(0x13); // Read EEPROM address 0x12 in to variable C
           if (c != 0x56) {
             RC1 = ON;
             delay_ms(500);
             RC1 = OFF;
           } // no relay activation
        }
    }

何かご意見は?参考までに、私は C プログラミング言語 (アセンブリではない) を使用し、Windows 7 (32 ビットおよび 64 ビット) で CCS C コンパイラ (PCWHD) (4.057) を使用し、私のプログラマは PICKKit 2 です)。

4

0 に答える 0