2016. február 22., hétfő

EEPROM #2


Mint korábban már beharangoztam most egy EEPROM használattal kapcsolatos cikk következik.
Ezen eszközök működését a korábbi cikkemben már leírtam, így erre most nem térnék ki.

A legtöbb PIC mikrovezérlő rendelkezik saját, belső EEPROM memóriával melyet akár már a programozás során is módosíthatunk, így elérve, hogy első indításnál is rendelkezzen már bizonyos belső adatokkal.

A MikroC programban elég szépen le van írva példával szemléltetve, hogy ezt hogyan is kell pontosan használni, ezért ez egy rövidebb cikk lesz. A következő ilyen témájú rész, amely az alkatrészek miatt valószínűleg csúszik 1 hetet, (vagy többet) a külső I2C EEPROMok programozására fog kiéleződni.

Az oldalon már említettem egy Proteus 7 vagy 8 nevű programot mellyel nagyon szépen lehet leszimulálni egy ilyen program futását a kijelölt cél IC-n. A mai részben a 18F2550-es IC-t veszem alapul, amely 256 byte EEPROM memóriával rendelkezik.

A MikroC 6.0.0 verzióját és a Proteus 7 professionalt fogom használni a program elkészítéséhez és szimulálásához.

unsigned short bejovo;
void main() {
  UART1_init(9600);
  TRISB=0xff;      //B lábak bemenetek
  Delay_ms(1000);
  UART1_Write_Text("EEPROM v1.0");
  UART1_Write(13);
  UART1_Write(13);
  UART1_Write(13);
  while(1) {
    if(PORTB.F0==1){
      while(PORTB.F0==1){}
      while(1){
        if(UART1_Data_Ready()){
          bejovo=UART1_Read();
          EEPROM_Write(0x32, bejovo);
          UART1_Write_Text("EEPROM Irasa v1.0");
          UART1_Write(13);
          UART1_Write_Text("Modositva: 0x32");
          UART1_Write(13);
          UART1_Write(bejovo);
          UART1_Write(13);
          UART1_Write_Text("===================");
          UART1_Write(13);
          UART1_Write(13);
          break;
        }
      }
    }
    bejovo = 0x00;
    if(PORTB.F1==1){
      while(PORTB.F1==1){}
      bejovo=EEPROM_Read(0x32);
      UART1_Write_Text("EEPROM Olvasas v1.0");
      UART1_Write(13);
      UART1_Write_Text("Kiolvasva: 0x32");
      UART1_Write(13);
      UART1_Write(bejovo);
      UART1_Write(13);
      UART1_Write_Text("===================");
      UART1_Write(13);
      UART1_Write(13);
    }
    if(PORTB.F2==1){
      while(PORTB.F2==1){}
      EEPROM_Write(0x32, 0xff);
      UART1_Write_Text("EEPROM Torolve");
      UART1_Write(13);
      UART1_Write(13);
    }
  }

}

Íme egy egyszerű program. A B0 lábon lévő gomb megnyomása esetén írási módba lépünk. Ez esetben az UARTon keresztül érkező egyetlen karakter beírásra kerül az EEPROMba. A B1-es lábon lévő gomb megnyomása esetén Ezt kiolvassa majd UARTon keresztül visszaküldi. A "bejovo=0x00;" sor annak érdekében kell, hogy ez bizonyítsa, tényleg kiolvas nem csak visszaküld.
A B2-es lábon lévő gombbal pedig törölni lehet az EEPROMot.

A második program amit leközlök UARTon elküldni az EEPROM adatait a B0-án lévő gomb lenyomásáról. Erről láthattok képet a cikk elején.

unsigned short datas;
unsigned int adresss, adr1, adr2, ii, yy;
unsigned char hhh[2];
unsigned char readed [16];
void main() {
  UART1_Init(9600);
  Delay_ms(1000);
  TRISB=0xff;
  while(1){
    UART1_Write_Text("Press 'button' to read the EEPROM");
    while(1){
      if(PORTB.F0==1){
        break;
      }
    }
    UART1_Write(13);
    UART1_Write_Text("Addr  00 01 02 03 04 05 06 07  08 09 0A 0B 0C 0D 0E 0F       CHAR");
    UART1_Write(13);
    UART1_Write(13);
    EEPROM_Write(0x05, 'H');
    EEPROM_Write(0x06, 'e');
    EEPROM_Write(0x07, 'l');
    EEPROM_Write(0x08, 'l');
    EEPROM_Write(0x09, 'o');
    EEPROM_Write(0x0A, '!');
    EEPROM_Write(0x00, 0xff);
    for(ii=0; ii<=15; ii++){
      UART1_Write_Text("000");
      if(ii<=9){
        UART1_Write(ii+48);
      }
      else if(ii>=10){
        UART1_Write(ii+55);
      }
      UART1_Write(' ');
      UART1_Write(' ');
      for(yy=0; yy<=15; yy++){
        datas=EEPROM_Read((ii*16)+yy);
        readed[yy]=datas;
        ShortToHex(datas, hhh);
        UART1_Write(hhh[0]);
        UART1_Write(hhh[1]);
        //UART1_Write(datas);
        UART1_Write(' ');
        if(yy==7){UART1_Write(' ');}
        //UART1_Write(' ');
      }
      UART1_Write(' ');
      for(yy=0; yy<16; yy++){
        UART1_Write(readed[yy]);
      }
      UART1_Write(13);
    }
  }

}

Rövid demonstrációnak azt hiszem ez elég is lesz, hamarosan folytatom. 

Nincsenek megjegyzések:

Megjegyzés küldése