Forum: Mikrocontroller und Digitale Elektronik PIC16F1517 - Werte im Flash / EEPROM speichern


von gruser (Gast)


Lesenswert?

Hallo zusammen,

ich möchte Daten im nicht-flüchtigen Teil des o.g. Prozessors speichern 
und auch beim Brennen hier ablegen. Dies brauche ich um 
Einstellungswerte festhalten zu können, die nach einem Neustart des 
Prozessors wieder abgefragt werden können.


Dabei verwende ich einen Sprut-Brenner und den Compiler CC5X.

Ich fürchte ich habe es sogar schon mal gemacht - aber leider nicht 
richtig dokumentiert. Soweit ich weiß gibt es ein paar Bytes, die ohne 
Probleme hierfür genutzt werden können, ohne große Speicher-Prozeduren. 
Aber ich weiß nicht mehr wie ich es angestellt habe und werde nicht mehr 
aus dem Datenblatt schlau.

Vielleicht hat ja jemand eine Lösung parat - würde mich sehr freun.

Viele Grüße
Olaf

von Marcus (Gast)


Lesenswert?

Es gibt dort nur den großen Flash-Speicher, an dem Du Dir ein Plätzchen 
für Deine Daten auswählen kannst, z.B. ganz am Ende. Wirklich zu 
bevorzugende Adressen gibt es nicht, aber falls Du während der Laufzeit 
schreiben möchtest, solltest Du aufpassen, dass die Adresse außerhalb 
der konfigurierten self-write protection liegt.

von Max H. (hartl192)


Lesenswert?

Wenn du die Daten nur beim Start brauchst und nicht verändern willst 
kannst du es einfach so machen.
1
molw 0x??  ;1. Konstante
2
movwf konstante1
3
molw 0x??  ;2. Konstante
4
movwf konstante2
5
...

Wenn du sie auch im Programm verändern willst findest du im Kapitel 11.0 
FLASH PROGRAM MEMORY CONTROL wie du Daten aus dem Flash lesen und 
schreiben kannst. Auf dieser Seite wird das lesen/schreiben in den 
Flash/EEPROM behandelt: 
http://www.sprut.de/electronic/pic/grund/eeprom.htm

Und EEPROM hat dein PIC keines.

Edit: Ich sehe erst jetzt, dass du C verwendest, ich habe Sprut gelesen 
und automatisch an ASM gedacht.

Spricht was dagegen es einfach so zu machen:
1
int konstante1=1234, konstante2=4567, ...;

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

gruser schrieb:
>> Ich fürchte ich habe es sogar schon mal gemacht - aber leider nicht
> richtig dokumentiert. Soweit ich weiß gibt es ein paar Bytes, die ohne
> Probleme hierfür genutzt werden können, ohne große Speicher-Prozeduren.

Ein paar Bytes????
Also wenn es nicht mehr als 4 Bytes wären, dann kannst du die im 
"User-ID-Bereich" ablegen, bei den PIC16F151x ist das der Bereich 
0x8000...0x8003.
Ist genauso wie der normale Flashbereich über TBLRD und TBLWRT 
zugänglich.

von Humpfdidumpf (Gast)


Lesenswert?

Hi,

in der XC18 Peripheral library gibt es Flash Funktionen - PIC18_plib.pdf 
im dokumente Ordner des Compilers:
ReadFlash(), EraseFlash()...

Ist nicht für PIC16 sonder PIC18, aber probieren kann man es mal. 
Eventuell kannst du wenigstens abkucken wie es dort gemacht wird

Ansonsten noch in der Hilfe für den Compiler nach folgendem suchen:
EPROM_READ(address) und ähliche sollen für viele 8Bitter gehen.

Zuletzt gibt es noch eine Appnote für eine Bootloader, da könnte man 
auch mal reinschauen:
http://ww1.microchip.com/downloads/en/AppNotes/01310a.pdf

Noch wichtig: Flash kann man nur pageweise löschen, daher beim löschen 
etwas aufpassen.
Am besten eine ganze Page im Linker ausnehmen (die letzte ist am 
einfachsten), damit da kein Programmcode oder gar Config bits drinnen 
stehen.

von Max H. (hartl192)


Angehängte Dateien:

Lesenswert?

Chris B. schrieb:
> Ist genauso wie der normale Flashbereich über TBLRD und TBLWRT
> zugänglich.
Nicht beim PIC16. Die Befhle TBLRD und TBLWRT hat von den 8bittern nur 
der PIC18.

Humpfdidumpf schrieb:
> Ist nicht für PIC16 sonder PIC18
Dann wird sie vermutlich mit TBLRD und TBLWRT und diese Befehle gibt es 
beim PIC16 nicht.

