Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.63/57: Рейтинг темы: голосов - 57, средняя оценка - 4.63
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536

Доработка программатора MAVR для работы с W27 С 512-45Z

26.10.2019, 11:26. Показов 14425. Ответов 136
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как доработать файлы aMAVR1 программатора Ковлева MAVR и схему для работы с W27С512-45Z , добавив режим стирания ЭРПЗУ , W27С512-45Z , режим работы с другими ПЗУ серии 27Cxxx ,28Cxxx , 29Cxxx? Можно убрать поддержку 24Сxx.Как переделать на Лазарус программу и обеспечить устойчивый обмен данными по (виртуальному) UART-порту на 115200 бод 8-N-2 ?
Есть ли у кого - то готовые решения? Если что, потом допишу свои варианты и соображения на эту тему .

Есть ли у кого -то программы на лазарусе для обмена данными по UART с двухпоточностью (фоновый прием при передаче ) на 115200 бод 8-N-2 ? Можно и аналогично хайасмовскому сделать с "мультитредс ".

Добавлено через 1 минуту
Кажется, "глюкнул " браузер , удалить копию темы с таким же названием , плохо вводилось название микросхемы в заголовке при редактировании
Вложения
Тип файла: zip aMAVR1_fixed_read27_1.zip (317.9 Кб, 70 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2019, 11:26
Ответы с готовыми решениями:

Библиотека или функция для работы с SHA-512
Нужна библиотека или функция с помощью которой я смогу зашифровать строку в SHA-512

Доработка программы для работы с классами
прикрепил проект, помогите плз доработать программу, там пару ошибок связанные с классами + нужно отсортировать список с помощью лямбда...

Доработка модуля проекта Аксесс 2003 (отбирающего все записи, находящиеся в форме) для работы с MySQL для
Форумчане, доброго времени суток! Была разделенная БД Формы, запросы, отчеты Аксесс2003- таблицыАксесс2003. Таблицы перенес на MySQL,...

136
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 09:48  [ТС]
Студворк — интернет-сервис помощи студентам
В статье Овечкина в ВРЛ №113 есть пример для 2708,2716,27128,2764 . Учесть при разводке питания , формирователи у нас немного другие .
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 09:49  [ТС]
Для C3, C2 и винбондовских другие минтермы , в отличие от C0 , C00,C1 .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 12:32  [ТС]
Ориентировочные варианты адаптеров (функциональная схема, упрощенно, эскизы, для ЭСРППЗУ с 5В переделываются , для винбондовской переделывается программа без идентификации или усложняется схема ):
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z   Доработка программатора MAVR для работы с W27 С 512-45Z   Доработка программатора MAVR для работы с W27 С 512-45Z  

Доработка программатора MAVR для работы с W27 С 512-45Z   Доработка программатора MAVR для работы с W27 С 512-45Z   Доработка программатора MAVR для работы с W27 С 512-45Z  

Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 13:53  [ТС]
Вариант схемы адаптера под нашу программу
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 13:55  [ТС]
2732 аналогично 27512 , только другие адреса , панелька, верхняя граница , уточнить напряжение программирования (Vid пока нет ).
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 14:07  [ТС]
Для M2732
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
08.11.2019, 14:09  [ТС]
Для DDS- пробника прошить можно , для коммерческого применения не рекомендовано .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
09.11.2019, 09:55  [ТС]
Для управления клавишей табуляции можно добавить WS_EX_CONTROLPARENT в атрибуты главного окна

C++
1
2
3
4
5
6
7
8
9
10
    hMainWindow = CreateWindow(wc.lpszClassName,"MAVR W27 PROGRAMMER ",
    WS_OVERLAPPEDWINDOW |  WS_EX_CONTROLPARENT,   
CW_USEDEFAULT,CW_USEDEFAULT,700,600,NULL,NULL,hInstance,NULL);
 
/*
    hMainWindow = CreateWindow(wc.lpszClassName,"MAVR W27  PROGRAMMER ",
    WS_OVERLAPPEDWINDOW ,  
CW_USEDEFAULT,CW_USEDEFAULT,700,600,NULL,NULL,hInstance,NULL);
 
*/
и изменить обработчик сообщений
C++
1
2
3
4
5
6
7
    while (GetMessage(&msg, NULL, 0, 0))   {
    if (IsDialogMessage(hMainWindow, &msg)) {  /*        Already handled by dialog manager   */} else  
   { TranslateMessage(&msg);    DispatchMessage(&msg); } }
 
/*
    while (GetMessage(&msg, NULL, 0, 0))   {  TranslateMessage(&msg);    DispatchMessage(&msg);   }
*/
,
прописать
C++
1
2
3
4
5
6
7
  case WM_CREATE:
 
            InitControls( hwnd , hInst  );
            InitDLG( hwnd);
         // SetFocus( textBoxOutput );
               SetFocus( GetDlgItem(hwnd, IDC_DAT)); 
            break;
Добавлено через 20 минут
Для предустановки в режиме совместимости с хардом Ковлева отправить чекбоксу сообщение о установленности :

C++
1
2
3
 static HWND Checkbox_Defbd = CreateWindow (  "Button","MAVR 0.3 compatible ",WS_CHILD|WS_VISIBLE|WS_TABSTOP|  BS_AUTOCHECKBOX,    10,315,180,20, hWnd, (HMENU)IDC_BAUDSEL1, hInstance, NULL);
 
SendMessage(Checkbox_Defbd, BM_SETCHECK, BST_CHECKED, NULL);
Добавлено через 1 час 8 минут
Можно и без статических хэндлеров (дескрипторов) окон элементов :
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
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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
#include <windows.h>
#include <winuser.h> 
#include <commctrl.h>
#include "macros27.h"
 
 
 
 
 
 
 
 
 
  int AdvBaudMode=0;
  int AdvancedChips=0; 
 
 
 
HDC hdc;
 
HINSTANCE hInst;
 
 
 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
 
 
void InitControls(HWND     hWnd, HINSTANCE hInstance     )
{
 
 
  
 
CreateWindowEx (WS_EX_CLIENTEDGE,  PROGRESS_CLASS, NULL, WS_CHILD | WS_VISIBLE | PBS_MARQUEE , 10,30, 180, 20, hWnd, (HMENU)IDC_PB,  hInstance, NULL); 
 
 
    
 
    CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Read ",WS_CHILD | WS_VISIBLE | WS_TABSTOP| ES_CENTER, 
                 10, 60,90,30,hWnd,(HMENU)IDC_READALL,NULL,NULL); 
 
  CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Write to IC",WS_CHILD | WS_VISIBLE | WS_TABSTOP| ES_CENTER,  100, 60,90,30,hWnd,(HMENU)IDC_WRITEBUFF, NULL,NULL); 
 
   CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Check Clear",WS_CHILD | WS_VISIBLE |WS_TABSTOP|  ES_CENTER,  10, 90,90,30,hWnd,(HMENU)IDC_ISCLEAR ,NULL,NULL);  
 
 CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Erase IC",WS_CHILD | WS_VISIBLE | WS_TABSTOP| ES_CENTER, 100, 90,90,30,hWnd,(HMENU)IDC_CLEARALL,NULL,NULL);
 
  CreateWindowEx(WS_EX_CLIENTEDGE,"Button","File->buffer",WS_CHILD | WS_VISIBLE |WS_TABSTOP|  ES_CENTER, 10, 120,90,30,hWnd,(HMENU)IDC_LOADBUFFER ,NULL,NULL);
 
 CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Buffer->file",WS_CHILD | WS_VISIBLE | WS_TABSTOP| ES_CENTER, 100, 120,90,30,hWnd,(HMENU)IDC_SAVEBUFFER,NULL,NULL);
 
 CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Compare checksums",WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_CENTER, 10 , 150,180,30,hWnd,(HMENU)IDC_COMPARE, NULL,NULL);
  
 CreateWindowEx(WS_EX_CLIENTEDGE, "Edit",  "", WS_CHILD | WS_VISIBLE |  ES_READONLY, 10, 185, 180, 20,  hWnd, (HMENU)IDC_CS, hInstance, NULL);
 
 
 
 
  
 CreateWindow("STATIC","Port",WS_VISIBLE | WS_CHILD | SS_LEFT, 10,210,80,20,hWnd,NULL,hInstance,NULL);    
 
 static HWND Checkbox_Defbd = CreateWindow (  "Button","MAVR 0.3 compatible ",WS_CHILD|WS_VISIBLE|WS_TABSTOP|  BS_AUTOCHECKBOX,    10,315,180,20, hWnd, (HMENU)IDC_BAUDSEL1, hInstance, NULL);
 
SendMessage(Checkbox_Defbd, BM_SETCHECK, BST_CHECKED, NULL);
 
    
HWND   hComboPORTNAME = CreateWindow("combobox", TEXT(""),  
                                WS_CHILD | WS_VISIBLE | WS_TABSTOP|CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL, 
                                 10, 235, 85, 150,  hWnd,(HMENU) IDC_PORTNUM, hInstance, NULL);
      
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM1");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM2");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM3");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM4");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM5");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM6");
    SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM7");
   SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM8");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM9");
  SendMessage(hComboPORTNAME, CB_ADDSTRING, 0, (LPARAM)"COM10");
  SendDlgItemMessage(hWnd, IDC_PORTNUM, CB_SETCURSEL, (WPARAM)0, 0) ;
 
 HWND hComboBaud= CreateWindow("combobox",   TEXT(""),  
                         WS_CHILD | WS_VISIBLE | WS_TABSTOP| CBS_DROPDOWN |WS_VSCROLL, 
                           10 , 260, 85, 150, hWnd, (HMENU)IDC_SELECTBAUD , hInstance, NULL);
    
    SendDlgItemMessage( hWnd, IDC_SELECTBAUD,  CB_ADDSTRING, 0, (LPARAM)"115200");   
    SendDlgItemMessage(  hWnd,IDC_SELECTBAUD, CB_ADDSTRING, 0, (LPARAM)"57600");   
    SendDlgItemMessage( hWnd,IDC_SELECTBAUD,  CB_ADDSTRING, 0, (LPARAM)"38400");   
    SendDlgItemMessage( hWnd,IDC_SELECTBAUD,  CB_ADDSTRING, 0, (LPARAM)"19200");   
    SendDlgItemMessage( hWnd,IDC_SELECTBAUD,  CB_ADDSTRING, 0, (LPARAM)"9600");   
    SendDlgItemMessage(  hWnd,IDC_SELECTBAUD,  CB_ADDSTRING, 0, (LPARAM)"4800");
 
 
 HWND     hComboStopbits= CreateWindow("combobox",   TEXT(""),  
                         WS_CHILD | WS_VISIBLE | CBS_DROPDOWN|WS_TABSTOP| CBS_AUTOHSCROLL|WS_VSCROLL, 
                           10  , 290, 85, 150, hWnd, (HMENU)IDC_SELECTSTOPB , hInstance, NULL);
    
    SendMessage(  hComboStopbits, CB_ADDSTRING, 0, (LPARAM)"1 stopbit");   
    SendMessage(  hComboStopbits, CB_ADDSTRING, 0, (LPARAM)"2 stopbit");   
 
  
   SendDlgItemMessage(hWnd, IDC_SELECTBAUD, CB_SETCURSEL,  (WPARAM)0, 0) ;
   SendDlgItemMessage(hWnd, IDC_SELECTSTOPB, CB_SETCURSEL, (WPARAM)0, 0) ;
   
  
HWND Checkbox_Ext=CreateWindow (  "Button","Advanced",WS_CHILD|WS_VISIBLE|WS_TABSTOP| BS_AUTOCHECKBOX, 100,260,90,20, hWnd, (HMENU)IDC_ENABLE_ADV_DEV    , hInstance, NULL);
SendMessage(Checkbox_Ext, BM_SETCHECK, BST_UNCHECKED, NULL); 
EnableWindow(GetDlgItem(hWnd, IDC_ENABLE_ADV_DEV), FALSE);
 
  CreateWindow("STATIC","Chip",WS_VISIBLE | WS_CHILD |  SS_LEFT, 100,210,80,20, hWnd, NULL,hInstance,NULL); 
 
HWND hComboDevType=  CreateWindow("combobox",   TEXT(""),   WS_CHILD | WS_VISIBLE |WS_TABSTOP|  CBS_DROPDOWN|CBS_AUTOHSCROLL|WS_VSCROLL,   100, 235, 90, 200, hWnd, (HMENU)IDC_CHOOSEDEV, hInstance, NULL);
    
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"27C512");  //C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"W27C512"); //C3  
 
       
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27256"); //C2
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M27128");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2764");//C1
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2732");//C3
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2716");//C0
    SendMessage(hComboDevType, CB_ADDSTRING, 0, (LPARAM)"M2708");//C00 , special hard  
    SendDlgItemMessage(hWnd, IDC_CHOOSEDEV, CB_SETCURSEL, (WPARAM)0, 0) ;
 
 
 
 /* 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 */
 /* FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF */
 
 
 CreateWindow  (  "Listbox", "",  WS_CHILD | WS_VISIBLE | WS_TABSTOP| LBS_NOTIFY | WS_VSCROLL , 
    200,30,450,400,hWnd,  (HMENU)IDC_DAT ,  hInstance, NULL );
 
 CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", NULL, WS_CHILD | WS_VISIBLE |WS_TABSTOP|  ES_AUTOHSCROLL,   300, 450, 330, 25, hWnd, ( HMENU)IDC_EDSTR, hInstance, NULL);
       
 
 CreateWindowEx(WS_EX_CLIENTEDGE, "Edit",TEXT("Port is closed "),WS_CHILD | WS_VISIBLE |  SS_CENTER|ES_READONLY,
      300,480, 360, 20,hWnd, (HMENU)IDC_STATUS, hInstance, NULL); 
          
    
     // CreateWindow("STATIC","Checksum:",WS_VISIBLE | WS_CHILD | SS_LEFT, 10,240,80,20,hWnd,NULL,hInstance,NULL);
    CreateWindow("STATIC","Fill region: ",WS_VISIBLE | WS_CHILD |  SS_CENTER, 10,340,180,20,hWnd,NULL,hInstance,NULL);
  
 
    CreateWindowEx(WS_EX_CLIENTEDGE, "Edit",TEXT("0000"), WS_CHILD | WS_VISIBLE | WS_TABSTOP |  ES_AUTOHSCROLL,   50, 365, 45, 20, hWnd, (HMENU) IDC_FROM,  hInstance, NULL);
   CreateWindow("STATIC","from",WS_VISIBLE | WS_CHILD | SS_LEFT, 10,365,30,20,hWnd,NULL,hInstance,NULL);
   CreateWindow("STATIC","to",WS_VISIBLE | WS_CHILD | SS_LEFT, 10,390,30,20,hWnd,NULL,hInstance,NULL);
   CreateWindowEx(WS_EX_CLIENTEDGE, "Edit",TEXT("FFFF"),WS_CHILD | WS_VISIBLE | WS_TABSTOP| ES_AUTOHSCROLL,
                 50, 390, 45, 20, hWnd, (HMENU)IDC_TO,  hInstance, NULL);
 
 CreateWindow("STATIC","Byte",WS_VISIBLE | WS_CHILD | SS_LEFT, 100,390,30,20,hWnd,NULL,hInstance,NULL);
 CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "FF", WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_AUTOHSCROLL,  140,390, 25, 20, hWnd, ( HMENU)IDC_BYTEEDSTR, hInstance, NULL);
 
    
 CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Region",WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_CENTER,   10 , 420,90,30,hWnd,(HMENU)IDC_CLEARRGN,NULL,NULL);
  CreateWindowEx(WS_EX_CLIENTEDGE,"Button","String",WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_CENTER,  100 , 420,90,30,hWnd,(HMENU)IDC_CLEARSTR,NULL,NULL);
  CreateWindowEx(WS_EX_CLIENTEDGE,"Button","All buffer",WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_CENTER,   10 , 450,180,30,hWnd,(HMENU)IDC_CLEARBUFF  ,NULL,NULL);
  CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Save String",WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_CENTER, 200 , 450,100,30,hWnd,(HMENU) IDC_SAVESTR, NULL,NULL);
 CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Get ID",WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_CENTER,  200 , 480,100,30,hWnd,(HMENU) IDC_GETID, NULL,NULL);
  CreateWindowEx(WS_EX_CLIENTEDGE,"Button","Exit",WS_CHILD | WS_VISIBLE | WS_TABSTOP| 
ES_CENTER,    10 , 520,180,30, hWnd, (HMENU)IDC_FINISH,NULL,NULL);
      
}
 
 
 
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nCmdShow)
{
    HWND hMainWindow;
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = (WNDPROC) WindowProc;
    wc.lpszClassName = "MAVR PROGRAMMER   W27 Edotion";
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)  COLOR_APPWORKSPACE;
   // HICON icon = (HICON ) LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
   // wc.hIcon = icon;
 
   //  wc.hIcon         =  NULL; 
   wc.hIcon         =(HICON) LoadImage (NULL, "icon.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
 
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wc);
 
 
    hMainWindow = CreateWindow(wc.lpszClassName,"MAVR W27 PROGRAMMER ",
    WS_OVERLAPPEDWINDOW |  WS_EX_CONTROLPARENT,   
CW_USEDEFAULT,CW_USEDEFAULT,700,600,NULL,NULL,hInstance,NULL);
 
