Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/20: Рейтинг темы: голосов - 20, средняя оценка - 4.50
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
1

MikroC. Запись-чтение байт во Flash память PIC18F452

16.05.2013, 19:45. Просмотров 3632. Ответов 13
Метки нет (Все метки)

Нашел вот такую функцию.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void Flash_Write_Sector(long address, char *data) {
  unsigned short saveintcon, i, j, flg;
 
  saveintcon = INTCON;
 
  //erase memory
  TBLPTRL = Lo(address);
  TBLPTRH = Hi(address);
  TBLPTRU = Higher(address);
 
  EECON1.EEPGD = 1;         //required erase sequence
  EECON1.CFGS = 0;
  EECON1.WREN = 1;
  EECON1.FREE = 1;
  INTCON.GIE = 0;
  EECON2 = 0x55;
  EECON2 = 0xAA;
  EECON1.WR = 1;
  INTCON.GIE = 1;
  asm TBLRD*- ;
  //--- write memory
  FSR0L = Lo(data);
  FSR0H = Hi(data);
  j = 0;
  while (j <= 7u) {
    i = 0;
    while (i <= 7u) {
      TABLAT  = POSTINC0;
      asm {
        TBLWT+*
      }
      i++;
    }
    EECON1.EEPGD = 1;
    EECON1.CFGS = 0;
    EECON1.WREN = 1;
    INTCON.GIE = 0;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1.WR = 1;
 
    j++;
  }
  INTCON.GIE = 1;
  EECON1.WREN = 0;
  //--- restore interrupt
  INTCON = saveintcon;
}//~
похоже она должна выполнять запись байт во Flash память.
Переделал вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void Flash_Write_Sector(long address, short *data)  
{
  unsigned short saveintcon, j;
 
  saveintcon = INTCON;
 
  //erase memory
  TBLPTRL = Lo(address);
  TBLPTRH = Hi(address);
  TBLPTRU = Higher(address);
 
  EECON1.EEPGD = 1;         //required erase sequence
  EECON1.CFGS = 0;
  EECON1.WREN = 1;
  EECON1.FREE = 1;
  INTCON.GIE = 0;
  EECON2 = 0x55;
  EECON2 = 0xAA;
  EECON1.WR = 1;
  INTCON.GIE = 1;
  asm TBLRD*- ;
  //--- write memory
  FSR0L = Lo(data);
  FSR0H = Hi(data);
  j = 0;
  while (j <= 63)
 {
     TABLAT  = *data++;
      asm {
        TBLWT+*
      }
    EECON1.EEPGD = 1;
    EECON1.CFGS = 0;
    EECON1.WREN = 1;
    INTCON.GIE = 0;
    EECON2 = 0x55;
    EECON2 = 0xAA;
    EECON1.WR = 1;
 
    j++;
  }
  INTCON.GIE = 1;
  EECON1.WREN = 0;
  //--- restore interrupt
  INTCON = saveintcon;
}//~
\
а толку нету.
Может в протеусе нельзя эмуллировать запись во Flash память.
В даташите не чего не сказано про регистры
C++
1
2
  FSR0L = Lo(data);
  FSR0H = Hi(data);
и где должно выполняться запись во Flash (в прерывание что ли?) и через какой регистр.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2013, 19:45
Ответы с готовыми решениями:

Запись в память и чтение из нее
Значит есть программа-вольтметр, и при выходе напряжение за определенные приделы загорается...

Запись и чтение данных NAND flash подключенной к STM32F4_diskovery
Доброе время суток. Суть проблемы. К МК STM32F4_diskovery подключил NAND память MT29F64G08....

Чтение/запись определенного количества байт из бинарного файла
Подскажите пожалуста как реализовать на с++ в RAD Studio чтение определенного количества байт из...