Geht es nur mit so, oder habt ihr auch nicht genau verstanden was der TO 
genau vor hat?

Wenn die Konstanten nur beim Flashen geändert werden sollten könnte er 
auch ein einfaches #define verwenden.

Wenn du die Werte auch mit dem PIC Programm ändern willst geht das so: 
Siehe Anhang (Auszug aus dem Datenblatt S. 100 und 105).
Wie du die Konstante beim Flashen in eine Adresse schreibst weiß ich nur 
in ASM:
1
ORG  0x1800    ; Beispiel für die Adresse
2
DA   0x35AD    ; Zahl 1 (0x35AD) wird in der Adresse 0x1800 abgelegt 
3
DA   0x125F    ; Zahl 2 (0x125F) wird in der Adresse 0x1801 abgelegt

: Bearbeitet durch User
von Chris B. (dekatz)


Lesenswert?

Stimmt, beim PIC16 geht es nur etwas umständlicher.

Was der TE genau vor hat??? Keine Ahnung.

"......Soweit ich weiß gibt es ein paar Bytes, die ohne
Probleme hierfür genutzt werden können, ohne große 
Speicher-Prozeduren...."

Ein "paar Bytes" ohne auf die Belegung des Programm-Flash achten zu 
müssen und ohne Linkerscript Anpassungen,  sind eben nur die "paar 
Bytes" der User-ID. Dort kann er auch beim Flashen schon was ablegen.

von Max H. (hartl192)


Lesenswert?

Humpfdidumpf schrieb:
> in der XC18 Peripheral library
Einen XC18 gibt es nicht. Es gibt den C18 (nur für PIC18) und den XC8 
(für alle 8bit PICs). Welchen meinst du?

von R2D2 (Gast)


Lesenswert?

Eine absolut zuverlässige und recht preiswerte Methode findest Du hier:

http://www.microchip.com/pagehandler/en-us/products/memory/serialEEPROM/home.html

von Max H. (hartl192)


Lesenswert?

R2D2 schrieb:
> Eine absolut zuverlässige und recht preiswerte Methode findest Du hier:
>
> 
http://www.microchip.com/pagehandler/en-us/products/memory/serialEEPROM/home.html
Um das Problem hardwaremäßig zu vereinfachen, könnte man auch einen PIC 
mit integriertem EEPROM verwenden.

von R2D2 (Gast)


Lesenswert?

Max H. schrieb:
> Um das Problem hardwaremäßig zu vereinfachen, könnte man auch einen PIC
> mit integriertem EEPROM verwenden.

Das klappt aber nur, wenn Du beim Programmieren die internen 
EEPROM-Daten nicht aus Versehen überschreibst.

von Meister E. (edson)


Lesenswert?

Marcus schrieb:
> Es gibt dort nur den großen Flash-Speicher, an dem Du Dir ein Plätzchen
> für Deine Daten auswählen kannst, z.B. ganz am Ende. Wirklich zu
> bevorzugende Adressen gibt es nicht, aber falls Du während der Laufzeit
> schreiben möchtest, solltest Du aufpassen, dass die Adresse außerhalb
> der konfigurierten self-write protection liegt.

Würdest du 100k garantierte Schreibzyklen (die letzten 128 Byte des 
Flash 0x1f80..0x1fff, siehe DS40001452D, S.17) nicht 10k Schreibzyklen 
vorziehen? ;)
Der Tipp mit der Self-Write-Protection ist natürlich trotzdem richtig.

von Meister E. (edson)


Lesenswert?

Humpfdidumpf schrieb:
> Noch wichtig: Flash kann man nur pageweise löschen, daher beim löschen
> etwas aufpassen.

Nicht Page- sondern Reihenweise. Eine Reihe ist dabei 32 Byte lang.

> Am besten eine ganze Page im Linker ausnehmen (die letzte ist am
> einfachsten), damit da kein Programmcode oder gar Config bits drinnen
> stehen.

Die Configuration Bits haben eine absolute Adresse und werden nicht vom 
Linker irgendwo hin platziert.

von Max H. (hartl192)


Lesenswert?

gruser schrieb:
> beim Brennen hier ablegen.
Das wird mit dem SPI/I2C EEPROM kompliziert.

Abgesehen vom Preis (30ct. laut Microchip param. Suchen) und der Anzahl 
de ADC-Kanäle (28 vs. 14) hätte der PIC16F1937 nur vorteile (z.B. 
internes 256byte EEPROM) gegenüber dem PIC16F1517

: Bearbeitet durch User
von Meister E. (edson)


Lesenswert?

Meister Eder schrieb:
> die letzten 128 Byte
> Eine Reihe ist dabei 32 Byte lang.

