Forum: Mikrocontroller und Digitale Elektronik PIC16F1503: In Internen Flash schreiben


von Seppi (Gast)


Lesenswert?

Hallo Leute,

Möchte gerne in den internen Flash des PIC16F1503 schreiben.
NEIN es ist kein PIC18
NEIN nicht in den EEPROM (hat keinen)
Compiler ist Mikrobasic Pro 6.0

Nun habe ich mir folgende Idee ausgedacht:
1
module EEPROM_Operationen  'Eigentlich Flash_Operationen
2
include "Variabel_Definitionen"
3
4
Const Flashmemmorystart = 0x7FF     'Höchste Addresse beim PIC16F1503
5
6
dim Sub Procedure LoadSettings
7
dim Sub Procedure Speichere_Einschaltpunkt_Relais1
8
dim Sub Procedure Speichere_Ausschaltpunkt_Relais1
9
dim Sub Procedure Speichere_Einschaltpunkt_Relais2
10
dim Sub Procedure Speichere_Ausschaltpunkt_Relais2
11
12
implements
13
14
sub Procedure WaitForWrite
15
    delay_ms(10)
16
end sub
17
18
sub procedure Write_LongWord(dim Flash_start as word, dim byref val_LongWord as LongWord)
19
'Write 4 words in Flash memory
20
dim counter as byte
21
    data_ as word
22
    dataAR as word[4][4]
23
    
24
 'First read the actual values from the flash memory, to avoid, to overwirte it.
25
  dataAR[0][0]= FLASH_Read(Flash_start)
26
  dataAR[0][1]= FLASH_Read(Flash_start +1)
27
  dataAR[0][2]= FLASH_Read(Flash_start +2)
28
  dataAR[0][3]= FLASH_Read(Flash_start +3)
29
  dataAR[1][0]= FLASH_Read(Flash_start +4)
30
  dataAR[1][1]= FLASH_Read(Flash_start +5)
31
  dataAR[1][2]= FLASH_Read(Flash_start +6)
32
  dataAR[1][3]= FLASH_Read(Flash_start +7)
33
  dataAR[2][0]= FLASH_Read(Flash_start +8)
34
  dataAR[2][1]= FLASH_Read(Flash_start +9)
35
  dataAR[2][2]= FLASH_Read(Flash_start +10)
36
  dataAR[2][3]= FLASH_Read(Flash_start +11)
37
  dataAR[3][0]= FLASH_Read(Flash_start +12)
38
  dataAR[3][1]= FLASH_Read(Flash_start +13)
39
  dataAR[3][2]= FLASH_Read(Flash_start +14)
40
  dataAR[3][3]= FLASH_Read(Flash_start +15)
41
  
42
  'Now move the value to the buffer
43
  dataAR[0][0]= Lo(val_LongWord)
44
  dataAR[0][1]= Hi(val_LongWord)
45
  dataAR[0][2]= Higher(val_LongWord)
46
  dataAR[0][3]= Highest(val_LongWord)
47
  
48
  'Now write the buffer to the internal Flash
49
  for counter = 0 to 3
50
    Delay_ms(100)
51
    FLASH_Write(Flash_start+counter*4, dataAR[counter])
52
  next counter
53
  Delay_ms(500)
54
end sub
55
56
sub function Read_LongWord(dim Flash_start as word) as LongWord 'read 4 words from Flash memory
57
dim Helper as longword
58
    Lo(Helper) = FLASH_Read(Flash_start)
59
    Hi(Helper) = FLASH_Read(Flash_start + 1)
60
    Higher(Helper) = FLASH_Read(Flash_start + 2)
61
    Highest(Helper) = FLASH_Read(Flash_start + 3)
62
    Read_LongWord = Helper
63
end sub
64
65
Sub Procedure LoadSettings
66
dim Flashmemmorystart as word
67
    Einschaltpunkt_Relais1 = Read_LongWord(Flashmemmorystart - 16)
68
    Ausschaltpunkt_Relais1 = Read_LongWord(Flashmemmorystart - 32)
69
    Einschaltpunkt_Relais2 = Read_LongWord(Flashmemmorystart - 48)
70
    Ausschaltpunkt_Relais2 = Read_LongWord(Flashmemmorystart - 64)
71
end sub
72
73
Sub Procedure Speichere_Einschaltpunkt_Relais1
74
    Write_LongWord(Flashmemmorystart - 16,Einschaltpunkt_Relais1)
75
end sub
76
77
Sub Procedure Speichere_Ausschaltpunkt_Relais1
78
    Write_LongWord(Flashmemmorystart - 32,Ausschaltpunkt_Relais1)
79
end sub
80
81
Sub Procedure Speichere_Einschaltpunkt_Relais2
82
    Write_LongWord(Flashmemmorystart -48,Einschaltpunkt_Relais2)
83
end sub
84
85
Sub Procedure Speichere_Ausschaltpunkt_Relais2
86
    Write_LongWord(Flashmemmorystart - 64,Ausschaltpunkt_Relais2)
87
end sub
88
89
end.

Kann das in dieser Form funktionieren?
Wer hat da Erfahrung damit?

von Gerald S. (geralds)


Lesenswert?

>
> Kann das in dieser Form funktionieren?
> Wer hat da Erfahrung damit?

---
Hi,

So auf die Schnelle gesehen, nein, kann nicht funktionieren.
Im Manual des Bauteils steht die Routine, das Protokoll, wie das
Flash sich angesprochen fühlt.

Es fehlt noch was - zB: 55,AA; ... als Hinweis,
-- siehe bitte im Manual nach, wie es genau geht.

Grüße
Gerald

von chris (Gast)


Lesenswert?

Nein, funktioniert auf keinem Falle.

Du musst FLASH_Read_N sowie FLASH_Write_16 benutzten.

Emulation hat Pages, Sectors .
Bei dieser Architektur kann man maximal 64 bytes EEprom emulieren.
Dies weil das Flash 14bit hat, also low 8 bit = EEprom Data, high 6 bit 
=
Adresse
Also je Sector 64 bytes. Sprich willst du 256 bytes emulieren, dann gibt 
es
4 Sektoren. Jeder Sector hat N Pages, mindestens jedoch zwei, besser 3.
Wenn mehr als zwei Pages, so hat jede Page einen Write counter.
Normalerweise können max zwei Pages aktive sein, oft auch nur eine.
Bei 14bit flash wird meistens auch die Anzahl der der Tabelle 
gespeichert,
also bei z.B. 256 bytes page size je 8 Eintraege ein bit. Damit geht
das Lesen und Schreiben dann schneller.

Beispiel 1K flash als EEprom Ersatz mit 1 Sector zu je 4 Pages

Wenn du asm code einbinden kannst, dann wäre das der einfachste Weg, 
ansonsten musst du dir dies zu Fuß programmieren.
AN gibt es diesbezüglich auch von Microchip.

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.