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.
#include <p18f4550.h> #include "lcd.h" #include "delay50ms.h" // Fuses configuration #pragma config PLLDIV = 5 // Divide by 5 (20 MHz oscillator input) #pragma config FOSC = HSPLL_HS // HS oscillator, PLL enabled, HS used by USB #pragma config IESO = OFF // Oscillator Switchover mode disabled #pragma config PWRT = OFF // PWRT disabled #pragma config BOR = OFF // Brown-out Reset enabled in hardware only (SBOREN is disabled) #pragma config WDT = OFF // HW Disabled - SW Controlled #pragma config WDTPS = 32768 // 1:32768 #pragma config MCLRE = ON // MCLR pin enabled; RE3 input pin disabled #pragma config LVP = OFF // Disable low-voltage programming #pragma config CCP2MX = ON // Config3h #pragma config PBADEN = OFF // PORB digital IO on powerup #define byte unsigned char #define PRESSED 0 #define S_N PORTBbits.RB4 #define S_S PORTBbits.RB5 #define BYTE_ADDR 0 #define TRUE 1 void writeEepromByte(byte addr, byte data) { INTCONbits.GIE = 0; // Disable interupts EECON1bits.EEPGD = 0; // Select the EEPROM memory EECON1bits.CFGS = 0; // Access the EEPROM memory EECON1bits.WREN = 1; // Enable writing EEADR = addr; // Set the address EEDATA = data; // Set the data EECON2 = 0x55; // Write initiate sequence EECON2 = 0xaa; // Write initiate sequence EECON1bits.WR = 1; // Start writing while (!PIR2bits.EEIF) ; // Wait for write to finish PIR2bits.EEIF = 0; // Clear EEIF bit INTCONbits.GIE = 1; // Enable interupts } byte readEepromByte(unsigned char addr) { EECON1bits.EEPGD = 0; // Select the EEPROM memory EECON1bits.CFGS = 0; // Access the EEPROM memory EEADR = addr; // Set the address EECON1bits.RD = 1; // Start reading return EEDATA; // Return the read value } void main(void) { TRISB = 0xFF; // Configure port B as inputs INTCON2bits.NOT_RBPU = 0; // Enable internal pullup resistors // Initiate the LCD initLCD(); clearLCD(); while (TRUE) { // Write value stored in EEPROM to LCD setLineOnLCD(1); appendIntToLCD(readEepromByte(BYTE_ADDR)); // Change value stored in EEPROM with north and south button if (S_N == PRESSED) { writeEepromByte(BYTE_ADDR, readEepromByte(BYTE_ADDR) + 1); } if (S_S == PRESSED) { writeEepromByte(BYTE_ADDR, readEepromByte(BYTE_ADDR) - 1); } Delay10KTCYx (200); } }
- Type:
- login of registreer om te reageren
-


Uw winkelwagen