#pic #eeprom
#pic #eeprom
Вопрос:
У меня возникли некоторые трудности с EEprom. Любая помощь будет высоко оценена. Я использую среду ide MPLABX с компилятором XC8 версии v2.10. Я написал простой код, который получает некоторое содержимое текстового сообщения (до 50 символов) через UART и записывает их в EEprom для последующего использования. Я прилагаю приведенный ниже код.
Это мой основной код.
#include <xc.h>
#include <string.h>
#include <pic18f4520.h>
#include <stdio.h>
#include <stdlib.h>
#include "config.h"
#include "uart.h"
#include "EEPROM_RW.h"
#define LED PORTDbits.RD0
#define Buzzer PORTBbits.RB0
#include <xc.h>
void Configuration();
void Timer_IE();
void Timer_ID();
void UART_Flush();
int ADC_Read(int Ch);
unsigned char UART_RX[100]='r';
unsigned char UART_Dummy=0,loop_pointer=0,EE_Pointer=0,EE_Dummy;
int counter=0;
bit LED_Blink=0,Modem_Attached=0,UART_Data_Ready;
void main(void) {
Configuration();
Timer_IE();
LED=0;
Buzzer=0;
UART_Close();
UART_Open(9600);
UART_Flush();
while(1){
if(Modem_Attached==0){
LED_Blink=1;
if(UART_Data_Ready==1){
for(UART_Dummy=0;UART_Dummy<=99;UART_Dummy ){
if(UART_RX[UART_Dummy]=='O'){
if(UART_RX[UART_Dummy 1]=='K'){
Modem_Attached=1;
UART_Data_Ready=0;
UART_Flush();
}
}
if(UART_RX[UART_Dummy]=='A'){
if(UART_RX[UART_Dummy 1]=='T'){
if(UART_RX[UART_Dummy 2]==' '){
loop_pointer=UART_Dummy 3;
EE_Pointer=205;
while(1){
if(UART_RX[loop_pointer]==''){
EEPROM_WriteByte(EE_Pointer,UART_RX[loop_pointer]);
loop_pointer=0;
EE_Pointer=0;
UART_Write("Alarm Text Savedr");
UART_Data_Ready=0;
UART_Flush();
break;
}
else{
EEPROM_WriteByte(EE_Pointer,UART_RX[loop_pointer]);
loop_pointer ;
EE_Pointer ;
}
if(EE_Pointer==255){
UART_Write("Alarm Text is too longr");
EE_Pointer=0;
UART_Data_Ready=0;
UART_Flush();
break;
}
}
}
if(UART_RX[UART_Dummy 2]=='?'){
EE_Pointer=205;
UART_Write("Alarm Text = ");
while(1){
EE_Dummy=EEPROM_ReadByte(EE_Pointer);
if(EE_Dummy!=''){
UART_Write_Byte(EE_Dummy);
EE_Pointer ;
}
else{
EE_Pointer=0;
UART_Data_Ready=0;
UART_Flush();
break;
}
if(EE_Pointer==255){
UART_Data_Ready=0;
UART_Flush();
break;
}
}
UART_Write_Byte('r');
}
}
}
}
}
}
if(Modem_Attached==1){
LED_Blink=0;
LED=0;
}
}
return;
}
void Configuration()
{
//setting the Oscillator Freq. 8MHz
OSCCONbits.IRCF0=1;
OSCCONbits.IRCF1=1;
OSCCONbits.IRCF2=1;
//ADC Module Settings
ADCON0=0x00;
ADCON1=0b00001010;
ADCON2=0b10010000;
//Timer 0 Interrupt Parameters
T0CONbits.T08BIT=1;
T0CONbits.T0CS=0;
T0CONbits.PSA=1;
TRISD=0x00;
TRISBbits.RB0=0;
}
void Timer_IE()
{
INTCONbits.GIE=1;
INTCONbits.TMR0IE=1;
T0CONbits.TMR0ON=1;
}
void Timer_ID()
{
INTCONbits.TMR0IE=0;
T0CONbits.TMR0ON=0;
}
void UART_Flush()
{
unsigned char dummy, i;
dummy=UART_RX[0];
i=0;
while(dummy!=0){
UART_RX[i]=0;
dummy=UART_RX[i 1];
i ;
}
UART_RX[i 1]=0;
i=0;
}
int ADC_Read(int Ch)
{
if(Ch==0)
ADCON0=0x03;
else if(Ch==1)
ADCON0=0x07;
else if(Ch==2)
ADCON0=0x0B;
else if(Ch==3)
ADCON0=0x0F;
else if(Ch==4)
ADCON0=0x13;
else
return 0;
while(GODONE);
ADON=0;
return ADRES;
}
__interrupt (low_priority) void tmr0(void)
{
if(INTCONbits.TMR0IF == 1){
INTCONbits.TMR0IF = 0;
if(Modem_Attached==0){
counter ;
}
else{
counter=0;
}
}
if(counter>=15000){
counter=0;
if(Modem_Attached==0){
UART_Write("ATZr");
}
if(LED_Blink==1){
if(LED==0)
LED=1;
else
LED=0;
}
}
if(UART_RX_Ready()==1){
Timer_ID();
UART_Read_kemal(amp;UART_RX);
UART_Data_Ready=1;
Timer_IE();
}
}
Это EEPROM_RW.h
unsigned char EEPROM_ReadByte(unsigned char eepromAddress)
{
EECON1bits.CFGS=0;
while(EECON1bits.RD || EECON1bits.WR); // check the WRamp;RD bit to see if a RD/WR is in progress
EEADR=eepromAddress; // Write the address to EEADR.
EECON1bits.RD = 1; // Set the RD bit to trigger the eeprom read operation.
return(EEDATA); // Return the data read form eeprom.
}
void EEPROM_WriteByte(unsigned char eepromAddress, unsigned char eepromData)
{
signed char gie_Status;
while(EECON1bits.WR==1); // check the WR bit to see if a previous Write operation is in progress
EEADR=eepromAddress; // Write the address to EEADR.
EEDATA=eepromData; // load the 8-bit data value to be written in the EEDATA register.
EECON1bits.EEPGD = 0; // select "EEPROM"
EECON1bits.CFGS = 0; // not the config-registers
EECON1bits.WREN = 1;
gie_Status = GIE; // Copy the current Interrupt state
GIE = 0; // Disable the interrupts
EECON2=0x55; // Execute the special instruction sequence
EECON2=0xaa; // Refer the datasheet for more info
EECON1bits.WR=1; // Set the WR bit to trigger the eeprom write operation.
while(EECON1bits.WR==1);
PIR2.EEIF = 0;
EECON1bits.WREN = 0;
GIE = gie_Status; // Restore the interrupts
}
это биты конфигурации.
// PIC18F4520 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1H
#pragma config OSC = INTIO67 // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)
// CONFIG2L
#pragma config PWRT = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config BOREN = ON // Brown-out Reset Enable bits (Brown-out Reset enabled and controlled by software (SBOREN is enabled))
#pragma config BORV = 3 // Brown Out Reset Voltage bits (Minimum setting)
// CONFIG2H
#pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
// CONFIG3H
#pragma config CCP2MX = PORTC // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = OFF // MCLR Pin Enable bit (RE3 input pin enabled; MCLR disabled)
// CONFIG4L
#pragma config STVREN = OFF // Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
#pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
Комментарии:
1. Получаете ли вы это сообщение -> «Сохраненный текст сигнала тревоги» с того места, где вы подключили выход UART? У вас есть какая-либо отладочная информация для предоставления? Поскольку встроенные системы не имеют экранов визуальной отладки, трудно найти ошибку в коде.
2. Да, я получаю сохраненный текст сообщения, и после этого, когда я отправляю НА? он возвращает правильное текстовое сообщение. Всякий раз, когда я отключаю и подключаю снова, данные пропадают.
3. Если это так; EEPROM чипа может быть достигнуто общее количество циклов записи, которое обычно составляет примерно 1 миллион раз. Если нет, возможно, у вас есть какая-то процедура, которая очищает некоторые области eeprom при запуске. Вы пробовали свой код в другом том же чипе. Ведет ли он себя так же?