QExtSerialPort чтение и запись flash
Здравствуйте уважаемые форумчане! Появилась такая проблемка: есть какая-то железячка(производимая...

Неадекватная запись/чтение Flash-USB
Hi! Стал &quot;счастливым&quot; обладателем данной штуки, а точнее нашел на улице такой носитель инфы -...

13
russo turisto
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
16.05.2013, 21:21 2
Это вы расписали асемблерный вариант на си.
Тогда легче на асемблере написать.
кое где нужно nop ы вставить и прерывания запрещать.
В протеусе нужно в отладке смотреть.

Проще воспользоваться компиляторными встроеными функциями.
Не указано какой компилятор.
0
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
16.05.2013, 22:00  [ТС] 3
Компилятор MikroC Version: 6.2.1.0.
Я трассировку проводил в PIC18 Simulator IDE.
Все регистры которые относятся к записи в память работают. Функция проходит без ошибок.

Добавлено через 18 минут
Встроенная функция тоже не работает.

Добавлено через 6 минут
Вот пример со встроенными функциями
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
unsigned short i = 0;
unsigned long addr=0;
unsigned short dataWr[64] =
            {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
             1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
             1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
             1,2,3,4};
 
void main() 
{
  PORTB = 0;
  TRISB = 0;
          
  Flash_Write(addr, dataWr);
 
  for (i = 0; i <= 64; i++) {
    PORTB = Flash_Read(addr++);
    Delay_ms(500);
  }
 
}
При прогоне в протеусе и эмуляторе для pic18 функция Flash_Write(addr, dataWr); проходит без ошибок и цикл тоже проходит без ошибок но Flash_Write(addr, dataWr); не записывает данные.
Вот код на asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
$0000   $EFD0   F000            GOTO    _main
$0008   $   _Flash_Write:
$0008   $CFF2   F063            MOVFF   INTCON, Flash_Write_bak_L0
$000C   $C05A   FFF6            MOVFF   FARG_Flash_Write+0, TBLPTRL
$0010   $C05B   FFF7            MOVFF   FARG_Flash_Write+1, TBLPTRH
$0014   $C05C   FFF8            MOVFF   FARG_Flash_Write+2, TBLPTRU
$0018   $8EA6                   BSF EECON1, 7, 0
$001A   $9CA6                   BCF EECON1, 6, 0
$001C   $84A6                   BSF EECON1, 2, 0
$001E   $88A6                   BSF EECON1, 4, 0
$0020   $9EF2                   BCF INTCON, 7, 0
$0022   $0E55                   MOVLW   85
$0024   $6EA7                   MOVWF   EECON2, 0
$0026   $0EAA                   MOVLW   170
$0028   $6EA7                   MOVWF   EECON2, 0
$002A   $82A6                   BSF EECON1, 1, 0
$002C   $8EF2                   BSF INTCON, 7, 0
$002E   $000A                   TBLRD*-
$0030   $0100                   MOVLB   0
$0032   $6B62                   CLRF    Flash_Write_j_L0, 1
$0034   $C05E   FFE9            MOVFF   FARG_Flash_Write+4, FSR0L
$0038   $C05F   FFEA            MOVFF   FARG_Flash_Write+5, FSR0H
$003C   $   L_Flash_Write_0:
$003C   $0E08                   MOVLW   8
$003E   $5D62                   SUBWF   Flash_Write_j_L0, 0, 1
$0040   $E216                   BC  L_Flash_Write_1
$0042   $6B61                   CLRF    Flash_Write_i_L0, 1
$0044   $   L_Flash_Write_2:
$0044   $0E08                   MOVLW   8
$0046   $5D61                   SUBWF   Flash_Write_i_L0, 0, 1
$0048   $E205                   BC  L_Flash_Write_3
$004A   $CFEE   FFF5            MOVFF   POSTINC0, TABLAT
$004E   $000F                   TBLWT+*
$0050   $2B61                   INCF    Flash_Write_i_L0, 1, 1
$0052   $D7F8                   BRA L_Flash_Write_2
$0054   $   L_Flash_Write_3:
$0054   $8EA6                   BSF EECON1, 7, 0
$0056   $9CA6                   BCF EECON1, 6, 0
$0058   $84A6                   BSF EECON1, 2, 0
$005A   $6AF2                   CLRF    INTCON, 0
$005C   $9EF2                   BCF INTCON, 7, 0
$005E   $0E55                   MOVLW   85
$0060   $6EA7                   MOVWF   EECON2, 0
$0062   $0EAA                   MOVLW   170
$0064   $6EA7                   MOVWF   EECON2, 0
$0066   $82A6                   BSF EECON1, 1, 0
$0068   $8EF2                   BSF INTCON, 7, 0
$006A   $2B62                   INCF    Flash_Write_j_L0, 1, 1
$006C   $D7E7                   BRA L_Flash_Write_0
$006E   $   L_Flash_Write_1:
$006E   $C063   FFF2            MOVFF   Flash_Write_bak_L0, INTCON
$0072   $94A6                   BCF EECON1, 2, 0
$0074   $0012                   RETURN
$0076   $   _Flash_Read:
$0076   $C05A   FFF6            MOVFF   FARG_Flash_Read+0, TBLPTRL
$007A   $C05B   FFF7            MOVFF   FARG_Flash_Read+1, TBLPTRH
$007E   $C05C   FFF8            MOVFF   FARG_Flash_Read+2, TBLPTRU
$0082   $0008                   TBLRD*
$0084   $CFF5   F000            MOVFF   TABLAT, STACK_0
$0088   $0012                   RETURN
$008A   $   GlobalInidee:
$008A   $0E00                   MOVLW   0
$008C   $6E59                   MOVWF   _i+0, 0
$008E   $0E00                   MOVLW   0
$0090   $6E15                   MOVWF   _addr+0, 0
$0092   $0E00                   MOVLW   0
$0094   $6E16                   MOVWF   _addr+1, 0
$0096   $0E00                   MOVLW   0
$0098   $6E17                   MOVWF   _addr+2, 0
$009A   $0E00                   MOVLW   0
$009C   $6E18                   MOVWF   _addr+3, 0
$009E   $0E01                   MOVLW   1
$00A0   $6E19                   MOVWF   _dataWr+0, 0
$00A2   $0E02                   MOVLW   2
$00A4   $6E1A                   MOVWF   _dataWr+1, 0
$00A6   $0E03                   MOVLW   3
$00A8   $6E1B                   MOVWF   _dataWr+2, 0
$00AA   $0E04                   MOVLW   4
$00AC   $6E1C                   MOVWF   _dataWr+3, 0
$00AE   $0E05                   MOVLW   5
$00B0   $6E1D                   MOVWF   _dataWr+4, 0
$00B2   $0E06                   MOVLW   6
$00B4   $6E1E                   MOVWF   _dataWr+5, 0
$00B6   $0E07                   MOVLW   7
$00B8   $6E1F                   MOVWF   _dataWr+6, 0
$00BA   $0E08                   MOVLW   8
$00BC   $6E20                   MOVWF   _dataWr+7, 0
$00BE   $0E09                   MOVLW   9
$00C0   $6E21                   MOVWF   _dataWr+8, 0
$00C2   $0E00                   MOVLW   0
$00C4   $6E22                   MOVWF   _dataWr+9, 0
$00C6   $0E01                   MOVLW   1
$00C8   $6E23                   MOVWF   _dataWr+10, 0
$00CA   $0E02                   MOVLW   2
$00CC   $6E24                   MOVWF   _dataWr+11, 0
$00CE   $0E03                   MOVLW   3
$00D0   $6E25                   MOVWF   _dataWr+12, 0
$00D2   $0E04                   MOVLW   4
$00D4   $6E26                   MOVWF   _dataWr+13, 0
$00D6   $0E05                   MOVLW   5
$00D8   $6E27                   MOVWF   _dataWr+14, 0
$00DA   $0E06                   MOVLW   6
$00DC   $6E28                   MOVWF   _dataWr+15, 0
$00DE   $0E07                   MOVLW   7
$00E0   $6E29                   MOVWF   _dataWr+16, 0
$00E2   $0E08                   MOVLW   8
$00E4   $6E2A                   MOVWF   _dataWr+17, 0
$00E6   $0E09                   MOVLW   9
$00E8   $6E2B                   MOVWF   _dataWr+18, 0
$00EA   $0E00                   MOVLW   0
$00EC   $6E2C                   MOVWF   _dataWr+19, 0
$00EE   $0E01                   MOVLW   1
$00F0   $6E2D                   MOVWF   _dataWr+20, 0
$00F2   $0E02                   MOVLW   2
$00F4   $6E2E                   MOVWF   _dataWr+21, 0
$00F6   $0E03                   MOVLW   3
$00F8   $6E2F                   MOVWF   _dataWr+22, 0
$00FA   $0E04                   MOVLW   4
$00FC   $6E30                   MOVWF   _dataWr+23, 0
$00FE   $0E05                   MOVLW   5
$0100   $6E31                   MOVWF   _dataWr+24, 0
$0102   $0E06                   MOVLW   6
$0104   $6E32                   MOVWF   _dataWr+25, 0
$0106   $0E07                   MOVLW   7
$0108   $6E33                   MOVWF   _dataWr+26, 0
$010A   $0E08                   MOVLW   8
$010C   $6E34                   MOVWF   _dataWr+27, 0
$010E   $0E09                   MOVLW   9
$0110   $6E35                   MOVWF   _dataWr+28, 0
$0112   $0E00                   MOVLW   0
$0114   $6E36                   MOVWF   _dataWr+29, 0
$0116   $0E01                   MOVLW   1
$0118   $6E37                   MOVWF   _dataWr+30, 0
$011A   $0E02                   MOVLW   2
$011C   $6E38                   MOVWF   _dataWr+31, 0
$011E   $0E03                   MOVLW   3
$0120   $6E39                   MOVWF   _dataWr+32, 0
$0122   $0E04                   MOVLW   4
$0124   $6E3A                   MOVWF   _dataWr+33, 0
$0126   $0E05                   MOVLW   5
$0128   $6E3B                   MOVWF   _dataWr+34, 0
$012A   $0E06                   MOVLW   6
$012C   $6E3C                   MOVWF   _dataWr+35, 0
$012E   $0E07                   MOVLW   7
$0130   $6E3D                   MOVWF   _dataWr+36, 0
$0132   $0E08                   MOVLW   8
$0134   $6E3E                   MOVWF   _dataWr+37, 0
$0136   $0E09                   MOVLW   9
$0138   $6E3F                   MOVWF   _dataWr+38, 0
$013A   $0E00                   MOVLW   0
$013C   $6E40                   MOVWF   _dataWr+39, 0
$013E   $0E01                   MOVLW   1
$0140   $6E41                   MOVWF   _dataWr+40, 0
$0142   $0E02                   MOVLW   2
$0144   $6E42                   MOVWF   _dataWr+41, 0
$0146   $0E03                   MOVLW   3
$0148   $6E43                   MOVWF   _dataWr+42, 0
$014A   $0E04                   MOVLW   4
$014C   $6E44                   MOVWF   _dataWr+43, 0
$014E   $0E05                   MOVLW   5
$0150   $6E45                   MOVWF   _dataWr+44, 0
$0152   $0E06                   MOVLW   6
$0154   $6E46                   MOVWF   _dataWr+45, 0
$0156   $0E07                   MOVLW   7
$0158   $6E47                   MOVWF   _dataWr+46, 0
$015A   $0E08                   MOVLW   8
$015C   $6E48                   MOVWF   _dataWr+47, 0
$015E   $0E09                   MOVLW   9
$0160   $6E49                   MOVWF   _dataWr+48, 0
$0162   $0E00                   MOVLW   0
$0164   $6E4A                   MOVWF   _dataWr+49, 0
$0166   $0E01                   MOVLW   1
$0168   $6E4B                   MOVWF   _dataWr+50, 0
$016A   $0E02                   MOVLW   2
$016C   $6E4C                   MOVWF   _dataWr+51, 0
$016E   $0E03                   MOVLW   3
$0170   $6E4D                   MOVWF   _dataWr+52, 0
$0172   $0E04                   MOVLW   4
$0174   $6E4E                   MOVWF   _dataWr+53, 0
$0176   $0E05                   MOVLW   5
$0178   $6E4F                   MOVWF   _dataWr+54, 0
$017A   $0E06                   MOVLW   6
$017C   $6E50                   MOVWF   _dataWr+55, 0
$017E   $0E07                   MOVLW   7
$0180   $6E51                   MOVWF   _dataWr+56, 0
$0182   $0E08                   MOVLW   8
$0184   $6E52                   MOVWF   _dataWr+57, 0
$0186   $0E09                   MOVLW   9
$0188   $6E53                   MOVWF   _dataWr+58, 0
$018A   $0E00                   MOVLW   0
$018C   $6E54                   MOVWF   _dataWr+59, 0
$018E   $0E01                   MOVLW   1
$0190   $6E55                   MOVWF   _dataWr+60, 0
$0192   $0E02                   MOVLW   2
$0194   $6E56                   MOVWF   _dataWr+61, 0
$0196   $0E03                   MOVLW   3
$0198   $6E57                   MOVWF   _dataWr+62, 0
$019A   $0E04                   MOVLW   4
$019C   $6E58                   MOVWF   _dataWr+63, 0
;dee.c,3 ::             unsigned short dataWr[64] =
$019E   $0012                   RETURN
$01A0   $   _main:
;dee.c,9 ::             void main()
;dee.c,11 ::            PORTB = 0;
$01A0   $EC45   F000            CALL    GlobalInidee, 1
$01A4   $6A81                   CLRF    PORTB, 0
;dee.c,12 ::            TRISB = 0;
$01A6   $6A93                   CLRF    TRISB, 0
;dee.c,14 ::            Flash_Write(addr, dataWr);
$01A8   $C015   F05A            MOVFF   _addr, FARG_Flash_Write+0
$01AC   $C016   F05B            MOVFF   _addr+1, FARG_Flash_Write+1
$01B0   $C017   F05C            MOVFF   _addr+2, FARG_Flash_Write+2
$01B4   $C018   F05D            MOVFF   _addr+3, FARG_Flash_Write+3
$01B8   $0E19                   MOVLW   _dataWr
$01BA   $6E5E                   MOVWF   FARG_Flash_Write+4, 0
$01BC   $0E00                   MOVLW   @_dataWr
$01BE   $6E5F                   MOVWF   FARG_Flash_Write+5, 0
$01C0   $EC04   F000            CALL    _Flash_Write
;dee.c,16 ::            for (i = 0; i <= 64; i++) {
$01C4   $6A59                   CLRF    _i, 0
$01C6   $   L_main_0:
$01C6   $0100                   MOVLB   0
$01C8   $5059                   MOVF    _i, 0, 0
$01CA   $0840                   SUBLW   64
$01CC   $E333                   BNC L_main_1
;dee.c,17 ::            PORTB = Flash_Read(addr++);
$01CE   $C015   F05A            MOVFF   _addr, FARG_Flash_Read+0
$01D2   $C016   F05B            MOVFF   _addr+1, FARG_Flash_Read+1
$01D6   $C017   F05C            MOVFF   _addr+2, FARG_Flash_Read+2
$01DA   $C018   F05D            MOVFF   _addr+3, FARG_Flash_Read+3
$01DE   $EC3B   F000            CALL    _Flash_Read
$01E2   $C000   FF81            MOVFF   STACK_0, PORTB
$01E6   $0E01                   MOVLW   1
$01E8   $2615                   ADDWF   _addr, 1, 0
$01EA   $0E00                   MOVLW   0
$01EC   $2216                   ADDWFC  _addr+1, 1, 0
$01EE   $2217                   ADDWFC  _addr+2, 1, 0
$01F0   $2218                   ADDWFC  _addr+3, 1, 0
;dee.c,18 ::            Delay_ms(500);
$01F2   $0E06                   MOVLW   6
$01F4   $6E0C                   MOVWF   STACK_12, 0
$01F6   $0EFF                   MOVLW   255
$01F8   $6E0B                   MOVWF   STACK_11, 0
$01FA   $0EFF                   MOVLW   255
$01FC   $6E0A                   MOVWF   STACK_10, 0
$01FE   $2E0C                   DECFSZ  STACK_12, F, 0
$0200   $D001                   BRA $+2
$0202   $D007                   BRA $+8
$0204   $2E0B                   DECFSZ  STACK_11, F, 0
$0206   $D001                   BRA $+2
$0208   $D003                   BRA $+4
$020A   $2E0A                   DECFSZ  STACK_10, F, 0
$020C   $D7FE                   BRA $-1
$020E   $D7FA                   BRA $-5
$0210   $D7F6                   BRA $-9
$0212   $0E1A                   MOVLW   26
$0214   $6E0B                   MOVWF   STACK_11, 0
$0216   $0EFF                   MOVLW   255
$0218   $6E0A                   MOVWF   STACK_10, 0
$021A   $2E0B                   DECFSZ  STACK_11, F, 0
$021C   $D001                   BRA $+2
$021E   $D003                   BRA $+4
$0220   $2E0A                   DECFSZ  STACK_10, F, 0
$0222   $D7FE                   BRA $-1
$0224   $D7FA                   BRA $-5
$0226   $0E42                   MOVLW   66
$0228   $6E0A                   MOVWF   STACK_10, 0
$022A   $2E0A                   DECFSZ  STACK_10, F, 0
$022C   $D7FE                   BRA $-1
$022E   $0000                   NOP
;dee.c,19 ::            }
$0230   $   L_main_2:
;dee.c,16 ::            for (i = 0; i <= 64; i++) {
$0230   $2A59                   INCF    _i, 1, 0
;dee.c,19 ::            }
$0232   $D7C9                   BRA L_main_0
$0234   $   L_main_1:
;dee.c,21 ::            }
$0234   $D7FF                   BRA $
1
russo turisto
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
17.05.2013, 21:47 4
Нужно весь код папкой выкладывать, чтоб можно было у себя проверить.

А теперь, посмотрите у себя на слово конфигурации CONFIG6H (30000Bh). Интересует бит 7 WRTD, 1=запись в еепром разрешена, 0=запись в еепром запрещена.

Неужели микросишный компилятор стал показывать асемблерный код в полном виде. Насколько я знаю библиотеки у него закрытые. Поэтому его не долюбливают.
0
17.05.2013, 21:47
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
17.05.2013, 23:39  [ТС] 5
Цитата Сообщение от russo turisto Посмотреть сообщение
Нужно весь код папкой выкладывать, чтоб можно было у себя проверить.

А теперь, посмотрите у себя на слово конфигурации CONFIG6H (30000Bh). Интересует бит 7 WRTD, 1=запись в еепром разрешена, 0=запись в еепром запрещена.

Неужели микросишный компилятор стал показывать асемблерный код в полном виде. Насколько я знаю библиотеки у него закрытые. Поэтому его не долюбливают.
Да верно библиотеки закрытые. Но просмотр в asm доступен.

Добавлено через 9 минут
WRTD 1 ставил и в ноль ставил толку нету. Ладно попробую на железе а то может проблема в симуляторах.
0
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
18.05.2013, 19:58  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "built_in.h"
unsigned short i = 0;
unsigned long addr=0x0003dc;
unsigned short dataWr[64] =
{1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,
1,2,3,4};
void Flash_Write_Secto(long address, char *sdata) {
unsigned short saveintcon, i, j;
 
saveintcon = INTCON;
//--- erase memory
TBLPTRL = Lo(address);
TBLPTRH = Hi(address);
TBLPTRU = Higher(address);
//--- required erase sequence
EECON1.EEPGD = 1;
EECON1.CFGS = 0;
EECON1.WREN = 1;
EECON1.FREE = 1;
INTCON.GIE = 0;
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1.WR = 1;
INTCON.GIE = 1;
asm TBLRD*- ;
//--- write memory
FSR0L = Lo(sdata);
FSR0H = Hi(sdata);
j = 0;
while (j <= 7) {
i = 0;
while (i <= 7) {
TABLAT = POSTINC0;
asm {
TBLWT+*
}
i++;
}
EECON1.EEPGD = 1;
EECON1.CFGS = 0;
EECON1.WREN = 1;
INTCON.GIE = 0;
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1.WR = 1;
 
j++;
}
INTCON.GIE = 1;
EECON1.WREN = 0;
//--- restore interrupt
INTCON = saveintcon;
}//~
void main() {
PORTB = 0;
TRISB = 0;
Flash_Write_Secto(addr, dataWr);
addr=0x0003dc;
for (i = 0; i <= 63; i++) {
PORTB = Flash_Read(addr++);
 
}
 
}//~!
В программе PIC 18 Simulator в регистр TABLAT запись проходит и чтение тоже а результата ноль.
0
Вложения
Тип файла: rar MCP23.rar (663 байт, 15 просмотров)
weteroc
4 / 4 / 0
Регистрация: 27.03.2013
Сообщений: 28
19.05.2013, 10:07 7
День добрый , у меня есть практически похожий проект, запись кода во Flash память , только контроллер у меня используется 16F877A и кейпад 3х4.
0
russo turisto
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
20.05.2013, 09:07 8
Если нужна работа с еепром пика, то воспользуйтесь командами EEPROM_Read и EEPROM_Write
В протеусе проверил, работают.
0
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
20.05.2013, 16:06  [ТС] 9
Цитата Сообщение от russo turisto Посмотреть сообщение
Если нужна работа с еепром пика, то воспользуйтесь командами EEPROM_Read и EEPROM_Write
В протеусе проверил, работают.
EEPROM_Read и EEPROM_Write???????
Что за компилятор поддерживает такие команды??

Добавлено через 2 часа 37 минут
Цитата Сообщение от weteroc Посмотреть сообщение
День добрый , у меня есть практически похожий проект, запись кода во Flash память , только контроллер у меня используется 16F877A и кейпад 3х4.
А компилятор какой?
0
russo turisto
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
20.05.2013, 18:19 10
У меня про версия, есть в сети с лекарством.
0
raxp
10192 / 6575 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
20.05.2013, 18:58 11
Что за компилятор поддерживает такие команды??
в IAR-е тоже.
0
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
20.05.2013, 19:12  [ТС] 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
unsigned long addr=0x0D00;
unsigned short toWrite[64];
unsigned short i;
unsigned short dat=0;
void main()
{
PORTB = 0;                          // Initial PORTB value
TRISB = 0;
for(i=0;i<=63;i++)
{
toWrite[i]=i;
}
FLASH_Erase_Write_64(addr, toWrite);
for (i = 0; i <= 63; i++)
{
dat = FLASH_Read(addr++);
Delay_us(10);
PORTB=dat;
Delay_ms(500);
}}
Этот код откомпелировал в mikroC PRO for PIC и тоже не работает.
0
Вложения
Тип файла: rar Flash.rar (19.5 Кб, 10 просмотров)
russo turisto
97 / 92 / 0
Регистрация: 24.04.2010
Сообщений: 275
21.05.2013, 10:52 13
И для кого я это писал?
Цитата Сообщение от russo turisto Посмотреть сообщение
Если нужна работа с еепром пика, то воспользуйтесь командами EEPROM_Read и EEPROM_Write
В протеусе проверил, работают.
Что за невнимательность.

В общем переделал, в архиве все.

Только чтоб в железе заработало, выставить соответствующее слово конфигурации, разрешение записи чтения епрома.
1
Миниатюры
MikroC. Запись-чтение байт во Flash память PIC18F452  
Вложения
Тип файла: rar Flash.rar (32.9 Кб, 23 просмотров)
VladimirU
133 / 111 / 20
Регистрация: 14.02.2013
Сообщений: 799
21.05.2013, 17:59  [ТС] 14
Я затупил очень сильно.

EPROM (англ. Erasable Programmable Read Only Memory) — класс полупроводниковых запоминающих устройств, постоянная память, для записи информации (программирования) в которую используется электронное устройство-программатор и которое допускает перезапись.

Почему то я думал что EPROM энергозависимая память.
Только не пойму зачем нужна эта функция

C++
1
void Flash_Write(long address, unsigned short *fdata);
Записывает порцию данных во Flash память. Для PIC18 порция данных должна иметь точный размер 64 байта. Следует помнить, что перед записью данная функция стирает предназначенный для записи участок памяти. Это значит, что в случае неудачной попытки записи все предыдущие данные в памяти будут утрачены.
0
21.05.2013, 17:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2013, 17:59

Запись в память и чтение значений разных типов
Здравствуйте. Есть память, думал можно, а оказалось я в тупике, как покласть в память одно число...

Отображение файла на память (чтение и запись информации)
Короче нужно из одного файла переписать в другой используя отображение на память а у меня почему то...

Считывание из входного файла байт с N1 по N2 и с N3 по N4 и запись этих байт в выходной файл
Здравствуйте!Помогите пожалуйста написать программу, которая бы считывала из входного файла байты с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru