Forum: Mikrocontroller und Digitale Elektronik Benötige Programmcode: PIC16F88 Interes Eeprom beschreiben und auslesen


von Marc (Gast)


Lesenswert?

Hi,

ich verwende den PIC16F88 mit dem CCS Compiler und benötige Hilfe beim 
Beschreiben und Auslesen des internen Eeproms.

Programmbeschreibung:

Nach dem Zuschalten der Betriebsspannung und dem Hochfahren des 
LCD-Displays wird auf dem LCD Display der Wert von 0 beginnend, alle 2s
um 1 erhöht. Quasi ein Aufwärtszähler der bis 255 zählt.

Ich würde gerne immer den aktuellen Wert ins Eeprom schreiben, so dass
beim Abschalten der Betriebsspannung der aktuelle Wert erhalten bleibt.
Nach dem die 5V wieder zugeschaltet werden, soll der Zähler an der 
Stelle weiterzählen, wo er aufgehört hat. Auf dem Gebiet von 
Datenspeicherung habe ich bis jetzt noch keine Erfahrung. Darum würde 
ich mich freuen, wenn ihr mir helfen würdet.

Vielen Dank!

Folgendes Programm habe ich dazu geschrieben:

int a = 0;

void main()
{
    lcd_init

    delay_ms(2000);
    lcd_putc("\fReady...");
    delay_ms(2000);

while(true)
{
a = a + 1;
printf(lcd_putc,"\fWert: %02u",a);
delay_ms(2000);
}
}

von Oliver J. (skriptkiddy)


Lesenswert?

Da steht wie es in Assembler gemacht wird. Vielleicht hilft dir das.
http://www.sprut.de/electronic/pic/grund/eeprom.htm

Beim CCS müssen auch irgendwie Beispiele dabei sein:
http://www.ccsinfo.com/devices.php?page=exlist

Ach ja. Vergiss nicht, dass du nur eine begrenzte Anzahl von 
Schreibzyklen hast, bis das EEPROM verschleißt.


Grüße

Skriptkiddy

von Rolf P. (rolfp)


Lesenswert?

Marc schrieb:
> ich verwende den PIC16F88 mit dem CCS Compiler und benötige Hilfe beim
> Beschreiben und Auslesen des internen Eeproms.

Ich kenn jetzt den PIC16F88 nicht. Aber falls das ähnlich geht wie mit 
dem ATmega8 braucht man noch 4 Zeilen aus diesem Tutorial:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM
1
#include <avr/eeprom.h>
2
uint16_t eeFooWord EEMEM = 124; //(124 ist Adresse, nicht Inhalt!)
3
a = eeprom_read_word(&eeFooWord);
4
eeprom_write_word(&eeFooWord, a);
Wo in deinem Programm platzieren findest du leicht selbst raus.

Rolf

von Lehrmann M. (ubimbo)


Lesenswert?

Rolf Pfister schrieb:
> Ich kenn jetzt den PIC16F88 nicht. Aber falls das ähnlich geht wie mit
> dem ATmega8 braucht man noch 4 Zeilen aus diesem Tutorial:
> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...#include <avr/eeprom.h>
> uint16_t eeFooWord EEMEM = 124; //(124 ist Adresse, nicht Inhalt!)
> a = eeprom_read_word(&eeFooWord);
> eeprom_write_word(&eeFooWord, a);
> Wo in deinem Programm platzieren findest du leicht selbst raus.
>
> Rolf

Hmm so umständlich ist das beim PIC nicht.

Es gibt eine Library für den EEPROM. Musst du dir in der Hilfe 
raussuchen. In diese Funktion füttert man die Adresse und den Wert 
(byte) rein und fertig.

Ein Problem das aber auch schon agesprochen wurde: Du hast nicht 
unbegrenzt Schreibzyklen auf den EEPROM.

Wenn ich das noch richtig im Kopf habe sind es 10.000 Stück. In der 
Praxis sind es ein paar mehr. Microchip garantiert allerdings nur für 
10.000 Zugriffe. 10.000 Zugriffe * 2 Sek => 20.000 Zugriffe alle 2 
Sekunden -> 334 Minuten -> 5 Stunden lang lebt dein EEPROM. Keine gute 
Idee ...

von usuru (Gast)


Lesenswert?

Der PIC16F88 hat laut Datenblatt 100.000 Lösch/Schreibzyklen für das 
Flash und 1.000.000 Lösch/Schreibzyklen für das EEPROM.

von Marc (Gast)


Lesenswert?

Hallo zusammen,

vielen Dank für eure Antworten.

Auf jedenfall schonmal gut zu wissen das man das Eeprom nicht unbegrenzt 
lesen/schreiben kann. Das o.g. Programm ist aber auch garnicht für eine 
Anwendung sondern lediglich für Testzwecke gedacht, damit ich einfach 
mal lerne Daten ins Eeprom abzulegen und auszulesen.

Ich werde morgen noch einmal nach einer Library für die Verwendung des 
internen Eeproms suchen. Leider hab ich bis jetzt nur welche für 
serielle I2C Eeproms gefunden. Dafür ist am Pic aber leider kein Platz 
mehr, weil die I2C Pins schon fürs LCD Display und eine RTC drauf gehen. 
Ist es eigentlich einfacher ein externes Eeprom zu verwenden statt das 
interne?

Außerdem habe ich gelesen, dass das interne Eeprom 256 Bytes groß ist.

Ist es eigentlich möglich an ein Eeprom direkt eine Integer Varible zu 
übertragen oder geht das nur bit für bit? Wenn ich z.B. für die Variable 
a folgendes habe, dann benötie ich von den 256 Bytes ja ein Byte um den 
Wert a im Eeprom abzulegen, oder?

int8 = a;



Danke für eure Hilfe

von usuru (Gast)


Lesenswert?

Eigentlich ist es ja ganz einfach: sofern der CCS keine geeigneten 
Funktionen für das EEPROM zur Verfügung stellen sollte (ich kenne den 
CCS nicht), kannst Du die Routinen aus 
http://www.sprut.de/electronic/pic/grund/eeprom.htm zumindest als 
Inline-Assembler (das kann jeder Compiler) in ein Unterprogramm packen 
und dieses dann aus C aufrufen.

Zur Grösse des EEPROM: häufig sind es 256 Bytes, manchmal aber auch 
weniger http://www.sprut.de/electronic/pic/grund/grund.htm#eeprom, 
manche auch mehr (1024 Byte) manche haben gar kein EEPROM

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.