EEPROM gebruiken om gegevens definitief te bewaren

Het data-geheugen van de PIC18F4550 is vluchtig. Dat wil zeggen dat de gegevens die in het geheugen opgeslagen zijn, verloren gaan wanneer de voedingsspanning wegvalt. In vele gevallen is dit niet erg, maar soms kan het nuttig zijn dat bijvoorbeeld instellingen bewaard blijven, ook als het Dwengo-bord wordt uitgeschakeld. Daarom heeft de PIC18F4550 naast het vluchtige data-geheugen ook 256 bytes niet-vluchtig EEPROM-geheugen dat gebruikt kan worden om niet-vluchtige gegevens te bewaren.

Het onderstaande programma demonstreert het gebruik van het EEPROM-geheugen. Het programma maakt het mogelijk om de bytes op adres 0 te wijzigen met behulp van de drukknoppen. De north-drukknop verhoogt de byte met 1 en de south-drukknop vermindert de byte met 1.

De belangrijkste onderdelen van het programma zijn de readEepromByte-functie en de writeEepromByte-functie. De readEepromByte-functie leest de waarde van één van de 256 EEPROM-bytes terwijl de writeEepromByte-functie een waarde op een gegeven adres van het EEPROM-geheugen wegschrijft. Voor meer informatie over de interne werking van deze functies verwijzen we je door naar hoofdstuk 7 van de PIC18F4550 datasheet .

Test het programma door een waarde in te stellen en dan de voeding uit te schakelen. De volgende keer dat de voeding ingeschakeld wordt, zou de ingestelde waarde opnieuw op het LCD-scherm moeten verschijnen.

  1. #include <p18f4550.h>
  2. #include "lcd.h"
  3. #include "delay50ms.h"
  4.  
  5. // Fuses configuration
  6. #pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input)
  7. #pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled, HS used by USB
  8. #pragma config IESO = OFF // Oscillator Switchover mode disabled
  9. #pragma config PWRT = OFF // PWRT disabled
  10. #pragma config BOR = OFF // Brown-out Reset enabled in hardware only (SBOREN is disabled)
  11. #pragma config WDT = OFF // HW Disabled - SW Controlled
  12. #pragma config WDTPS = 32768 // 1:32768
  13. #pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled
  14. #pragma config LVP = OFF // Disable low-voltage programming
  15. #pragma config CCP2MX = ON // Config3h
  16. #pragma config PBADEN = OFF // PORB digital IO on powerup
  17.  
  18.  
  19. #define byte unsigned char
  20.  
  21. #define PRESSED 0
  22. #define S_N PORTBbits.RB4
  23. #define S_S PORTBbits.RB5
  24.  
  25. #define BYTE_ADDR 0
  26.  
  27. #define TRUE 1
  28.  
  29. void writeEepromByte(byte addr, byte data) {
  30. INTCONbits.GIE = 0; // Disable interupts
  31.  
  32. EECON1bits.EEPGD = 0; // Select the EEPROM memory
  33. EECON1bits.CFGS = 0; // Access the EEPROM memory
  34. EECON1bits.WREN = 1; // Enable writing
  35. EEADR = addr; // Set the address
  36. EEDATA = data; // Set the data
  37. EECON2 = 0x55; // Write initiate sequence
  38. EECON2 = 0xaa; // Write initiate sequence
  39. EECON1bits.WR = 1; // Start writing
  40. while (!PIR2bits.EEIF)
  41. ; // Wait for write to finish
  42. PIR2bits.EEIF = 0; // Clear EEIF bit
  43.  
  44. INTCONbits.GIE = 1; // Enable interupts
  45. }
  46.  
  47. byte readEepromByte(unsigned char addr) {
  48. EECON1bits.EEPGD = 0; // Select the EEPROM memory
  49. EECON1bits.CFGS = 0; // Access the EEPROM memory
  50. EEADR = addr; // Set the address
  51. EECON1bits.RD = 1; // Start reading
  52. return EEDATA; // Return the read value
  53. }
  54.  
  55.  
  56. void main(void) {
  57. TRISB = 0xFF; // Configure port B as inputs
  58. INTCON2bits.NOT_RBPU = 0; // Enable internal pullup resistors
  59.  
  60. // Initiate the LCD
  61. initLCD();
  62. clearLCD();
  63.  
  64. while (TRUE) {
  65. // Write value stored in EEPROM to LCD
  66. setLineOnLCD(1);
  67. appendIntToLCD(readEepromByte(BYTE_ADDR));
  68.  
  69. // Change value stored in EEPROM with north and south button
  70. if (S_N == PRESSED) {
  71. writeEepromByte(BYTE_ADDR, readEepromByte(BYTE_ADDR) + 1);
  72. }
  73. if (S_S == PRESSED) {
  74. writeEepromByte(BYTE_ADDR, readEepromByte(BYTE_ADDR) - 1);
  75. }
  76.  
  77. Delay10KTCYx (200);
  78. }
  79. }