/*
    hMainWindow = CreateWindow(wc.lpszClassName,"MAVR W27  PROGRAMMER ",
    WS_OVERLAPPEDWINDOW ,  
CW_USEDEFAULT,CW_USEDEFAULT,700,600,NULL,NULL,hInstance,NULL);
 
*/
    hInst = hInstance;
 
    if(hMainWindow == NULL) return 1;
 
    ShowWindow(hMainWindow, SW_SHOW);
 
    MSG msg = { 0};
 
    while (GetMessage(&msg, NULL, 0, 0))   {
    if (IsDialogMessage(hMainWindow, &msg)) {  /*        Already handled by dialog manager   */} else  
   { TranslateMessage(&msg);    DispatchMessage(&msg); } }
 
/*
    while (GetMessage(&msg, NULL, 0, 0))   {  TranslateMessage(&msg);    DispatchMessage(&msg);   }
*/
 
 
    return 0;
}
 
 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    
    CPRWDlg Dialog1;            
    switch(uMsg){
 
  case WM_CREATE:
 
            InitControls( hwnd , hInst  );
            InitDLG( hwnd);
         // SetFocus( textBoxOutput );
               SetFocus( GetDlgItem(hwnd, IDC_DAT)); 
            break;
 
/*
case WM_KEYDOWN:
       switch(wParam)
        {
              case VK_TAB:    
            SetFocus( textBoxOutput );
                 break;
         }       
*/                       
       break;
 
/*
case WM_KILLFOCUS:
        
        break;
 
 case WM_SETFOCUS:
          SetFocus( textBoxOutput );
      
       break;
*/
 
 
 
   
            
   case WM_COMMAND:
/*
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
 */         
         switch(LOWORD(wParam))
                 {
              
                          case   IDC_READALL:                                                                                                 
                                            Dialog1.OnReadall(hwnd ); 
                                                  break;
                          case   IDC_WRITEBUFF :
                                                     Dialog1.OnWritebuff(hwnd);
                                                     break;
                          case   IDC_ISCLEAR :
                                                      Dialog1.OnIsclear(hwnd);
                                                     break; 
                           case   IDC_CLEARALL :
                                                    Dialog1.OnClearall(hwnd);
                                                     break;
                              case   IDC_LOADBUFFER:
                                                     Dialog1.OnLoadbuffer(hwnd); 
                                                     break;
                               case IDC_SAVEBUFFER  :
                                                      Dialog1.OnSavebuffer(hwnd) ;
                                                     break;
                              case  IDC_COMPARE     :
                                                    Dialog1.OnChecksum(hwnd);
                                                     break;                  
                                   case  IDC_CLEARRGN     :
                                                   Dialog1.OnClearrgn(hwnd);
                                                     break;
                                         case  IDC_CLEARSTR  :
                                                    Dialog1.OnClearstr(hwnd);
                                                     break;
                                     case   IDC_CLEARBUFF    :
                                                    Dialog1.OnClearbuff(hwnd);
                                                     break;                                      
                                      case  IDC_SAVESTR    :
                                                      Dialog1.OnSavestr(hwnd);
                                                     break;
                                       case  IDC_GETID    :
                                                      Dialog1.OnGetId(hwnd);
                                                     break;
                      
                                       case  IDC_PORTNUM    :
                                                      if ( HIWORD (wParam) == LBN_SELCHANGE  ) 
                                                      {                                                                      
                                                         Dialog1.OnSelchangePortnum(hwnd);                                                                                                            
                                                       }
                                            break;
                                      case IDC_BAUDSEL1:
                                               
                                          if(IsDlgButtonChecked(hwnd, IDC_BAUDSEL1)) 
                                       {
                                              
                                    SendMessage(GetDlgItem(hwnd, IDC_ENABLE_ADV_DEV ), 
                                    BM_SETCHECK, BST_UNCHECKED, NULL); 
                                    EnableWindow(GetDlgItem(hwnd, IDC_ENABLE_ADV_DEV), FALSE);
                                      }
                                                  else
                                            {
                                          EnableWindow(GetDlgItem(hwnd, IDC_ENABLE_ADV_DEV), TRUE);
                                             }
 
                                                                  Dialog1.OnAdvancedBaudrateSelect(hwnd);
                                                                  Dialog1.OnSelchangeBaudrateStopb(hwnd)     ;     
                                                                    
                                                     break;
 
                                             case IDC_ENABLE_ADV_DEV    :
                                                                  Dialog1.OnAdvancedChipSelect(hwnd);                                                                                                                                                                 
                                                     break;
 
 
 
                                      case  IDC_CHOOSEDEV    :
                                                              if ( HIWORD (wParam) == LBN_SELCHANGE  ) 
                                                      {                                                                      
                                                         Dialog1.OnSelchangeSize(hwnd);                                                                                                         
                                                       }
                                            break;
 
                                     case  IDC_SELECTBAUD   :
                                                             if ( HIWORD (wParam) == LBN_SELCHANGE  ) 
                                                      {                                                                      
                                                         Dialog1.OnSelchangeBaudrateStopb(hwnd)     ;                                                                                                    
                                                       }
                                            break;
 
                                        case  IDC_SELECTSTOPB   :
                                                              if ( HIWORD (wParam) == LBN_SELCHANGE  ) 
                                                      {                                                                      
                                                        Dialog1.OnSelchangeBaudrateStopb(hwnd)     ;                                                 
                                                       
                                                       }
                                            break;
 
 
                                      /*On double click on the  IDC_DAT string */
 
                                     case IDC_DAT:
                                                              if ( HIWORD(wParam) == LBN_DBLCLK  ) {
                                                              Dialog1.OnDblclkDat(hwnd) ;
 
                                                             
                                                               }  
                                                   break;
                                           
                                 
 
                                     case   IDC_FINISH  : 
                                                                  PostQuitMessage(EXIT_SUCCESS); 
                                                                  break; 
 
                           } 
                                                    
                    
                  break;
                                      
 
        case WM_PAINT:          
            
            PAINTSTRUCT ps;
               hdc = BeginPaint(hwnd, &ps);
            
            EndPaint(hwnd, &ps);
            return 0;
        
 
 
 
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
      }
 
 
 
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
Добавлено через 1 час 27 минут
А как правильно через командную строку приделать к приложению иконку, например icon.ico (которую отображают, когда его видно в проводнике ) для Borland C++ 5.5.1 for Win32 , Embarcadero C++ 7.30 for Win32 Copyright (c) 2012-2017 компиляторов для командной строки ?

Пока так работает , как через .rc приделать ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
   HWND hMainWindow;
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = (WNDPROC) WindowProc;
    wc.lpszClassName = "MAVR PROGRAMMER   W27 Edotion";
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
   // wc.hbrBackground = CreateSolidBrush(RGB(240, 240, 240));   
     wc.hbrBackground = CreateSolidBrush(RGB(250, 250, 250));   
    //wc.hbrBackground = (HBRUSH)  COLOR_APPWORKSPACE;
 
   // HICON icon = (HICON ) LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
 
 
   //  wc.hIcon         =  NULL; 
     wc.hIcon         =(HICON) LoadImage (NULL, "icon.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
    //wc.hIcon = LoadIcon(NULL, (LPCSTR)MAINICON);
    //wc.hIconSm = LoadIcon(NULL, (LPCSTR)IDI_ICON1);
 
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wc);
Добавлено через 1 час 51 минуту
D DevC++ 5.11 не хочет работать
C++
1
LoadToBuffer(void)
и
C++
1
 SaveBuffer(void)
.

При исправлении NULL на 0 (см.код и в некоторых других местах ) не хватает libcomdlg32.a




C++
1
2
 //lpofn->lCustData = NULL;
    lpofn->lCustData = 0;
Добавлено через 58 секунд
Code
1
2
3
4
/*you must link against comdlg32.lib (if you use Microsoft compiler) or libcomdlg32.a if you use MinGW.
 
Project -> Build options -> Linker settings -> Add and either write manually library name or browse for the file.
*/
Добавлено через 37 секунд
там такого нет(64 -битка).
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
09.11.2019, 19:10  [ТС]
Выбираю для него
Code
1
 #include <iostream>



Выдает
Code
1
Undefined reference to 'GetOpenFileNameA@4'

Без диалога открытия файла может работать, но нужно строчку и кнопку для файла приделать

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
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
//add  libcomdlg32.a
/*
 
MinGWliblibcomdlg32.a
 
As webjose said, you must link against comdlg32.lib (if you use Microsoft compiler) or libcomdlg32.a if you use MinGW.
 
Project -> Build options -> Linker settings -> Add and either write manually library name or browse for the file.
*/
/************************************************************************/
 
 
//#define NULL ((void*)0)
 