Entschuldigung, ich meine natürlich 14-Bit Speicherworte, nicht Byte. 
Allerdings können die FSRx Zeiger nur die 8 lsb adressieren (zum lesen, 
schreiben sowieso nicht). Wenn man den vollen Bereich nutzen möchte, 
geht das nur über die PM-Register (PMCONx,PMDAT,PMADR) und 
entsprechender Schreib/Lese-Prozedur.

von Max H. (hartl192)


Lesenswert?

Jetzt fällt mir ein. Ich habe mal auf einem PIC12 (in ASM) eine 10bit 
Lookup Table in Flash erstellt. Das auslesen war einfach. Verändert habe 
ich sie nur beim Flashen mit dem Programmer.

Falls du mit dem Code was anfangen kannst:
1
  LUT_10bit:
2
  BANKSEL PMADRL
3
  
4
  MOVWF PMADRL 
5
  MOVLW high 0x300 
6
  MOVWF PMADRH 
7
  
8
  BCF PMCON1,CFGS   ;Do not select Configuration Space
9
  BSF PMCON1,RD     ;Initiate read
10
  NOP         ;Ignored 
11
  NOP         ;Ignored 
12
  
13
  movf PMDATL,w
14
  movwf PWM_h 
15
  movf PMDATH,w
16
  movwf PWM_l
17
  
18
  return

In C könnte das ungefähr so aussehen:
1
unsigned int read(unsigned int address)
2
{
3
  unsigned int data;
4
  PMADRL=address&0xFF;
5
  PMADRH=(address>>8)&0xFF;
6
7
  PMCON1bits.CFGS=0;
8
  PMCON1bits.RD=1;
9
  Nop();
10
  Nop();
11
12
  data=PMDATH;
13
  data=(data<<8)|PMDATL;
14
  return data;
15
}
Jetzt brauchst du nur noch eine Funktion fürs Schreiben, wenn du die 
Werte ändern willst.

von gruser (Gast)


Lesenswert?

Chris B. schrieb:
> Ein "paar Bytes" ohne auf die Belegung des Programm-Flash achten zu
> müssen und ohne Linkerscript Anpassungen,  sind eben nur die "paar
> Bytes" der User-ID. Dort kann er auch beim Flashen schon was ablegen.


Ein paar Bytes würden mir reichen. Wie kann ich es denn anstellen, dass 
ich die Werte für meine "Grundeinstellungen" bzw. ersten Werte beim 
Brennen hinterlegen kann?

von Max H. (hartl192)


Lesenswert?

Willst du die Werte eigentlich vom Programm ändern lassen?

gruser schrieb:
> Wie kann ich es denn anstellen, dass
> ich die Werte für meine "Grundeinstellungen" bzw. ersten Werte beim
> Brennen hinterlegen kann?

In ASM geht das so, wenn du keine lösung in C findest, kannst du ja 
immer noch inline asm verwenden.
> ORG  0x1800    ; Beispiel für die Adresse
> DA   0x35AD    ; Zahl 1 (0x35AD) wird in der Adresse 0x1800 abgelegt
> DA   0x125F    ; Zahl 2 (0x125F) wird in der Adresse 0x1801 abgelegt

: Bearbeitet durch User
von gruser (Gast)


Lesenswert?

Vielleicht noch kurz zum Hintergrund: Ich habe ein Display angeschlossen 
und möchte darüber den Anwender Einstellungen auswählen lassen. Beim 
allerersten Start z.B. soll die Bedienoberfläche in Deutsch sein, der 
User kann aber eine andere Sprache auswählen. Nach einem Reset soll der 
IC dann mit der ausgewählten Sprache wieder starten.

Insofern muss ich nur ein paar Flags brennen bzw. permanent speichern 
können.

In den Beiträgen waren ja einige Anregungen dabei - ich übe mal ein 
wenig und melde mich noch mal. Vielen Dank auf jeden Fall jetzt schon 
einmal für die super Unterstützung!

von Max H. (hartl192)


Lesenswert?

gruser schrieb:
> Insofern muss ich nur ein paar Flags brennen bzw. permanent speichern
> können.
Du musst die Daten also im Programm ändern können.
Dann denke ich ist die einfachste Lösung einen PIC zu suchen, der ein 
EEPROM hat.

In MPLAB IDE kannst du unter View --> EEPOM/Programm Memory nach dem 
Compilern die Daten, die dann beim Programmieren in den Flash und ins 
EEPROM geschrieben werden, ansehen und ändern.

Hier findest du wie du Daten über den Quellcode in den Flash (S.29) und 
EEPROM (S.99) schreiben kannst: http://www.bknd.com/doc/cc5x-34.pdf

: Bearbeitet durch User
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.