mikrocontroller.net

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


Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}
}

Autor: Oliver Ju. (skriptkiddy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Pfister (rolfp)
Datum:

Bewertung
0 lesenswert
nicht 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-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

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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... <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 ...

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: usuru (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.