void LoadToBuffer(void)
{
    HWND Dlg = GetActiveWindow();
    TCHAR szFile[MAX_PATH] = "\0";
     TCHAR szErr[200] = "\0";
    OPENFILENAME* lpofn;
     
    DWORD bc=0, d=0;
    HANDLE file=INVALID_HANDLE_VALUE;
    if (Edited)
        if (MessageBox(Dlg, "Data nor saved. Continue ?", lpProjName, MB_YESNO) == IDNO)
            goto Ex;
            
            /*
    lpofn=(OPENFILENAME*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(OPENFILENAME));
    lpofn->lpstrTitle = "Open file";
    lpofn->lStructSize = sizeof(OPENFILENAME);
    lpofn->hwndOwner = Dlg;
    lpofn->hInstance = NULL;
    lpofn->lpstrFilter = "Snapshots (*.bin)\0*.bin\0All files (*.*)\0*.*\0\0";
    lpofn->lpstrCustomFilter = NULL;
    lpofn->nMaxCustFilter = 0;
    lpofn->nFilterIndex = 0;
    lpofn->lpstrInitialDir = NULL;
    lpofn->Flags = OFN_SHOWHELP | OFN_EXPLORER | OFN_HIDEREADONLY;
    lpofn->lpfnHook = NULL;
    lpofn->lpTemplateName = NULL;
    lpofn->lpstrDefExt = NULL;
    lpofn->nFileExtension = 0;
    lpofn->nFileOffset = 0;
    lpofn->nMaxFile = sizeof(szFile);
    lpofn->lpstrFile = szFile;
    lpofn->nMaxFileTitle = 0;
    lpofn->lpstrFileTitle = NULL;
   lpofn->lCustData = NULL;
    lpofn->lCustData = 0;
    GetOpenFileName(lpofn);
    d = CommDlgExtendedError();
    if (d)
        SetDlgItemInt(Dlg, IDC_STATUS, d, false);
    else
        SetDlgItemText(Dlg, IDC_STATUS, szFile);
    if (!strlen(szFile))
        goto Ex;
        
        */
        
 
    file=CreateFile(szFile, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(file==INVALID_HANDLE_VALUE) 
    {
        MessageBox(Dlg, "Could not open file", lpProjName, MB_OK);
        goto Ex;
    }
 
    ReadFile(file, DAT, lpSize, &bc, NULL);
    Edited = false;
Ex:;
   if (file != INVALID_HANDLE_VALUE)
        CloseHandle(file);
        
    HeapFree(GetProcessHeap(), 0, lpofn);
}
 
 
void SaveBuffer(void)
{
    HWND Dlg = (HWND) GetActiveWindow();
    TCHAR szFile[MAX_PATH] = "\0";
    TCHAR szErr[200] = "\0";
    OPENFILENAME* lpofn;
    DWORD d;
    HANDLE file=INVALID_HANDLE_VALUE;
    DWORD bc;
    
    /*
    lpofn=(OPENFILENAME*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(OPENFILENAME));
    lpofn->lpstrTitle = "Save to file";
    lpofn->lStructSize = sizeof(OPENFILENAME);
    lpofn->hwndOwner = Dlg;
    lpofn->hInstance = NULL;
    lpofn->lpstrFilter = "Snapshots (*.bin)\0*.bin\0Files (*.*)\0*.*\0\0";
    lpofn->lpstrCustomFilter = NULL;
    lpofn->nMaxCustFilter = 0;
    lpofn->nFilterIndex = 0;
    lpofn->lpstrInitialDir = NULL;
    lpofn->Flags = OFN_SHOWHELP | OFN_EXPLORER | OFN_HIDEREADONLY;
    lpofn->lpfnHook = NULL;
    lpofn->lpTemplateName = NULL;
    lpofn->lpstrDefExt = "bin";
    //lpofn->lpstrDefExt = NULL;
    lpofn->nFileExtension = 0;
    lpofn->nFileOffset = 0;
    lpofn->nMaxFile = sizeof(szFile);
    lpofn->lpstrFile = szFile;
    lpofn->nMaxFileTitle = 0;
    lpofn->lpstrFileTitle = NULL;
   lpofn->lCustData = 0;   
     lpofn->lCustData = NULL;
    GetSaveFileName(lpofn);
    d = CommDlgExtendedError();
    if (d)
        SetDlgItemInt(Dlg, IDC_STATUS, d, true);
    else
        SetDlgItemText(Dlg, IDC_STATUS, szFile);
    if (!strlen(szFile))
        goto Ex;
 */
    file = CreateFile(szFile, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
    if(file == INVALID_HANDLE_VALUE) 
    {
       MessageBox(Dlg, "Could not open file", lpProjName, MB_OK);
        goto Ex;
    }
    WriteFile(file, DAT, lpSize, &bc, NULL);
    Edited = false;
Ex:;
    if (file != INVALID_HANDLE_VALUE)
        CloseHandle(file);
}
 
/****************************************************/
Добавлено через 1 минуту
имя файла szFile можно приделать и вручную

Добавлено через 1 час 1 минуту
C++
1
wc.hbrBackground = (HBRUSH)  COLOR_WINDOW ;
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
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
#define MinGW_mode 1
 
//add  libcomdlg32.a
/*
 
MinGWliblibcomdlg32.a
 
As webjose said, you must link against comdlg32.lib (if you use Microsoft compiler) or libcomdlg32.a if you use MinGW.
 
Project -> Build options -> Linker settings -> Add and either write manually library name or browse for the file.
*/
/************************************************************************/
 
 
 
 
void LoadToBuffer(void)
{
    HWND Dlg = GetActiveWindow();
    TCHAR szFile[MAX_PATH] = "\0123";
     TCHAR szErr[200] = "\0";
    OPENFILENAME* lpofn;
     
    DWORD bc=0, d=0;
    HANDLE file=INVALID_HANDLE_VALUE;
    if (Edited)
        if (MessageBox(Dlg, "Data nor saved. Continue ?", lpProjName, MB_YESNO) == IDNO)
            goto Ex;
            
#ifndef  MinGW_mode
    lpofn=(OPENFILENAME*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(OPENFILENAME));
    lpofn->lpstrTitle = "Open file";
    lpofn->lStructSize = sizeof(OPENFILENAME);
    lpofn->hwndOwner = Dlg;
    lpofn->hInstance = NULL;
    lpofn->lpstrFilter = "Snapshots (*.bin)\0*.bin\0All files (*.*)\0*.*\0\0";
    lpofn->lpstrCustomFilter = NULL;
    lpofn->nMaxCustFilter = 0;
    lpofn->nFilterIndex = 0;
    lpofn->lpstrInitialDir = NULL;
    lpofn->Flags = OFN_SHOWHELP | OFN_EXPLORER | OFN_HIDEREADONLY;
    lpofn->lpfnHook = NULL;
    lpofn->lpTemplateName = NULL;
    lpofn->lpstrDefExt = NULL;
    lpofn->nFileExtension = 0;
    lpofn->nFileOffset = 0;
    lpofn->nMaxFile = sizeof(szFile);
    lpofn->lpstrFile = szFile;
    lpofn->nMaxFileTitle = 0;
    lpofn->lpstrFileTitle = NULL;
   lpofn->lCustData = NULL;
 
    GetOpenFileName(lpofn);
    d = CommDlgExtendedError();
    if (d)
        SetDlgItemInt(Dlg, IDC_STATUS, d, false);
    else
        SetDlgItemText(Dlg, IDC_STATUS, szFile);
    if (!strlen(szFile))
        goto Ex;
#endif
        
  
        
#ifdef MinGW_mode  
        
     // SetDlgItemText(Dlg, IDC_FNAME,  "temp.bin" );
            
         GetDlgItemText(Dlg, IDC_FNAME,   szFile   , MAX_PATH);     
         MessageBox(Dlg, szFile, lpProjName, MB_OK);
         
         
       SetDlgItemText(Dlg, IDC_FNAME,  szFile );     
   
 #endif  
   
         
    file=CreateFile( szFile, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if(file==INVALID_HANDLE_VALUE) 
    {
        MessageBox(Dlg, "Could not open file", lpProjName, MB_OK);
        goto Ex;
    }
 
    ReadFile(file, DAT, lpSize, &bc, NULL);
    Edited = false;
Ex:;
   if (file != INVALID_HANDLE_VALUE)
        CloseHandle(file);
#ifndef  MinGW_mode         
  HeapFree(GetProcessHeap(), 0, lpofn);
#endif  
}
 
 
void SaveBuffer(void)
{
    HWND Dlg = (HWND) GetActiveWindow();
    TCHAR szFile[MAX_PATH] = "\0";
    TCHAR szErr[200] = "\0";
    OPENFILENAME* lpofn;
    DWORD d;
    HANDLE file=INVALID_HANDLE_VALUE;
    DWORD bc;
    
#ifndef MinGW_mode
    lpofn=(OPENFILENAME*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(OPENFILENAME));
    lpofn->lpstrTitle = "Save to file";
    lpofn->lStructSize = sizeof(OPENFILENAME);
    lpofn->hwndOwner = Dlg;
    lpofn->hInstance = NULL;
    lpofn->lpstrFilter = "Snapshots (*.bin)\0*.bin\0Files (*.*)\0*.*\0\0";
    lpofn->lpstrCustomFilter = NULL;
    lpofn->nMaxCustFilter = 0;
    lpofn->nFilterIndex = 0;
    lpofn->lpstrInitialDir = NULL;
    lpofn->Flags = OFN_SHOWHELP | OFN_EXPLORER | OFN_HIDEREADONLY;
    lpofn->lpfnHook = NULL;
    lpofn->lpTemplateName = NULL;
    lpofn->lpstrDefExt = "bin";
     lpofn->lpstrDefExt = NULL;
     
    lpofn->nFileOffset = 0;
    lpofn->nMaxFile = sizeof(szFile);
    lpofn->lpstrFile = szFile;
    lpofn->nMaxFileTitle = 0;
    lpofn->lpstrFileTitle = NULL;
    
     lpofn->lCustData = NULL;
    GetSaveFileName(lpofn);
    d = CommDlgExtendedError();
    
    
    if (d)
        SetDlgItemInt(Dlg, IDC_STATUS, d, true);
    else
        SetDlgItemText(Dlg, IDC_STATUS, szFile);
    if (!strlen(szFile))
        goto Ex;
        
        
        
#endif
 
 #ifdef MinGW_mode
 
 //for MinGW
       //  SetDlgItemText(Dlg, IDC_FNAME,  "temp1.bin" );  
        GetDlgItemText(Dlg, IDC_FNAME,   szFile   , MAX_PATH);
        
         MessageBox(Dlg, szFile, lpProjName, MB_OK);
         
         
         
       SetDlgItemText(Dlg, IDC_FNAME,  szFile );
 
 #endif 
 
    file = CreateFile(szFile, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
    if(file == INVALID_HANDLE_VALUE) 
    {
       MessageBox(Dlg, "Could not open file", lpProjName, MB_OK);
        goto Ex;
    }
    WriteFile(file, DAT, lpSize, &bc, NULL);
    Edited = false;
Ex:;
    if (file != INVALID_HANDLE_VALUE)
        CloseHandle(file);
}
 
/****************************************************/
Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
//in the main.cpp
 
 CreateWindowEx(WS_EX_CLIENTEDGE, "Edit",TEXT("Port is closed "),WS_CHILD | WS_VISIBLE |  SS_CENTER|ES_READONLY,
  300,480, 360, 20,hWnd, (HMENU)IDC_STATUS, hInstance, NULL); 
  
  #ifdef MinGW_mode
//for MinGW
CreateWindow("STATIC","File:",WS_VISIBLE | WS_CHILD | SS_LEFT, 240,520,30,20,hWnd,NULL,hInstance,NULL);
 CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "temp.bin", WS_CHILD | WS_VISIBLE |WS_TABSTOP|  ES_AUTOHSCROLL, 
   300,520, 330, 25, hWnd, ( HMENU)IDC_FNAME, hInstance, NULL);
#endif
resource.h
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
#define IDC_SELECTSTOPB    1075
#define IDC_SELECTBAUD      1076
#define IDC_PDOWN                  1077
#define IDC_PB                          1078
#define IDC_SPEED                   1079
 
#define IDC_DAT                         1001
#define IDC_ADR                         1002
#define IDC_STATUS                      1063  //status bar
#define IDC_FNAME 1059
 
#define IDC_CHECKBUF                    1027     //checksum window
#define IDC_CHECKSUM                    1028    //checksum window
 
#define IDC_EDSTR                    1004
#define IDC_EDIT2                      1006
#define IDC_BYTEEDSTR            1005
 
#define IDC_CS                           1050  //checksum window
 
#define IDC_LOADFILE                    1098  //for dialog
#define IDC_LOADED                       1099   //for dialog
 
 
#define  IDC_BAUDSEL1                    1094
#define IDC_ENABLE_ADV_DEV        1095
 
#define IDC_READALL                          1010  //read IC
#define IDC_WRITEBUFF                      1011//Write to IC
#define IDC_ISCLEAR                           1012  //Check clear?
#define IDC_CLEARALL                       1013  //erase chip
#define IDC_LOADBUFFER                  1014  //file to buffer
#define IDC_SAVEBUFFER                    1015  //buffer tofile
#define IDC_COMPARE                         1016
 
 
#define IDC_A0                          1017
#define IDC_A1                          1018
 
#define IDC_CLEARRGN                    1021 // Region 
#define IDC_CLEARSTR                     1022 // String 
#define IDC_CLEARBUFF                   1023//All buffer
#define IDC_FILL                                 1024
 
 
#define IDC_PORTNUM                  1044
#define IDC_CHOOSEDEV             1045
#define IDC_LISTDEV                     1046
 
#define IDC_START                       1047
#define IDC_FINISH                      1048
 
#define IDC_SAVESTR                     1030  //save string button
 
#define IDC_FROM                    1051 //box from 
#define IDC_TO                          1052 //box to
 
#define IDC_GETID                            1080            
 
 
#define IDI_ICON 1091
#define MyIcon 100001
Добавлено через 2 часа 2 минуты
Для повышения устойчивости можно (как и в некоторых документах принято ) передавать блок по 16 байт, а не по 32 (тогда исчезает совместимость с программой MAVR) , вычислять контрольную сумму , изменить протокол передачи данных , ввести прерывание по приему от UART, сменить кварцевый резонатор (на 8 МГц, 4МГц и другие ), понизить бодность до 9600 бод в прошивке (понизится быстродействие ) , пересчитать программы задержки , ввести 2 стопбита ,если надо (при >38400 бод ).

Добавлено через 5 часов 56 минут
Исправить подпрограммы задержки при программировании для C00,C0,C1,C2 , учесть , что некоторые из них используют некоторые регистры , которые задействованы, поэтому их переписать , на 1 мкс, 55 мс сделать программы , не использующие временные регистры наших программ .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
09.11.2019, 21:37  [ТС]
Один из вариантов программы и исходники прошивки к нему , фьюзы как у предыдущих . Еще не пробовал , но что-то там надо поменять .
Вложения
Тип файла: zip aMAVR1_w27_m27_8_N_1.zip (1.42 Мб, 14 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.11.2019, 15:30  [ТС]
Убрать в исходниках диагностический вызов подпрограммы чтения и скомпилировать , добавить еще некоторые модули

C++
1
2
3
4
5
6
7
8
;Main program
Main:
 
 ; убрать строчку с 
; rjmp DoM27512_ReadPageC3
 
    rcall   GetChar
    mov     CMD, temp0

Вообще-то уже пора на ATMEGA16A,ATMEGA8A/48A +74HC595,74HC597 применять ( недостаток : там UART на неудобные выводы подключен , с программными SPI на ввод и на вывод, с управлением Z-состоянием можно ).

Добавлено через 2 часа 31 минуту
Переписать модули на переместимом (при необходимости изменяя подпрограммы ) языке , назначить портам на ввод, на вывод, регистрам направления псевдообозначения , устранить ошибку DDRD (путают с PORTD ) .

Добавлено через 25 минут
Подумать над необходимостью переделки процедуры приема символа на работающую по прерыванию от порта RXD ( с выключением (cli) прерывания на время обработки символа и включением прерывания (sei) после выполнения программы и перехода в состояние готовности приема байта ) .

Добавлено через 3 минуты
Исправить таблицу векторов рестарта, разместить первую программу после рестарта после всех векторов прерываний (например с 0x020) :

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
;------------------------------------------------------------------------------------------
;********************************************************************
;* Interrupt table  ;ENG;* Interrupt table
;********************************************************************
.cseg
;------------------------------------------------------------------------------------------
.org 0x000                      ;reset
    rjmp    Reset
  ; fix for MCU type 
.org IntVectUART_RX
       rjmp  RXChar
;------------------------------------------------------------------------------------------
; fix for MCU type
.org 0x020
Reset:      
    ;инициализация переменных, порта
    ldi     temp0, HIGH(StackBegin) ;указатель стека на конец памяти
    out     SPH, temp0
    ldi     temp0, LOW(StackBegin)
    out     SPL, temp0    
    rcall   PortInit
                  rcall           UART_Init      
                  rcall Del_100mks  
                  rjmp Main;
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.11.2019, 19:00  [ТС]
Пробные исходники с поддержкой винбондовских, 563РЕ2, 556РТ7,РТ5,РТ4, 155РЕ3 . Еще не тестировал. Проверить в дебаггере .
Вложения
Тип файла: zip MAVRW27plus1_4_debug.zip (61.0 Кб, 9 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.11.2019, 19:49  [ТС]
Для РТ4,РТ5,РТ7 -х адаптер может быть аналогичный по принципу действия адаптеру, как в схеме из интернета на старой ВЕ-шке(тут на соседние форумы запрещают ссылаться , погуглить ).
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.11.2019, 19:52  [ТС]
P1.0-P1.7 в качестве данных для чтения, с 74HC595/74HC597-ми регистрами это можно сделать правильнее (с доработкой) .
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
10.11.2019, 21:28  [ТС]
Приблизительный вариант приложения и прошивки к нему (шаблон ):
Вложения
Тип файла: zip aMAVR1_w27_8_N_1_RTtest.zip (216.3 Кб, 18 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
11.11.2019, 21:13  [ТС]
Для работы 74HC595, 74HC165,ATMEGA8, расширенными адресами других ПЗУ могут потребоваться следующие атомарные подпрограммы с их адаптацией :
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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
;for ATMEGA8A  and 
;
;PB0=14=ADR_MOSI
;PB1=15=ADR_nOE
;PB2=16=ADR_nLATCH
;PB3=17=ADR_CLK
;PB4=18=DATA_nLATCH2 (ST_CP, 1= store, 0  = load data to latch)
;PB5=19=DATA_CLK2    (SH_CP, 0->1 shift)
;
;PC0=23=DATA_nOE (OE)
;PC1=24=DATA_MISO1  (first data port input)  
;PC2=25=DATA_nLATCH (ST_CP, 1= store, 0  = load data to latch)
;PC3=26=DATA_MOSI
;PC4=27=DATA_CLK1   (SH_CP, 0->1 shift)
;PC5=28=DATA_MISO2   (second data port input)
;
;
;PD5=11=nV
;PD6=12=nCS
;PD7=13=Vpp
;
;
;PD4=6=RD
;PD3=5=WR
;PD2=4=IORQ
;
 
 
 
 
 
.equ  DEVICE_ADR_PORT =PORTB
.equ  DEVICE_ADR_DDR  =DDRB
.equ  DEVICE_ADR_PIN  =PINB
  
 
.equ  DEVICE_ADR_MOSI =0 ; PB0  out
.equ DEVICE_ADR_nOE = 1  ; PB1 out
.equ DEVICE_ADR_nLD  =2  ; PB2 out
.equ  DEVICE_ADR_CLK  =3 ; PB3 out
 
.equ  DEVICE_DATA_PORT0 =PORTC
.equ  DEVICE_DATA_PIN0 = PINC
.equ  DEVICE_DATA_DDR0 = DDRC
 
.equ  DEVICE_DATA_PORT1 =PORTB
.equ  DEVICE_DATA_PIN1  =PINB
.equ  DEVICE_DATA_DDR1 = DDRB
 
 
  
 
.equ  DEVICE_DATA_nOEWR =0 ;PC0      // out   pin 23
.equ  DEVICE_DATA_MISO1  =1 ;PC1      // input pin 24
.equ DEVICE_DATA_nLATCH=2  ;PC2      // out   pin 25 
.equ DEVICE_DATA_MOSI   =3 ;PC3      // out   pin 26    
.equ DEVICE_DATA_CLK1   =4 ;PC4      // out   pin 27
.equ DEVICE_DATA_MISO2  =5 ; PC5      // input
 
.equ DEVICE_DATA_nLATCH2 =PB4 ;     // out , pin 18  
.equ DEVICE_DATA_CLK2    =PB5     ; // out , pin 19
 
.equ DEVICE_CONTROL_PORT= PORTD
.equ  DEVICE_CONTROL_DDR = DDRD
.equ  DEVICE_CONTROL_PIN  =PIND
 
 
 
;fix it 
.equ DEVICE_CONTROL_IORQ PD2 
.equ DEVICE_CONTROL_RD   PD3
.equ DEVICE_CONTROL_WR   PD4
 
.equ DEVICE_CONTROL_nV   PD5  //out , pin 11
.equ DEVICE_CONTROL_nCS PD6 //out,  pin 12
.equ DEVICE_CONTROL_Vpp PD7 //out , pin 13
 
 
 
 
 ControlInit:                                                
             ;   DDRD 0b11111100
             ldi temp0, 0xFC
             out DEVICE_CONTROL_DDR , temp0
              
              ldi temp0, 0x60
              out DEVICE_CONTROL_PORT 
        ret
 
 
 
 IOP_init:
 
 
;init 74HC595N address output port
;output
 
; out nOE adr, out clock,out data MOSI, out latch
 
  
ldi temp0, 0b00111111
out DEVICE_ADR_DDR, temp0
sbi DEVICE_ADR_PORT,DEVICE_ADR_nOE
sbi DEVICE_ADR_PORT,DEVICE_ADR_nLD
; set output low
cbi   DEVICE_ADR_PORT,DEVICE_ADR_CLK
cbi   DEVICE_ADR_PORT,DEVICE_ADR_MOSI    
                           
 
;init 74HC595N data output port
     
; out clock, out latch, out data MOSI, out data nOE_WR
 
sbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH
sbi DEVICE_DATA_PORT0, DEVICE_DATA_nOEWR
 
;set output low
cbi DEVICE_DATA_PORT0 ,DEVICE_DATA_CLK1 
cbi DEVICE_DATA_PORT0, DEVICE_DATA_MOSI 
;output
 
 
ldi temp0 , 0b00011101
out DEVICE_DATA_DDR0, temp0
     
 
; init 74HC165N data input port
    
 sbi  DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH
 cbi  DEVICE_DATA_PORT0, DEVICE_DATA_CLK1
 cbi DEVICE_DATA_PORT1, DEVICE_DATA_CLK2 
 sbi DEVICE_DATA_PORT1, DEVICE_DATA_nLATCH2
 
 ldi temp0, 0b00110000
 out DEVICE_DATA_DDR1, temp0 
    
;set MISO1, MISO2 low
cbi DEVICE_DATA_PORT0 ,DEVICE_DATA_MISO1 
cbi DEVICE_DATA_PORT0, DEVICE_DATA_MISO2 
ret
 
 OfflineAddrLatch:
 sbi  DEVICE_DATA_PORT0, DEVICE_ADR_nOE 
 ret
 
AddressLatchEnable: 
cbi  DEVICE_ADR_PORT,DEVICE_ADR_nOE 
ret
 
OfflineDataLatch:
sbi  DEVICE_DATA_PORT0, DEVICE_DATA_nOEWR 
ret 
 
DataLatchEnable: 
cbi  DEVICE_DATA_PORT0, DEVICE_DATA_nOEWR 
ret
 
LockData:
 
 cbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH 
 rcall delay_10t
 sbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH 
ret 
 
LockAddress:
cbi DEVICE_ADR_PORT, DEVICE_ADR_nLD 
rcall delay_10t
sbi DEVICE_ADR_PORT, DEVICE_ADR_nLD 
ret
 
SendCLK_ADR:
 
     
sbi  DEVICE_ADR_PORT , DEVICE_ADR_CLK 
rcall delay_10t
cbi DEVICE_ADR_PORT, DEVICE_ADR_CLK  
ret
 
 SendCLK1_DATA:
    
sbi  DEVICE_DATA_PORT, DEVICE_DATA_CLK1  ;   get next
rcall delay_10t                   
cbi  DEVICE_DATA_PORT, DEVICE_DATA_CLK1 
ret 
 
 SendCLK2_DATA:
    
sbi DEVICE_DATA_PORT1,DEVICE_DATA_CLK2  ;   get next
rcall delay_10t                    
cbi DEVICE_DATA_PORT1, DEVICE_DATA_CLK2 ;
ret
 
 
 
ClearAddrPort_MOSI:
cbi DEVICE_ADR_PORT, DEVICE_ADR_MOSI 
ret
 
SetAddrPort_MOSI:
sbi DEVICE_ADR_PORT, DEVICE_ADR_MOSI 
ret
 
 
ClearDataPort_MOSI:
cbi DEVICE_DATA_PORT0, DEVICE_DATA_MOSI 
ret
 
SetDataPort_MOSI:
sbi DEVICE_DATA_PORT0, DEVICE_DATA_MOSI 
ret
 
.macro SendAddrBit                
                 rcall ClearAddrPort_MOSI
                 mov temp0 , @0 
                 andi  temp0 , @1
                 cpi  temp0, 0x00 
                 brne  SetAddrPort_MOSI
                 nop
                 nop
                 nop
                 nop                
                 rcall SendCLK_ADR     
endmacro 
 
 
.macro SendDataBit                
                 rcall ClearDataPort_MOSI
                 mov temp0 , @0  ; load byte
                 andi  temp0 , @1 ; and with mask 
                 cpi  temp0, 0x00  ; compare with 0 
                 brne  SetDataPort_MOSI ; branch if temp0 <> 0 
                 nop
                 nop
                 nop
                 nop                
                 rcall SendCLK1_DATA     
endmacro 
 
 
 
 ShiftByteAdr :
 
; LSB Last , to QA of chip 1
 
SendAddrBit   tmpbyte , 0x80
SendAddrBit   tmpbyte ,0x40
SendAddrBit   tmpbyte ,0x20
SendAddrBit   tmpbyte ,0x10
SendAddrBit   tmpbyte ,0x08
SendAddrBit   tmpbyte ,0x04
SendAddrBit   tmpbyte ,0x02
SendAddrBit   tmpbyte ,0x01
 
 ret
 
 ShiftByteDataOut:
 
 
SendDataBit    tmpbyte, 0x80 
SendDataBit    tmpbyte, 0x40 
SendDataBit    tmpbyte, 0x20 
SendDataBit    tmpbyte, 0x10 
SendDataBit    tmpbyte, 0x08
SendDataBit    tmpbyte, 0x04 
SendDataBit    tmpbyte, 0x02 
SendDataBit    tmpbyte, 0x01
 
ret
 
 
 
SendAddr:
      
    rcall OfflineAddrLatch 
 
     mov tmpbyte, AH
                   ShiftByteAdr   ; send A15-A8
                   mov tmpbyte, AL
                   ShiftByteAdr   ; send A7-A0 
     rcall LockAddress 
     rcall AddressLatchEnable 
ret
 
SendDataByte:
 
     rcall OfflineDataLatch 
                   mov  tmpbyte , send_byte  ;  byte  to send, fix 
     rcall ShiftByteDataOut ;  high byte first
     rcall LockData 
     rcall DataLatchEnable  ; SetDB_As_Output 
ret
 
 
ReadData_bit:
 
    ; rcall OfflineDataLatch  
     delay_10t
                   clr temp0   ;  default 
                   sbic DEVICE_DATA_PIN0, DEVICE_DATA_MISO1
                   ldi temp0,0x01   ; skip if clear 
                
ret
 
 ReadData_bit1:
 
    ;  rcall OfflineDataLatch 
      delay_10t 
      clr temp0
      sbic DEVICE_DATA_PIN0, DEVICE_DATA_MISO2 
                    ldi temp0,0x01   ; skip if clear
       
ret
 
;left shift << x << y all bits in x shifted left y bits
 
 
 
 
ReadDataByte:
 
    ;LSB last
     rcall OfflineDataLatch 
  
     cbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH ; 0 to 1 - load
      delay_10t
                    delay_10t
                    delay_10t
     sbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH ; 1 to PL - ready to shift
 
 
 
 
ReadData_bit  ; 7
clr data
or  data, temp0       ; read 7 bit to bit 0  ,append tempbyte
 
SendCLK1_DATA ; shift 
ReadData_bit ; 6
rol data ; shift left  ; previous bit  0->1
or  data, temp0      ; read 6 bit to bit 0  ,append tempbyte
 
SendCLK1_DATA  ; shift 
ReadData_bit ; 5
rol data ; shift left  ; previous bit 1->2
or  data, temp0       ; read 5 bit to bit 0  ,append tempbyte
 
SendCLK1_DATA
ReadData_bit ; 4
rol data ; shift left  ; previous bit  2->3
or  data, temp0      ; read 4 bit to bit 0  , append tempbyte
 
 
SendCLK1_DATA
ReadData_bit ; 3 
rol data ; shift left  previous bit  3->4
or  data, temp0   ; read 3 bit to bit 0  , append tempbyte
 
 
 
 
SendCLK1_DATA
ReadData_bit; 2 
rol data ; shift left ; previous bit  4->5
or  data, temp0  ; read 2 bit to bit 0  , append tempbyte
 
SendCLK1_DATA
ReadData_bit ; 1
rol data               ; shift left  previous bit  5->6
or  data, temp0  ; read 1 bit to bit 0  , append tempbyte
SendCLK1_DATA
ReadData_bit ; 0 
rol data ; shift left ; previous bit  6->7   
or  data, temp0       ; read 0 bit to bit 0  , append tempbyte    Ok
 
;data is the result
 ret
 
 
 ReadDataByte1:
  
    ; LSB last
     rcall OfflineDataLatch 
     
 
     cbi  DEVICE_DATA_PORT1,DEVICE_DATA_nLATCH2 ;   0 to 1 - load
     delay_10t;
                   delay_10t;
                   delay_10t;  
     sbi DEVICE_DATA_PORT1, DEVICE_DATA_nLATCH2 ;   1 to PL - ready to shift
      
 
 
ReadData_bit1  ; 7
clr data
or  data, temp0       ; read 7 bit to bit 0  ,append  byte
 
SendCLK2_DATA; shift 
ReadData_bit1 ; 6
rol data ; shift left  ; previous bit  0->1
or  data, temp0      ; read 6 bit to bit 0  ,append  byte
 
SendCLK2_DATA  ; shift 
ReadData_bit1 ; 5
rol data ; shift left  ; previous bit 1->2
or  data, temp0       ; read 5 bit to bit 0  ,append  byte
 
SendCLK2_DATA
ReadData_bit1 ; 4
rol data ; shift left  ; previous bit  2->3
or  data, temp0      ; read 4 bit to bit 0  , append  byte
 
 
SendCLK2_DATA
ReadData_bit1 ; 3 
rol data ; shift left  previous bit  3->4
or  data, temp0   ; read 3 bit to bit 0  , append  byte
 
SendCLK2_DATA
ReadData_bit1; 2 
rol data ; shift left ; previous bit  4->5
or  data, temp0  ; read 2 bit to bit 0  , append  byte
 
SendCLK2_DATA
ReadData_bit1 ; 1
rol data               ; shift left  previous bit  5->6
or  data, temp0  ; read 1 bit to bit 0  , append  byte
SendCLK2_DATA
ReadData_bit1 ; 0 
rol data ; shift left ; previous bit  6->7   
or  data, temp0       ; read 0 bit to bit 0  , append  byte    Ok
 
;data is the result , fix 
 
ret
  
 
;*****************************************
 
SetDB_As_Input:
 rcall OfflineDataLatch 
ret 
 
 
SetDB_As_Output : 
rcall  DataLatchEnable 
ret
 
 
 
SetAdrBusOut:
 rcall AddressLatchEnable:
ret
Миниатюры
Доработка программатора MAVR для работы с W27 С 512-45Z  
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
11.11.2019, 21:19  [ТС]
Можно переделать этот старый сырой проект для ATMEGA8A c Си++ на ассемблер (компактнее, менее переместимый ) и адаптировать под нашу программу, введя раздельные регистры чтения и записи, три байта адреса для некоторых ПЗУ. Это недостаточно стабильно .
Вложения
Тип файла: zip usart1.zip (507.4 Кб, 9 просмотров)
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
13.11.2019, 22:04  [ТС]
На более универсальном языке с макросами (может использоваться с ATMEGA8A ):



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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
.equ   AddrH_PortDirW27    =DDRB
.equ   AddrH_PortW27    =PORTB
.equ   AddrL_PortDirW27  =DDRC
.equ   AddrL_PortW27  =PORTC
 
;.equ   DataIn_PortW27 = PINA
;.equ   DataOut_PortW27   =PORTA
;.equ   DataIO_DirW27    =DDRA 
 
.equ  CtrlPort_W27 =PORTD
.equ  CtrlPort_DirW27 =DDRD
 
;W27C512
 
.equ nCE_C3W =4 ; pin 20 
.equ  Vpe_C3W=5 
.equ nOEVppW_C3  =6 ;  pin 22 to switch nOE/Vpp 
.equ PWR_C3W  =7  
 
 
 
.equ W27C512_CompSID= 0xDA
.equ W27C512_DevSID =0x08
 
.equ W27C512_HiAdrId0= 0x00 
.equ W27C512_LowAdrId0 =0x00 
.equ W27C512_HiAdrId1= 0x00 
.equ W27C512_LowAdrId1 = 0x01
 
 
;*************************************
 
 
DoW27C512ReadPageC3:  
 
 
  
    rcall   W27C512_ReadPage
    rjmp    Main
;--------------------------------------------------------------------------
 DoW27C512GetCS_C3:  
 
     
     
    rcall   W27C512_GetCS
    rjmp    Main
;--------------------------------------------------------------------------
DoW27C512IsClear_C3:  
  
    
    rcall   W27C512_IsClear
    rjmp    Main
;--------------------------------------------------------------------------
DoM27C512WriteC3:  
 
     
    
    rcall   W27_WriteBuffer
    rjmp    Main
 
 
DoW27C512EraseSub:
     
    rcall   W27C512_EraseSub
    rjmp    Main
 
 
 
;-----------------------------------------------------------------
 
 
 
 
 
 
 
 
.macro CtrlPort_W27_C3W_TurnOffVppVpe 
 cbi CtrlPort_W27, Vpe_C3W
 cbi CtrlPort_W27, nOEVppW_C3
 
.endmacro
 
.macro CtrlPort_W27_TurnOnPWR_C3W 
cbi CtrlPort_W27, PWR_C3W ; Vcc=5V
.endmacro
 
.macro SetCtrlPort_W27_nCE_C3W
 
sbi CtrlPort_W27, nCE_C3W
.endmacro 
 
.macro ClearCtrlPort_W27_nCE_C3W
 
cbi CtrlPort_W27, nCE_C3W
.endmacro 
 
 
 
.macro TurnOnVpp12V_W27_C3
 cbi CtrlPort_W27, Vpe_C3W 
 sbi CtrlPort_W27,   nOEVppW_C3 ;set +12В Vpp
 
.endmacro 
 
 
.macro TurnOnVpe14V_W27_C3
 sbi CtrlPort_W27, nOEVppW_C3    ; turn off +14V  on nOE/Vpp 
 sbi CtrlPort_W27, Vpe_C3W   ; turn off +14V  on nOE/Vpp 
 
.endmacro
 
 
.macro TurnOffVpe_W27_C3
 cbi        CtrlPort_W27,  Vpe_C3W   ; turn off  Vpe 
 .endmacro 
 
 
.macro TurnOff_nOEVppW27_C3
 cbi        CtrlPort_W27,  nOEVppW_C3
.endmacro 
 
 
 
 
;--------------------
 
W27C512_ReadPage:
 
                 
 CtrlPort_W27_C3W_TurnOffVppVpe 
 CtrlPort_W27_TurnOnPWR_C3W ; Vcc=5V  ;  
 SetCtrlPort_W27_nCE_C3W
 
 
     
 rcall SetAdrBusOut
 rcall SetDB_As_Input
 
 ldi ADDR_LOW, 0             
 rcall Del_1ms
               
 
W27_RPNext:
     
SetCtrlPort_W27_nCE_C3W
  
 mov  AHtemp, ADDR_HI    
 mov  ALtemp , ADDR_LOW
 rcall SendAddr
 
 rcall Del_100mks 
 
 ClearCtrlPort_W27_nCE_C3W
 rcall Del_100mks   
 
 rcall  ReadDataByte ; to the  temp0
 rcall Del_100mks
SetCtrlPort_W27_nCE_C3W
    rcall   SendChar     
    
 
    cpi  ADDR_LOW, 0xFF
    breq    W27_RPEnd
    inc  ADDR_LOW 
    rjmp    W27_RPNext
W27_RPEnd:
         
 
    ret
 
;-----------------------------------------------------------------
W27C512_IsClear:
                  
 CtrlPort_W27_C3W_TurnOffVppVpe                
 CtrlPort_W27_TurnOnPWR_C3W ; Vcc=5V 
 SetCtrlPort_W27_nCE_C3W    
 rcall SetAdrBusOut
 rcall SetDB_As_Input
 
 mov XH, ADDR_HI     ;   
 mov XL, ADDR_LOW ;  
 clr YH
 clr YL
                  
          
 
 
 rcall Del_1ms
     
    
W27_ICNext27:
     
SetCtrlPort_W27_nCE_C3W
 rcall  Del_10t
 
 mov  AHtemp, YH     
 mov  ALtemp , YL
 rcall SendAddr 
 
 rcall Del_100mks 
ClearCtrlPort_W27_nCE_C3W
 
 rcall  Del_100mks 
 rcall  ReadDataByte ; to the  temp0
 rcall Del_100mks 
 
SetCtrlPort_W27_nCE_C3W
 rcall Del_100mks 
    cpi  temp0, 0xFF
    brne    W27_NotClear27   
    adiw    YH:YL, 1     
    sbiw    XH:XL, 1
    brne    W27_ICNext27
    ldi  temp2, 0x43     
 
W27_ICEnd27:
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
 
 
    ret  
W27_NotClear27:
    ldi             temp2, 0x44  ; not clear
    rjmp    W27_ICEnd27
;-----------------------------------------------------------------
 
W27C512_GetCS:
 
CtrlPort_W27_C3W_TurnOffVppVpe                
 CtrlPort_W27_TurnOnPWR_C3W ; Vcc=5V 
SetCtrlPort_W27_nCE_C3W
  
  rcall SetAdrBusOut
  rcall SetDB_As_Input
 
 clr        CS1      
 clr        CS2
 clr        CS3
 mov        XH, ADDR_HI ;  XH:XL max size   
 mov        XL, ADDR_LOW
 clr        YH
 clr        YL
                
 
                             
 rcall  Del_1ms
    
 
W27_CSNext27:
     
SetCtrlPort_W27_nCE_C3W
 rcall  Del_10t
 
 mov  AHtemp, YH  
 mov  ALtemp , YL 
 rcall SendAddr
     
 rcall Del_100mks 
ClearCtrlPort_W27_nCE_C3W
 
 rcall Del_100mks 
 rcall  ReadDataByte ; to the  temp0
 rcall Del_100mks 
 
SetCtrlPort_W27_nCE_C3W
  rcall Del_100mks                 
 
    clc  
    add     CS1, temp0
    clr     temp0
    adc     CS2, temp0
    adc     CS3, temp0
    clc      
 
    adiw    YH:YL, 1         
    sbiw    XH:XL, 1
    brne    W27_CSNext27
 
    mov     temp0, CMD
    rcall   SendChar
    ldi     temp0, 0
    rcall   SendChar
    mov     temp0, CS1
    rcall   SendChar
    mov     temp0, CS2
    rcall   SendChar
    mov     temp0, CS3
    rcall   SendChar
    mov     temp0, ADDR_HI
    rcall   SendChar
    mov     temp0, ADDR_LOW
    rcall   SendChar
 
    ret      
 
;-----------------------------------------------------------------
W27_WriteBuffer:
 
 CtrlPort_W27_TurnOnPWR_C3W 
 SetCtrlPort_W27_nCE_C3W
 CtrlPort_W27_C3W_TurnOffVppVpe
 
 rcall SetAdrBusOut
 rcall SetDB_As_Input
 
 ldi cntL, 32    
 rcall LoadInBuffer
 
 
 rcall Del_1ms
 ldi XL, low(BufferBegin)
 ldi XH, high(BufferBegin)
 mov YH, ADDR_HI
 mov YL, ADDR_LOW
 ldi cntL, 32
 ldi cntH, 3
 
W27_WBNext:
 ld temp0, X+
 mov VAL, temp0
W27_WBTryWrite:
     
 
mov temp0 , DB_temp
;set addr 
 mov  AHtemp,  YH    
 mov  ALtemp , YL
 rcall SendAddr
 
rcall SetDB_As_Output
rcall SendDataByte
 
 rcall Del_10t
 
 TurnOnVpp12V_W27_C3 ;set +12В Vpp
                         
 rcall Del_100mks
  
ClearCtrlPort_W27_nCE_C3W           ;
 rcall Del_100mks ; Vil pulse  100мкс
SetCtrlPort_W27_nCE_C3W 
 
 rcall Del_100mks
  
CtrlPort_W27_C3W_TurnOffVppVpe ; turn off +12В Vpp
 rcall Del_100mks
 
     rcall SetDB_As_Input
;    rcall SetDB_InputPullUp
ClearCtrlPort_W27_nCE_C3W   
 rcall Del_100mks
 
     rcall  ReadDataByte ;read DB to the  temp0
SetCtrlPort_W27_nCE_C3W
    cp      temp0, VAL
;   brne    W27_WBTry
    adiw    YH:YL, 1     ; Addr++
    dec  cntL  ; if not last byte 
    brne    W27_WBNext  ; if Z <>1  next byte 
    ldi     temp0, 0
W27_WBErr:
    rcall   SendChar
    rcall   SendChar
    ret
W27_WBTry:
    mov  temp0, VAL
    dec  cntH
    breq    W27_WBTryWrite
    ldi  temp0, 0x77 
    rjmp    W27_WBErr
;-----------------------------------------------------------------
 
 
 
 
 
 
W27C512_EraseSub_1:
 
 
 
 CtrlPort_W27_TurnOnPWR_C3W  ; Vcc=5V
 SetCtrlPort_W27_nCE_C3W     ;  nCE=1
 
TurnOnVpe14V_W27_C3   ; turn on +14V  on nOE/Vpp  
        
 rcall SetAdrBusOut
 
                              
                           
 
  clr YH
  clr YL
;set addr 
 mov  AHtemp,  YH    
 mov  ALtemp , YL
 rcall SendAddr
 
  rcall Del_10t  
 
 
 rcall SetDB_As_Output 
 
 ldi  temp0, 0xff
 mov temp0 , DB_temp
 rcall SendDataByte ; set DB=0xFF
  
 
rcall Del_100mks
                              
ClearCtrlPort_W27_nCE_C3W 
 rcall  Del_100mks  ; pulse nCE=0 100us
SetCtrlPort_W27_nCE_C3W 
 
rcall Del_100mks
TurnOffVpe_W27_C3   ; turn off Vpe
 rcall  Del_10t
TurnOff_nOEVppW27_C3  ; turn off Vpe,Vpp
rcall Del_100mks
 
 
 ldi        XH, 0xff  ;   
 ldi        XL,  0xff ;  
 clr        YH
 clr        YL
                  
rcall SetDB_As_Input
;rcall SetDB_InputPullUp
 
    rcall   Del_1ms
     
    
W27C512_ICNext27_Erase :
    
SetCtrlPort_W27_nCE_C3W 
  rcall Del_10t
 
 mov  AHtemp,  YH    
 mov  ALtemp , YL
 rcall SendAddr
 rcall SetDB_As_Input
 
 
rcall Del_100mks
ClearCtrlPort_W27_nCE_C3W
rcall Del_100mks
 rcall  ReadDataByte ; to the  temp0
rcall Del_100mks
SetCtrlPort_W27_nCE_C3W 
 
    cpi  temp0, 0xFF
    brne    W27C512_NotClear27_Erase    
    adiw    YH:YL, 1     
    sbiw    XH:XL, 1
    brne    W27C512_ICNext27_Erase 
    ldi  temp2, 0x43    ;   clear 
 
W27C512_ICEnd27_Erase :
                  
    mov     VAL, temp0
    mov     temp0, temp2 
    rcall   SendChar
    mov     temp0, YH
    rcall   SendChar
    mov     temp0, YL
    rcall   SendChar
    mov     temp0, VAL
    rcall   SendChar
    ret 
 
 W27C512_NotClear27_Erase :
    ldi             temp2, 0x44  ; not clear 
    rjmp    W27C512_ICEnd27_Erase 
 ret
     
 
 
 
W27C512_EraseSub:
                             
                       
 rcall W27C512_EraseSub_1
 rcall  Power_Off_Sub1
 ret
Добавлено через 1 минуту
Основной файл может быть следующим :
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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
 .include "m8Adef.inc"
 
 
 
 
 
.equ    nCE     = 4 
.equ    Vpe     = 5 ; 
.equ    nOE     = 6 ;
.equ    nPWR        = 7
 
.equ PowerFlag  =0; 
 
.equ    StackBegin      =RAMEND                 ;?????? ?????
.equ    InitBaudRate    =3              ; 7372800/16/115200-1   ;UART on 115200
;.equ   InitBaudRate    =5              ;11059200/16/115200-1   ;UART on 115200
 
;???????? ?????????? ?? ?????
.equ    CMD_SENDID           =0x69
.equ    CMD_POWER            =0x50
 
 ;.equ  CMD_AT24READPAGEBIG      =0x53
;.equ   CMD_AT24WRITEBUFFERBIG   =0x01
;.equ   CMD_AT24ISCLEARBIG       =0x3F
;.equ   CMD_AT24READPAGESMALL    =0x54
;.equ   CMD_AT24WRITEBUFFERSMALL =0x02
;.equ   CMD_AT24GETCSBIG         =0x4B
;.equ   CMD_AT24GETCSSMALL       =0x4A
;.equ   CMD_AT24ISCLEARSMALL     =0x3E
 
 
 
 
 
 
 
.equ CMD_W27C512_ERASESUB = 0x78 ; 'x'
 
 
.equ CMD_W27C512_WRITEBUFFER = 0x70 ; 'p'
.equ CMD_M27512_WRITE = 0x77 ;  'w'
.equ CMD_M27256_WRITE = 0x82 ;  
.equ CMD_M27128_WRITE = 0x88 ;  
.equ CMD_M2764_WRITE  = 0x86 ;    
.equ CMD_M2732_WRITE  = 0x84 ;  
.equ CMD_M2716_WRITE  = 0x81 ; 
.equ CMD_M2708_WRITE  = 0x80 ; 
 
 
 
.equ CMD_W27C512_ISCLEAR = 0x6E;  'n'
.equ CMD_M27512_ISCLEAR_C3 =0x2F; '/'
.equ CMD_M27256_ISCLEAR_C2 =0x2E; '.'
.equ CMD_M27128_ISCLEAR_C1 =0x2D; '-'
.equ CMD_M2764_ISCLEAR_C1  =0x2C;  
.equ CMD_M2732_ISCLEAR_C3  =0x2B;
.equ CMD_M2716_ISCLEAR_C0  =0x2A;  
.equ CMD_M2708_ISCLEAR_C00 =0x29;
 
 
 
 
.equ CMD_W27C512_GETCS_C3  = 0x6C ;    'l'
.equ CMD_M27512_GETCS_C3 = 0x4C ;   'L'
.equ CMD_M27256_GETCS_C2 = 0x4D ;  'M'
.equ CMD_M27128_GETCS_C1 = 0x4E;   'N'
.equ CMD_M2764_GETCS_C1 = 0x49;     'I'
.equ CMD_M2732_GETCS_C3 = 0x48;    'H'
.equ CMD_M2716_GETCS_C0 = 0x4F ;  'O'
.equ CMD_M2708_GETCS_C00 = 0x45 ;  'E'
 
 
.equ CMD_W27C512_READPAGE = 0x52;   'R'
.equ CMD_M27512_READPAGE_C3 = 0x72 ; 'r'
.equ CMD_M27256_READPAGE_C2 = 0x73 ;  's'
.equ CMD_M27128_READPAGE_C1 = 0x74 ; 't'
.equ CMD_M2764_READPAGE_C1 = 0x64 ;  'd' 
.equ CMD_M2732_READPAGE_C3 =  0x62 ;  'b'
.equ CMD_M2716_READPAGE_C0 = 0x75 ; 'u'
.equ CMD_M2708_READPAGE_C00 = 0x71 ; 'q'
 
 
.equ CMD_ROM27256_READPAGE_C2a = 0x5D ; 
.equ CMD_ROM27256_ISCLEAR_C2a =0x6F;
.equ CMD_ROM27256_GETCS_C2a = 0x6D;
 
 
 
.equ CMD_ROMRT7_READPAGE = 0xC7  
.equ CMD_ROMRT5_READPAGE = 0xC5 
.equ CMD_ROMRT4_READPAGE = 0xC4 
.equ CMD_ROM155RE3_READPAGE = 0xCE 
 
.equ CMD_ROMRT7_ISCLEAR  =0xA7 ;
.equ CMD_ROMRT5_ISCLEAR  =0xA5 ;
.equ CMD_ROMRT4_ISCLEAR  =0xA4 ;
.equ CMD_ROM155RE3_ISCLEAR =0xAE ;
 
.equ CMD_ROMRT7_GETCS  = 0xB7;
.equ CMD_ROMRT5_GETCS  = 0xB5;  
.equ CMD_ROMRT4_GETCS  = 0xB4;  
.equ CMD_ROM155RE3_GETCS = 0xBE;  
 
 
;.equ CMD_ROMRT7_WRITE  = 0x97;
;.equ CMD_ROMRT5_WRITE  = 0x95;  
;.equ CMD_ROMRT4_WRITE  = 0x94;  
;.equ CMD_ROM155RE3_WRITE  = 0x9E;  
 
 
 
 
 
 
;????????
 
;.def CS1 =R0
;.def CS2 =R1
;.def CS3 =R2
 
.def CS1 =R3 ;temporary register
.def CS2 =R4 ;temporary register
.def CS3 =R5 ;temporary register
 
.def CntL_tmp =R6 ;
.def CntH_tmp =R7 ;
 
; .def temp5 =R8
 ;.def temp6 =R9
.def PowerReg =R10
.def AHtemp =R11
.def ALtemp =R12
.def DB_temp =R13
 .def tmpbyte =R14
;.def TmpSREG =R15
 
 
.def temp0 =R16     ;temporary register
.def temp1   =R17       ;temporary register
.def temp2   =R18       ;temporary register
.def cntL =R19      ;temporary register
.def cntH =R20      ;temporary register
 
 
;CMD ADDR_HI ADDR_LOW VAL RSV ADR SUMM
.def    ADR  =R21       ;??????????????? ????? ?.??
.def    CMD =R22        ;???????
.def    VAL =R23        ;???????? ??? ??????/??????
.def    ADDR_LOW =R24       ;?????, ??????? ????
.def    ADDR_HI  =R25       ;?????, ??????? ????
;r26    XH
;r27    XL
;r28    YH
;r29    YL
;r30    ZH
;r31    ZL
 
 
.macro  jmpeq
    cpi     @0, @1
    brne    PC+2
    rjmp    @2
.endmacro
 
 
 
 
    .dseg
    .org    0x60
BufferBegin:     .byte    64
 
;------------------------------------------------------------------------------------------
;********************************************************************
;* Interrupt table  ;ENG;* Interrupt table
;********************************************************************
.cseg
;------------------------------------------------------------------------------------------
.org 0x000                      ;reset
    rjmp    Reset
   
 
;------------------------------------------------------------------------------------------
 
.org 0x025
Reset:      
    ;????????????? ??????????, ?????
    ldi     temp0, HIGH(StackBegin) ;????????? ????? ?? ????? ??????
    out     SPH, temp0
    ldi     temp0, LOW(StackBegin)
    out     SPL, temp0    
    rcall   PortInit
                  rcall           UART_Init      
                  rcall Del_100mks  
                  rjmp Main;
                  
;---------------------------------------------------------------
 
 
 
.include "M8a_powerio.asm"
 
 
 
PortInit:
    ;  PORTA=0,   PORTB,PORTC,PORTD=255
 
rcall ControlInit
rcall IOP_init
 
 TurnOffVppVpe
 TurnOffICPower; turn off Vcc ic
 cbi PORTD, nCE  ;  safe level without Vcc of the IC 
 
 
  ldi  temp0 ,  0x00
  mov  PowerReg, temp0    
 
 ret
 
 
 
 
 
 
 
 
;Main program
Main:
 
 
 
 
 rcall GetChar
 mov CMD, temp0
 rcall GetChar
 mov ADDR_HI, temp0
 rcall GetChar
 mov ADDR_LOW, temp0
 rcall GetChar
 mov VAL, temp0
  rcall GetChar
 mov ADR, temp0
 rjmp Menu
 
 
 
 
Menu:                  
    ; parse command  ( first byte )
 
 jmpeq  CMD, CMD_SENDID, SendDeviceID
 jmpeq  CMD, CMD_POWER, Power
     
 
           
  jmpeq  CMD,  CMD_ROM27256_READPAGE_C2a ,   DoROM27256_ReadPageC2a
  jmpeq  CMD,  CMD_ROM27256_ISCLEAR_C2a ,   DoROM27256_IsClear_C2a
  jmpeq  CMD,  CMD_ROM27256_GETCS_C2a  ,   DoROM27256_GetCS_C2a
 
 
 
; jmpeq  CMD, CMD_ROMRT7_READPAGE  , DoPROMRT7_ReadPage
 ;jmpeq  CMD, CMD_ROMRT5_READPAGE  , DoPROMRT5_ReadPage
 ;jmpeq  CMD, CMD_ROMRT4_READPAGE  , DoPROMRT4_ReadPage
; jmpeq  CMD, CMD_ROM155RE3_READPAGE , DoPROM155RE3_ReadPage
 
; jmpeq  CMD, CMD_ROMRT7_ISCLEAR , DoPROMRT7_IsClear
; jmpeq  CMD, CMD_ROMRT5_ISCLEAR , DoPROMRT5_IsClear
; jmpeq  CMD, CMD_ROMRT4_ISCLEAR , DoPROMRT4_IsClear 
; jmpeq  CMD, CMD_ROM155RE3_ISCLEAR,  DoPROM155RE3_IsClear
 
; jmpeq  CMD, CMD_ROMRT7_GETCS  , DoPROMRT7_GetCS
; jmpeq  CMD, CMD_ROMRT5_GETCS  , DoPROMRT5_GetCS
; jmpeq  CMD, CMD_ROMRT4_GETCS  , DoPROMRT4_GetCS 
; jmpeq  CMD, CMD_ROM155RE3_GETCS , DoPROM155RE3_GetCS   
 
 
; jmpeq  CMD, CMD_ROMRT7_WRITE  , DoPROMRT7_WRITE
; jmpeq  CMD, CMD_ROMRT5_WRITE  , DoPROMRT5_WRITE
; jmpeq  CMD, CMD_ROMRT4_WRITE , DoPROMRT4_WRITE
; jmpeq  CMD, CMD_ROM155RE3_WRITE , DoPROM155RE3_WRITE   
 
 
       jmpeq  CMD, CMD_W27C512_READPAGE    , DoW27C512ReadPageC3 ; C3
       jmpeq  CMD,  CMD_M27512_READPAGE_C3   ,   DoM27512_ReadPageC3  ; C3
       jmpeq  CMD,  CMD_M27256_READPAGE_C2   ,   DoM27256_ReadPageC2  ; C2    
       jmpeq  CMD,  CMD_M27128_READPAGE_C1   ,   DoM27128_ReadPageC1 ; C1
       jmpeq  CMD,  CMD_M2764_READPAGE_C1   ,   DoM2764_ReadPageC1 ; C1
       jmpeq  CMD,  CMD_M2732_READPAGE_C3   ,   DoM2732_ReadPageC3 ; C3
       jmpeq  CMD,  CMD_M2716_READPAGE_C0   ,   DoM2716_ReadPageC0 ; C0
       jmpeq  CMD,  CMD_M2708_READPAGE_C00 ,   DoM2708_ReadPageC00
 
 
       jmpeq   CMD, CMD_W27C512_GETCS_C3  ,  DoW27C512GetCS_C3
      jmpeq   CMD,  CMD_M27512_GETCS_C3  ,  DoM27512_GetCS_C3
      jmpeq   CMD,  CMD_M27256_GETCS_C2  ,  DoM27256_GetCS_C2
     jmpeq   CMD,  CMD_M27128_GETCS_C1  ,  DoM27128_GetCS_C1
      jmpeq   CMD,  CMD_M2764_GETCS_C1  ,  DoM2764_GetCS_C1
      jmpeq   CMD,  CMD_M2732_GETCS_C3  ,  DoM2732_GetCS_C3
      jmpeq   CMD,  CMD_M2716_GETCS_C0  ,  DoM2716_GetCS_C0
     jmpeq   CMD,  CMD_M2708_GETCS_C00  ,  DoM2708_GetCS_C00
 
       jmpeq   CMD, CMD_W27C512_ISCLEAR  ,  DoW27C512IsClear_C3     
        jmpeq   CMD, CMD_M27512_ISCLEAR_C3 ,  DoM27512_IsClear_C3
        jmpeq   CMD, CMD_M27256_ISCLEAR_C2 ,  DoM27256_IsClear_C2
        jmpeq   CMD, CMD_M27128_ISCLEAR_C1 ,  DoM27128_IsClear_C1
        jmpeq   CMD, CMD_M2764_ISCLEAR_C1 ,    DoM2764_IsClear_C1   
        jmpeq   CMD, CMD_M2732_ISCLEAR_C3 ,    DoM2732_IsClear_C3   
        jmpeq   CMD, CMD_M2716_ISCLEAR_C0 ,    DoM2716_IsClear_C0
        jmpeq   CMD, CMD_M2708_ISCLEAR_C00 ,  DoM2708_IsClear_C00
    
      jmpeq  CMD,  CMD_W27C512_ERASESUB  ,DoW27C512EraseSub
 
      jmpeq  CMD,  CMD_M27512_WRITE , DoM27512WriteC3  ; C3
      jmpeq  CMD,  CMD_M27256_WRITE , DoM27256WriteC2  ; C2    
      jmpeq  CMD,  CMD_M27128_WRITE , DoM27128WriteC1 ; C1
      jmpeq  CMD,  CMD_M2764_WRITE ,   DoM2764WriteC1 ; C1
      jmpeq  CMD,  CMD_M2732_WRITE ,   DoM2732WriteC3  ; C3 
      jmpeq  CMD,  CMD_M2716_WRITE ,  DoM2716WriteC0  ;C0
      jmpeq  CMD,  CMD_M2708_WRITE ,  DoM2708WriteC00  ;C00
 
   
    rjmp    UnknownCommand
 
 
;-----------------------------------------------------------------
 
 
 
;-----------------------------------------------------------------
DoErrR:
 ldi temp0, 0x55
 rcall SendChar
 rcall SendChar
 rcall SendChar
 rjmp Reset
;-----------------------------------------------------------------
DoErrW:
 ldi temp0, 0xAA
 rcall SendChar
 rcall SendChar
 rcall SendChar
 rjmp Reset
;-----------------------------------------------------------------
 
 
SendDeviceID:
 ldi ZH, high(DeviceID<<1)  ; pointer 
 ldi ZL, low(DeviceID<<1)
 ldi temp1, 20
 
SendDeviceID_1:
 
 lpm
 mov temp0, r0
 rcall SendChar
 adiw ZH:ZL, 1
 dec temp1
 brne SendDeviceID_1
 rjmp Main
;-----------------------------------------------------------------
UnknownCommand:
 
 rcall  PortInit
 
 mov temp1, temp0
 mov temp0, CMD
 rcall SendChar
 ldi temp0, 0x55
 rcall SendChar
 ldi temp0, 0x00
 rcall SendChar
 rcall SendChar
 rcall SendChar
 mov temp0, temp1
 rcall SendChar
 rjmp Main
 
 
 
 
;****************************************
;  cntL  bytes counter
LoadInBuffer:
    ldi     XL, low(BufferBegin)
    ldi     XH, high(BufferBegin)
GetNextByte:
    rcall   GetChar
    st      X+, temp0   ; 
    dec     cntL
    brne    GetNextByte
    ret
 
 
 
 
 
;-----------------------------------------------------------------
DeviceID:
    .db     "Multiprog M8a "
DeviceIDEnd:
;-----------------------------------------------------------------
 
.include "M8a_UART.asm"
.include "M8a_Delays.asm"
.include  "SIOsubs.asm"
 
.include "M8a_M27.asm"
.include "M8a_W27.asm"
 
.include "M8a_ROM27256.asm"
;;.include "M8a_roms82s.asm"
Добавлено через 1 минуту
M8a_powerio.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
.macro TurnOnICPower
 
cbi PORTD, nPWR ; turn on Vcc ic
.endmacro
 
.macro TurnOffICPower
 
sbi PORTD, nPWR ; turn off Vcc ic
.endmacro
 
 
.macro TurnOffVppVpe
 
 cbi PORTD, nOE  ; turn off Vpp
 cbi PORTD, Vpe   ; turn off Vpe
.endmacro
 
 
 
 
 
 
 
;--------------------------------------------------------------------------
 
 
Power_On_Sub:
 
 TurnOffVppVpe
 TurnOnICPower ; turn on  PWR       
 sbi  PORTD, nCE 
  ldi  temp2 ,  0x01
  mov  PowerReg, temp2      
ret
 
 
Power_Off_Sub: 
 
TurnOffVppVpe
TurnOffICPower  ; turn off  PWR  fix 
 cbi PORTD, nCE  
    
  ldi  temp2 ,  0x00
  mov  PowerReg, temp2    
 
ret
 
Power_Off_Sub1:
               
TurnOffVppVpe       
TurnOffICPower ; turn off  PWR  fix 
 cbi PORTD, nCE  
          
ret
 
 
 
 
;*******************************
 
Power:
 cpi VAL, 1 ; if value=1  branch to POW_ON
 breq POW_ON    
 
POW_OFF:
     
 rcall Power_Off_Sub
 rcall Del_10t
 ldi VAL, 1
 
  mov temp2, PowerReg
  cpi  temp2, 0x01 ; skip Val=0 if power flag =1 
  breq  PC+2       
  ldi VAL, 0
 rcall PortInit
 rjmp   PWN
 
POW_ON:
    
 rcall   Power_On_Sub  
 
 rcall Del_10t
 ldi VAL, 0
 mov   temp2, PowerReg ; skip Val:=1 if power flag =1 
 cpi  temp2, 0x01
 breq PC+2
 ldi VAL, 1
 
PWN:
 mov temp0, CMD
 rcall SendChar
 mov temp0, VAL
 rcall SendChar
 rcall SendChar
 rcall SendChar
 rjmp Main
M8a_UART.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
UART_Init:
 
; UART init 
; ldi temp0, 0b00011000 ; no interrupts , 8 bit
; out UCR, temp0
 ldi temp0, (1<<RXEN)|(1<<TXEN)
 out  UCSRB,temp0
    
 ; ldi temp0,    (1<<URSEL)|(1<<USBS)|(1<<UCSZ0)|(1<<UCSZ1) ; Set frame format: 8data, 2 stop bit 
 ldi temp0, (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1) ; Set frame format: 8data, 1 stop bit 
 out UCSRC,temp0
 
 clr temp0
 out UBRRH,temp0 ; baudrate (115200 baud)
 ldi temp0, InitBaudRate
 out UBRRL,temp0 ; baudrate (115200 baud)
ret
 
 
 
;-----------------------------------------------------------------
SendChar:
 
sbis UCSRA, UDRE ; wait  buffer empty
rjmp SendChar
out UDR, temp0 ; send byte
ret
 
;-----------------------------------------------------------------                                                                 
GetChar:
 sbis UCSRA,RXC ; wait char 
 rjmp GetChar
 in temp0, UDR  ; считываем символ
 clc
 sbic UCSRA, FE ; если ошибка, устанавливаем
 sec  ; флаг C
 ret
;-----------------------------------------------------------------
Добавлено через 41 секунду
M8a_Delays.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
Del_1s:
 
 ldi temp2, 0xFF
D2:
 rcall Del_1ms
 rcall Del_1ms
 rcall Del_1ms
 rcall Del_1ms
 dec temp2
 brne D2
 ret
 
;-----------------------------------------------------------------
Del_1ms:    ;delay ~ 1 мс (246 * 4.05mks for 7.3728MHz)
 ldi temp1, 0xF6
D1: 
 rcall Del_10t
 rcall Del_10t
 rcall Del_10t
 dec temp1
 brne D1
 clc
 ret
 
 
;-----------------------------------------------------------------
Del_100mks:      ; delay ~100 mks
 ldi temp1, 0x3D
D3:
rcall Del_10t
 dec temp1
 brne D3
 clc
 ret
;-----------------------------------------------------------------
delay_10t:
Del_10t:    ;delay 10 cycles- 1.35mks for  7.3728MHz  fix
    nop
    nop
    nop
    ret
;-----------------------------------------------------------------
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
14.11.2019, 00:00  [ТС]
SIOsubs.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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
;for ATMEGA8A  and 
;
;PB0=14=ADR_MOSI
;PB1=15=ADR_nOE
;PB2=16=ADR_nLATCH
;PB3=17=ADR_CLK
;PB4=18=DATA_nLATCH2 (ST_CP, 1= store, 0  = load data to latch)
;PB5=19=DATA_CLK2    (SH_CP, 0->1 shift)
;
;PC0=23=DATA_nOE (OE)
;PC1=24=DATA_MISO1  (first data port input)  
;PC2=25=DATA_nLATCH (ST_CP, 1= store, 0  = load data to latch)
;PC3=26=DATA_MOSI
;PC4=27=DATA_CLK1   (SH_CP, 0->1 shift)
;PC5=28=DATA_MISO2   (second data port input)
;
;
;PD5=11=nV
;PD6=12=nCS
;PD7=13=Vpp
;
;
;PD4=6=RD
;PD3=5=WR
;PD2=4=IORQ
;
 
 
.macro SendAddrBit                
                   
                 mov temp0 , @0 
                 andi  temp0 , @1
                 cpi  temp0, 0x00 
                 brne PC+2  
                 rcall @2
                 rjmp PC+3
                 rcall @3
                 nop                
                 rcall @4    
.endmacro 
 
 
.macro SendDataBit                
                 
                 mov temp0 , @0  ; load byte
                 andi  temp0 , @1 ; and with mask 
                 cpi  temp0, 0x00  ; compare with 0 
                 brne  PC+3 ; branch if temp0 <> 0 
                 rcall @2
                 rjmp PC+2
                 rcall @3
                 rcall @4
                                
                   
.endmacro 
 
 
.equ  DEVICE_ADR_PORT =PORTB
.equ  DEVICE_ADR_DDR  =DDRB
.equ  DEVICE_ADR_PIN  =PINB
  
 
.equ  DEVICE_ADR_MOSI =0 ; PB0  out
.equ DEVICE_ADR_nOE = 1  ; PB1 out
.equ DEVICE_ADR_nLD  =2  ; PB2 out
.equ  DEVICE_ADR_CLK  =3 ; PB3 out
 
.equ  DEVICE_DATA_PORT0 =PORTC
.equ  DEVICE_DATA_PIN0 = PINC
.equ  DEVICE_DATA_DDR0 = DDRC
 
.equ  DEVICE_DATA_PORT1 =PORTB
.equ  DEVICE_DATA_PIN1  =PINB
.equ  DEVICE_DATA_DDR1 = DDRB
 
 
  
 
.equ  DEVICE_DATA_nOEWR =0 ;PC0      // out   pin 23
.equ  DEVICE_DATA_MISO1  =1 ;PC1      // input pin 24
.equ DEVICE_DATA_nLATCH=2  ;PC2      // out   pin 25 
.equ DEVICE_DATA_MOSI   =3 ;PC3      // out   pin 26    
.equ DEVICE_DATA_CLK1   =4 ;PC4      // out   pin 27
.equ DEVICE_DATA_MISO2  =5 ; PC5      // input
 
.equ DEVICE_DATA_nLATCH2 =PB4 ;     // out , pin 18  
.equ DEVICE_DATA_CLK2    =PB5     ; // out , pin 19
 
.equ DEVICE_CONTROL_PORT= PORTD
.equ  DEVICE_CONTROL_DDR = DDRD
.equ  DEVICE_CONTROL_PIN  =PIND
 
 
 
;fix it 
.equ DEVICE_CONTROL_IORQ= PD2 
.equ DEVICE_CONTROL_RD   =PD3
.equ DEVICE_CONTROL_WR  = PD4
 
.equ DEVICE_CONTROL_nV   =PD5  //out , pin 11
.equ DEVICE_CONTROL_nCS =PD6 //out,  pin 12
.equ DEVICE_CONTROL_Vpp= PD7 //out , pin 13
 
 
 
 
 
 
 
 ControlInit:                                                
             ;   DDRD 0b11111100
             ldi temp0, 0xFC
             out DEVICE_CONTROL_DDR , temp0
              
              ldi temp0, 0x60
              out DEVICE_CONTROL_PORT ,temp0
 
 
 
  
 
 
        ret
 
 
 
 IOP_init:
 
 
;init 74HC595N address output port
;output
 
; out nOE adr, out clock,out data MOSI, out latch
 
  
ldi temp0, 0b00111111
out DEVICE_ADR_DDR, temp0
sbi DEVICE_ADR_PORT,DEVICE_ADR_nOE
sbi DEVICE_ADR_PORT,DEVICE_ADR_nLD
; set output low
cbi   DEVICE_ADR_PORT,DEVICE_ADR_CLK
cbi   DEVICE_ADR_PORT,DEVICE_ADR_MOSI    
                           
 
;init 74HC595N data output port
     
; out clock, out latch, out data MOSI, out data nOE_WR
 
sbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH
sbi DEVICE_DATA_PORT0, DEVICE_DATA_nOEWR
 
;set output low
cbi DEVICE_DATA_PORT0 ,DEVICE_DATA_CLK1 
cbi DEVICE_DATA_PORT0, DEVICE_DATA_MOSI 
;output
 
 
ldi temp0 , 0b00011101
out DEVICE_DATA_DDR0, temp0
     
 
; init 74HC165N data input port
    
 sbi  DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH
 cbi  DEVICE_DATA_PORT0, DEVICE_DATA_CLK1
 cbi DEVICE_DATA_PORT1, DEVICE_DATA_CLK2 
 sbi DEVICE_DATA_PORT1, DEVICE_DATA_nLATCH2
 
 ldi temp0, 0b00110000
 out DEVICE_DATA_DDR1, temp0 
    
;set MISO1, MISO2 low
cbi DEVICE_DATA_PORT0 ,DEVICE_DATA_MISO1 
cbi DEVICE_DATA_PORT0, DEVICE_DATA_MISO2 
ret
 
 
;---------------------------------------
 
 OfflineAddrLatch:
 sbi  DEVICE_DATA_PORT0, DEVICE_ADR_nOE 
 ret
 
AddressLatchEnable: 
 cbi  DEVICE_ADR_PORT,DEVICE_ADR_nOE 
ret
 
OfflineDataLatch:
sbi  DEVICE_DATA_PORT0, DEVICE_DATA_nOEWR 
ret 
 
DataLatchEnable: 
cbi  DEVICE_DATA_PORT0, DEVICE_DATA_nOEWR 
ret
 
LockData:
 
 cbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH 
 rcall delay_10t
 sbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH 
ret 
 
LockAddress:
cbi DEVICE_ADR_PORT, DEVICE_ADR_nLD 
rcall delay_10t
sbi DEVICE_ADR_PORT, DEVICE_ADR_nLD 
ret
 
SendCLK_ADR:
 
     
sbi  DEVICE_ADR_PORT , DEVICE_ADR_CLK 
rcall delay_10t
cbi DEVICE_ADR_PORT, DEVICE_ADR_CLK  
ret
 
 SendCLK1_DATA:
    
sbi  DEVICE_DATA_PORT0, DEVICE_DATA_CLK1  ;   get next
rcall delay_10t                   
cbi  DEVICE_DATA_PORT0, DEVICE_DATA_CLK1 
ret 
 
 SendCLK2_DATA:
    
sbi DEVICE_DATA_PORT1,DEVICE_DATA_CLK2  ;   get next
rcall delay_10t                    
cbi DEVICE_DATA_PORT1, DEVICE_DATA_CLK2 ;
ret
 
 
 
ClearAddrPort_MOSI:
cbi DEVICE_ADR_PORT, DEVICE_ADR_MOSI 
ret
 
SetAddrPort_MOSI:
sbi DEVICE_ADR_PORT, DEVICE_ADR_MOSI 
ret
 
 
ClearDataPort_MOSI:
cbi DEVICE_DATA_PORT0, DEVICE_DATA_MOSI 
ret
 
SetDataPort_MOSI:
sbi DEVICE_DATA_PORT0, DEVICE_DATA_MOSI 
ret
 
 
 
 
 
 
 
 ShiftByteAdr :
 
; LSB Last , to QA of chip 1
 
SendAddrBit   tmpbyte , 0x80, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x40, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x20, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x10, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x08, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x04, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x02, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
SendAddrBit   tmpbyte ,0x01, ClearAddrPort_MOSI,SetAddrPort_MOSI, SendCLK_ADR 
 
 ret
 
 ShiftByteDataOut:
 
 
SendDataBit    tmpbyte, 0x80 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x40 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x20 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x10 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x08 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x04 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x02 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
SendDataBit    tmpbyte, 0x01 , ClearDataPort_MOSI, SetDataPort_MOSI,SendCLK1_DATA 
 
ret
 
 
 
SendAddr:
      
    rcall OfflineAddrLatch 
 
     mov tmpbyte, AHtemp
              rcall     ShiftByteAdr   ; send A15-A8
                   mov tmpbyte, ALtemp
              rcall     ShiftByteAdr   ; send A7-A0 
     rcall LockAddress 
     rcall AddressLatchEnable 
ret
 
SendDataByte:
 
     rcall OfflineDataLatch 
                   mov  tmpbyte , DB_temp  ;   
     rcall ShiftByteDataOut ;  high byte first
     rcall LockData 
     rcall DataLatchEnable  ; SetDB_As_Output 
ret
 
 
ReadData_bit:
 
    ; rcall OfflineDataLatch  
rcall    delay_10t
                   clr temp0   ;  default 
                   sbic DEVICE_DATA_PIN0, DEVICE_DATA_MISO1
                   ldi temp0,0x01   ; skip if clear 
                
ret
 
 ReadData_bit1:
 
    ;  rcall OfflineDataLatch 
rcall     delay_10t 
      clr temp0
      sbic DEVICE_DATA_PIN0, DEVICE_DATA_MISO2 
                    ldi temp0,0x01   ; skip if clear
       
ret
 
;left shift << x << y all bits in x shifted left y bits
 
 
 
 
ReadDataByte:
 
    ;LSB last
     rcall OfflineDataLatch 
  
     cbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH ; 0 to 1 - load
rcall     delay_10t
rcall                    delay_10t
rcall                    delay_10t
     sbi DEVICE_DATA_PORT0, DEVICE_DATA_nLATCH ; 1 to PL - ready to shift
 
 
 
 
rcall ReadData_bit  ; 7
clr tmpbyte
or  tmpbyte, temp0       ; read 7 bit to bit 0  ,append tempbyte
 
rcall SendCLK1_DATA ; shift 
rcall ReadData_bit ; 6
rol tmpbyte ; shift left  ; previous bit  0->1
or  tmpbyte, temp0      ; read 6 bit to bit 0  ,append tempbyte
 
rcall SendCLK1_DATA  ; shift 
rcall ReadData_bit ; 5
rol tmpbyte ; shift left  ; previous bit 1->2
or  tmpbyte, temp0       ; read 5 bit to bit 0  ,append tempbyte
 
rcall SendCLK1_DATA
rcall ReadData_bit ; 4
rol tmpbyte ; shift left  ; previous bit  2->3
or  tmpbyte, temp0      ; read 4 bit to bit 0  , append tempbyte
 
 
rcall SendCLK1_DATA
rcall ReadData_bit ; 3 
rol tmpbyte ; shift left  previous bit  3->4
or  tmpbyte, temp0   ; read 3 bit to bit 0  , append tempbyte
 
 
 
 
rcall SendCLK1_DATA
rcall ReadData_bit; 2 
rol tmpbyte ; shift left ; previous bit  4->5
or  tmpbyte, temp0  ; read 2 bit to bit 0  , append tempbyte
 
rcall SendCLK1_DATA
rcall ReadData_bit ; 1
rol tmpbyte               ; shift left  previous bit  5->6
or  tmpbyte, temp0  ; read 1 bit to bit 0  , append tempbyte
rcall SendCLK1_DATA
rcall ReadData_bit ; 0 
rol tmpbyte ; shift left ; previous bit  6->7   
or  tmpbyte, temp0    ; read 0 bit to bit 0  , append tempbyte    Ok
rcall OfflineDataLatch 
mov temp0 ,  tmpbyte
 
 ret
 
 
 ReadDataByte1:
  
    ; LSB last
     rcall OfflineDataLatch 
     
 
     cbi  DEVICE_DATA_PORT1,DEVICE_DATA_nLATCH2 ;   0 to 1 - load
rcall    delay_10t;
rcall                   delay_10t;
rcall                   delay_10t;  
     sbi DEVICE_DATA_PORT1, DEVICE_DATA_nLATCH2 ;   1 to PL - ready to shift
      
 
 
rcall ReadData_bit1  ; 7
clr tmpbyte
or  tmpbyte, temp0       ; read 7 bit to bit 0  ,append  byte
 
rcall SendCLK2_DATA; shift 
rcall ReadData_bit1 ; 6
rol tmpbyte ; shift left  ; previous bit  0->1
or  tmpbyte, temp0      ; read 6 bit to bit 0  ,append  byte
 
rcall SendCLK2_DATA  ; shift 
rcall ReadData_bit1 ; 5
rol tmpbyte ; shift left  ; previous bit 1->2
or  tmpbyte, temp0       ; read 5 bit to bit 0  ,append  byte
 
rcall SendCLK2_DATA
rcall ReadData_bit1 ; 4
rol tmpbyte ; shift left  ; previous bit  2->3
or  tmpbyte, temp0      ; read 4 bit to bit 0  , append  byte
 
 
rcall SendCLK2_DATA
rcall ReadData_bit1 ; 3 
rol tmpbyte ; shift left  previous bit  3->4
or  tmpbyte, temp0   ; read 3 bit to bit 0  , append  byte
 
rcall SendCLK2_DATA
rcall ReadData_bit1; 2 
rol tmpbyte ; shift left ; previous bit  4->5
or  tmpbyte, temp0  ; read 2 bit to bit 0  , append  byte
 
rcall SendCLK2_DATA
rcall ReadData_bit1 ; 1
rol tmpbyte               ; shift left  previous bit  5->6
or  tmpbyte, temp0  ; read 1 bit to bit 0  , append  byte
rcall SendCLK2_DATA
rcall ReadData_bit1 ; 0 
rol tmpbyte ; shift left ; previous bit  6->7   
or  tmpbyte, temp0    ; read 0 bit to bit 0  , append  byte    Ok
 
 
 
rcall OfflineDataLatch 
mov temp0 ,  tmpbyte
 
 
ret
  
 
;*****************************************
 
SetDB_As_Input:
 rcall OfflineDataLatch 
ret 
 
 
SetDB_As_Output : 
rcall  DataLatchEnable 
ret
 
 
 
SetAdrBusOut:
; rcall AddressLatchEnable:
 
ret
Добавлено через 1 минуту
M8a_ROM27256.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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
;for 563RE2-020
;.equ   ROM_AHPortDir     =DDRB
;.equ   ROM_AHPort    =PORTB
;.equ   ROM_ALPortDir   =DDRC
;.equ   ROM_ALPort  =PORTC
 
;.equ   ROM_DataInPort  = PINA
;.equ   ROM_DataOutPort    =PORTA
;.equ   ROM_DataDir     =DDRA 
 
 
 
 
.equ  ROM_CtrlPort  =PORTD
.equ  ROM_CtrlPortDir  =DDRD
 
 
.equ nCS_C2a =4  ;  pin  20,   nE 
.equ nOE_C2a =5  ;  pin 22  ; jumper to TTL   // log 0  nG
.equ Vt_C2a  =6    ;   pin 1   jumper  to  TTL  switch ,  log 0    
.equ PWR_C2a  =7   ; inverse 
 
; pin27 log 1  A14
 
 
 
 
 
 
.macro SetROM_CtrlPort_Vt_C2a 
 sbi ROM_CtrlPort , Vt_C2a 
.endmacro
 
.macro ClearROM_CtrlPort_Vt_C2a 
cbi ROM_CtrlPort , Vt_C2a 
.endmacro
 
.macro CtrlPort_PWR_C2a 
sbi ROM_CtrlPort , PWR_C2a
.endmacro
 
.macro ClearROM_CtrlPort_PWR_C2a 
cbi ROM_CtrlPort , PWR_C2a
.endmacro
 
.macro SetROM_CtrlPort_nOE_C2a  
 sbi ROM_CtrlPort , nOE_C2a 
.endmacro
 
.macro ClearROM_CtrlPort_nOE_C2a  
 cbi ROM_CtrlPort , nOE_C2a 
.endmacro
 
.macro SetROM_CtrlPort_nCS_C2a 
 sbi ROM_CtrlPort , nCS_C2a
.endmacro
 
.macro ClearROM_CtrlPort_nCS_C2a 
 cbi ROM_CtrlPort , nCS_C2a
.endmacro
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 DoROM27256_ReadPageC2a:
 
                  rcall          ROM27256_ReadPageC2a
    rjmp    Main
 
DoROM27256_IsClear_C2a:
 
                   rcall          ROM27256_IsClear_C2a
     rcall Power_Off_Sub1 
     rjmp   Main
 
DoROM27256_GetCS_C2a:
 
 rcall ROM27256_GetCS_C2a
 rcall Power_Off_Sub1
 rjmp   Main
 
 
 
;--------------------------------------
 
ROM27256_ReadPageC2a:
;32768 bytes ,0000-7FFF
; read   nOE(pin 22)=0 (to GND) , nCS(pin 20)=0,  Vt(pin 1)=0 
; HI-Z   nOE(pin 22)=0/1 , nCS(pin 20)=1,    Vt(pin 1)=0 
 
 
 ClearROM_CtrlPort_Vt_C2a ; pin 1=0 in safe mode 
 ClearROM_CtrlPort_PWR_C2a ; Vcc=5V  
 ClearROM_CtrlPort_nOE_C2a; 22 
 SetROM_CtrlPort_nCS_C2a ; 20 
 
      
 rcall SetAdrBusOut
 rcall SetDB_As_Input
                        
             
 rcall Del_1ms                  
 
ROM27256_RPNextC2a:
 
 
 
 mov  AHtemp, ADDR_HI    
 mov  ALtemp , ADDR_LOW
 rcall SendAddr
 
 
 rcall Del_10t
 ClearROM_CtrlPort_Vt_C2a ; pin 1=0 in safe mode 
 ClearROM_CtrlPort_nOE_C2a ; pin 22  =0  
 SetROM_CtrlPort_nCS_C2a  ; pin 20  =1
     
     
                    
 rcall Del_100mks 
 ClearROM_CtrlPort_nOE_C2a ; pin 22  =0  
 ClearROM_CtrlPort_nCS_C2a  ; pin 20  =0 
 rcall Del_100mks ; 
 
 rcall  ReadDataByte ; to the  temp0
  
 
 ClearROM_CtrlPort_nOE_C2a ; pin 22  =0      
 SetROM_CtrlPort_nCS_C2a  ; pin 20  =1
 rcall Del_10t
 rcall SendChar      
    
 
 cpi ADDR_LOW, 0xFF
 breq ROM27256_RPEndC2a
 inc ADDR_LOW       ; Addr++
 rjmp ROM27256_RPNextC2a
 ROM27256_RPEndC2a:
    ret
 
 
;-----------------------------------------------
 
 
ROM27256_IsClear_C2a:
;32768 bytes ,0000-7FFF
;ROM27256
; read   nOE(pin 22)=0 (to GND) , nCS(pin 20)=0,  Vt(pin 1)=0 
; HI-Z   nOE(pin 22)=0/1 , nCS(pin 20)=1,    Vt(pin 1)=0 
 
 
 
     ClearROM_CtrlPort_Vt_C2a ; pin 1=0 in safe mode 
     ClearROM_CtrlPort_PWR_C2a ; Vcc=5V  
     ClearROM_CtrlPort_nOE_C2a ; 22 
     SetROM_CtrlPort_nCS_C2a  ; 20 
 
 mov XH, ADDR_HI ;  
 mov XL, ADDR_LOW ;  
 clr YH
 clr YL
      
rcall SetDB_As_Input    
rcall SetAdrBusOut
     
 
 
 
 rcall Del_1ms
     
ROM27256_ICNext27_C2a:   ; reading 
 
 rcall Del_10t
 
 
 mov  AHtemp, YH  
 mov  ALtemp , YL 
 rcall SendAddr
 
 
 
 
 ClearROM_CtrlPort_Vt_C2a ; pin 1=0 in safe mode 
 ClearROM_CtrlPort_nOE_C2a ; 22  =0  
 SetROM_CtrlPort_nCS_C2a  ; 20  =1
 
 rcall Del_100mks
              
 ClearROM_CtrlPort_nOE_C2a ; pin 22  =0  
 ClearROM_CtrlPort_nCS_C2a  ; pin 20  =0  
 
  rcall Del_100mks
 
  rcall  ReadDataByte ; to the  temp0
  
 
 rcall Del_100mks
 
 ClearROM_CtrlPort_nOE_C2a ; pin 22  =0  
 SetROM_CtrlPort_nCS_C2a  ; pin 20  =1  
 
 
 cpi temp0, 0xFF
 brne ROM27256_NotClear27_C2a   
 adiw YH:YL, 1      ; счетчик адреса
 sbiw XH:XL, 1
 brne ROM27256_ICNext27_C2a
 ldi temp2, 0x43   ;  clear 
 
ROM27256_ICEnd27_C2a:
                   
    mov VAL, temp0
    mov temp0, temp2 
    rcall SendChar
    mov temp0, YH
    rcall SendChar
    mov temp0, YL
    rcall SendChar
    mov temp0, VAL
    rcall SendChar
    ret  
ROM27256_NotClear27_C2a:
    ldi temp2, 0x44  ; not clear
    rjmp ROM27256_ICEnd27_C2a
;-----------------------------------------------------------------
 
 
 
 
ROM27256_GetCS_C2a:
 
;32768 bytes ,0000-7FFF
;ROM27256
; read   nOE(pin 22)=0 (to GND) , nCS(pin 20)=0,  Vt(pin 1)=0 
; HI-Z   nOE(pin 22)=0/1 , nCS(pin 20)=1,    Vt(pin 1)=0 
                 
                 
 
     ClearROM_CtrlPort_Vt_C2a ; pin 1=0 in safe mode 
     ClearROM_CtrlPort_PWR_C2a ; Vcc=5V  
     ClearROM_CtrlPort_nOE_C2a ; 22 
     SetROM_CtrlPort_nCS_C2a  ; 20 
 
 
    clr     CS1      
    clr     CS2
    clr     CS3
    mov     XH, ADDR_HI  
    mov     XL, ADDR_LOW
    clr     YH
    clr     YL
          
    rcall SetAdrBusOut
   rcall SetDB_As_Input         
   
         
    rcall   Del_1ms
    
 
ROM27256_CSNext27_C2a:      ;reading 
 rcall  Del_10t
 
 
 
 mov  AHtemp, YH  
 mov  ALtemp , YL 
 rcall SendAddr
 
 
 
 rcall  Del_10t
 ClearROM_CtrlPort_Vt_C2a ; pin 1=0 in safe mode 
 ClearROM_CtrlPort_nOE_C2a ; 22  =0  
 SetROM_CtrlPort_nCS_C2a  ; 20  =1
   
 rcall Del_100mks 
 ClearROM_CtrlPort_nOE_C2a ; 22  =0  
 ClearROM_CtrlPort_nCS_C2a  ; 20  =0
 rcall Del_100mks 
  rcall  ReadDataByte ; to the  temp0    
 rcall Del_100mks 
 ClearROM_CtrlPort_nOE_C2a ; 22  =0  
 SetROM_CtrlPort_nCS_C2a  ; 20  =1
                  
 
 clc     
 add CS1, temp0
 clr temp0
 adc CS2, temp0
 adc CS3, temp0
 clc      
 
 adiw YH:YL, 1       
 sbiw XH:XL, 1
 brne ROM27256_CSNext27_C2a
 
 
 
 mov temp0, CMD
 rcall SendChar
 ldi temp0, 0
 rcall SendChar
 mov temp0, CS1
 rcall SendChar
 mov temp0, CS2
 rcall SendChar
 mov temp0, CS3
 rcall SendChar
 mov temp0, ADDR_HI
 rcall SendChar
 mov temp0, ADDR_LOW
 rcall SendChar
 
 ret
Добавлено через 1 час 50 минут
С директивами org можно пока(если без прерываний) оставить по умолчанию , тогда массив данных не наезжает на код , потом уточнить .

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
    .dseg
    .org    0x060
BufferBegin:     .byte    64
 
;------------------------------------------------------------------------------------------
;********************************************************************
;* Interrupt table  ;ENG;* Interrupt table
;********************************************************************
.cseg
;------------------------------------------------------------------------------------------
.org 0x000                      ;reset
    rjmp    Reset
   
 
;------------------------------------------------------------------------------------------
 
Reset:      
    ;????????????? ??????????, ?????
    ldi     temp0, HIGH(StackBegin) ;????????? ????? ?? ????? ??????
    out     SPH, temp0
    ldi     temp0, LOW(StackBegin)
    out     SPL, temp0    
    rcall   PortInit
                  rcall           UART_Init      
                  rcall Del_100mks  
                  rjmp Main;
                  
;---------------------------------------------------------------
 
 
 
.include "M8a_powerio.asm"
 
 
 
PortInit:
    ;  PORTA=0,   PORTB,PORTC,PORTD=255
 
rcall ControlInit
rcall IOP_init
 
 TurnOffVppVpe
 TurnOffICPower; turn off Vcc ic
 cbi PORTD, nCE  ;  safe level without Vcc of the IC 
 
 
  ldi  temp0 ,  0x00
  mov  PowerReg, temp0    
 
 ret
 
 
 
 
 
 
 
 
;Main program
Main:
0
10 / 10 / 0
Регистрация: 29.06.2018
Сообщений: 1,536
14.11.2019, 02:17  [ТС]
Проверил , проект без записи РТ-шек и 24-х может поместиться в ATMEGA8A (до 60..70 % памяти ).
Вложения
Тип файла: zip multiprog_debug.zip (610.4 Кб, 12 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2019, 02:17

Как проверить исправность работы USBasp программатора?
Есть програматор. Не получаеться записать HEX файл на мк. Как убедиться что программатор виден для СинаПрог и может без ошибок записать...

512 оперативки и скорость работы приложений
Ребята, телефон LG E612, 512 оперативки. Можно ли как-нибудь его ускорить, отключив сторонние встроенные приложения с помощтю...

4850 512 vs 9800 gtx 512 vs 9800 gtx+512 vs gts250 512
ну вем привет кого не видел из темы всё понятно что предпочтительнее спасибо

Mavr, можно тебе вопрос?
А как в Access'е какому-нибудь контролу назначить свой курсор??? С TreeView разобрался: большое спасибо!

Производительность и безопасность железа, если ставить ОЗУ: 512 - 128 - 512
Отключается компьютер, принёс в магазин, где брал, они его почистили, начал работать, примерно недели ч/з 2-3 начинается опять, приходится...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru