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); } }
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
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
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 ...
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.