Benötige Programmcode: PIC16F88 Interes Eeprom beschreiben und auslesen

Gast #1893016
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);
}
}
#1893400
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
#1893419
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 ...
Gast #1893833
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
Gast #1893907
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren